2012-01-10 54 views
9

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

如果我安排了一个通知,那么应用程序会死亡,内存不足,手机关闭,然后再次打开,我无法在打开应用程序时“自动”查看较早的通知。

这里是工作(应用程序在后台运行)的工作流程:

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

这里是不工作(应用程序不再在后台运行)的工作流程:

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

有没有办法知道他们感动时,应用程序是在后台运行(因此不运行didReceiveLocalNotification method)上的通知?

回答

15

在第二种情况下,用户已退出(或终止)应用程序,因此当用户触摸通知时,您的应用程序将启动。

这可以在下面提到的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

嗨,这将工作,只有当杀死应用程序后,用户点击通知,如果他直接点击应用程序图标,看看徽章,我们如何向他展示所需的VC。 – Ranjit 2013-11-25 07:27:50

+0

@ user1046037这对我不起作用。你知道这是为什么吗?'''didReceiveLocalNotification'''方法可行(但是应用程序正在运行时)。我似乎无法得到这个工作。 http://stackoverflow.com/questions/36246104/uiapplicationlaunchoptionslocalnotificationkey-always-null-ios – Supertecnoboff 2016-03-28 09:52:07

2

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

+0

没有williams它不会工作 – Ranjit 2013-12-20 06:17:06

+0

当图标点击启动应用程序时,UIApplicationLaunchOptionsLocalNotificationKey是零。必须点击通知本身。 – 2016-08-16 21:07:10

+0

有没有人找到这个解决方案? – 2016-11-23 13:25:54