UILocalNotification - 如何在App未运行时处理?

时间:2012-01-10 18:58:48

标签: ios uilocalnotification ios5

我现在已经在两个不同的应用程序中实现了UILocalNotifications。一个使用位置服务,这意味着如果它被杀死,它(通常)会重新启动(所以它不是一个大问题)。但是,在另一个应用中,我会根据时间安排UILocalNotification。在这种情况下,我遇到了一个重大问题。

如果我安排通知,那么应用程序会被杀死,推出内存不足,手机会关闭然后再打开,我无法在打开应用时“自动”查看旧通知。

以下是适用的工作流程(app在后台运行):

  1. 启动应用;应用程序时间表通知;关闭app;应用程序现在正在后台运行
  2. 接收本地通知;最初忽略它;从顶部拉下拉菜单(状态栏);触摸通知以启动应用
  3. 结果:应用程序会在通知中正确显示信息。
  4. 以下是工作的工作流程(app不再在后台运行):

    1. 启动应用;应用程序时间表通知;关闭app;应用程序现在正在后台运行
    2. 手动杀死app(模拟我的情况)
    3. 仍然收到本地通知;最初忽略它;从顶部拉下拉菜单(状态栏);触摸通知以启动应用
    4. 结果:应用启动,但未调用didReceiveLocalNotification方法。用户认为该应用程序不起作用 注意:我甚至无法手动强制显示信息,因为如果他们收到了多个通知,我无法分辨他们触摸的是哪一个,以便知道要显示哪一个。
    5. 当应用在后台运行时,有没有办法知道他们触及了哪个通知(因此没有运行didReceiveLocalNotification method)?

2 个答案:

答案 0 :(得分:16)

在第二种情况下,用户已退出(或杀死)该应用,因此当用户触摸该通知时,您的应用就会启动。

这可以在下面提到的appDelegate的方法

中处理 启动应用程序时会调用

didFinishLaunchingWithOptions,因此只需检查应用是否实际启动,因为用户触摸了通知(代码如下):

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    UILocalNotification *notification = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];

    if (notification) 
    {
        NSLog(@"notification caused app to launch, alert body = %@", notification.alertBody);
        // do what ever action you want to do
        // you could just copy the code from "didReceiveLocalNotification" and paste it here
    }

    return YES;
}

答案 1 :(得分:2)

@Ranjit,这将在用户点击应用图标时起作用,因为它是一个应用委托方法。每次应用程序完成启动时都会调用。 (不能评论,因为我缺乏声誉......;))