iOS 从非运行状态启动应用程序后处理通知
Posted
技术标签:
【中文标题】iOS 从非运行状态启动应用程序后处理通知【英文标题】:iOS Handle notifications after starting app from not-running state 【发布时间】:2012-09-05 07:22:23 【问题描述】:我一直在尝试在我的应用中处理接收通知,但它并没有真正奏效。
当我使用didReceiveLocalNotification:(UILocalNotification *)notification
时。我可以接收和使用用于进入应用程序的通知,没有任何问题
但是,只有当应用程序已经运行(活动、非活动、后台和可能暂停,但我还没有尝试过)时才会触发此函数。
现在,有这个函数didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
,您可以在其中使用[launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey]
,它会返回一个UILocalNotification。
但是,当您从 not-running 状态启动应用程序时,不会触发此事件。然后 LocalNotification 会打开应用程序,但我无法以任何方式使用它。
现在,我的问题是:我怎样才能让它工作,以便我可以在启动应用程序时接收和处理通知,从通知,当应用程序处于非运行状态时?是也许我在这里做错了什么?
这是我的应用程序中的一些示例代码:
首先,didFinishLaunchingWithOptions
函数,不幸的是它不起作用。函数[sharedLocalNotificationsInstance processNotification:notification]
永远不会启动...
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
LocalNotificationsController *sharedLocalNotificationsInstance = [LocalNotificationsController sharedLocalNotificationsInstance];
[sharedLocalNotificationsInstance checkNotifications];
UILocalNotification *notification = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
if ( notification != nil )
// Process the received notification
[sharedLocalNotificationsInstance processNotification:notification];
application.applicationIconBadgeNumber = 0;
return YES;
还有第二段代码:didReceiveLocalNotification 函数,完美运行:我收到通知,[sharedLocalNotificationsInstance processNotification:notification] 运行完美。
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
// Used when the application launches from a notification
LocalNotificationsController *sharedLocalNotificationsInstance = [LocalNotificationsController sharedLocalNotificationsInstance];
// Process the received notification
[sharedLocalNotificationsInstance processNotification:notification];
【问题讨论】:
嗨拉尔斯克。我有同样的问题。当应用程序处于前台或后台时,我可以收到通知,但是当应用程序关闭时会发生有趣的事情。我点击通知,应用程序打开,在屏幕上停留 1 秒钟然后屏幕变黑。我在后台看到应用程序,但没有收到通知的迹象。我真的不确定 UILocalNotification* notification = (UILocalNotification*)[launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];工作与否。您是否找到了可靠的解决方案? 【参考方案1】:这就是 ios 处理本地通知的方式。这取决于您的应用程序的哪个状态,例如处于活动状态、在后台运行或尚未启动。 iOS 将调用 didFinishLaunchingWithOptions 或 didReceiveLocalNotification,或者根本不会触及您的应用。
请参阅这篇文章进行澄清 - http://www.thekspace.com/home/component/content/article/62-uilocalnotification-demystified.html
【讨论】:
感谢您的链接!不幸的是,该页面还说,当应用程序处于非运行状态时,该应用程序将启动 didFinishLaunchingWithOptions,不幸的是,它不会......至少据我所知。我现在想的是,它可能会做一些稍微不同的事情:启动应用程序,然后触发 didReceiveLocalNotification 事件。我仅在 applicationState = 1(活动)时对该事件进行编程以执行某些操作,但也许我需要改用它。我去看看! 如果您的应用程序没有运行,当本地通知发生并且用户激活通知时,iOS 将启动您的应用程序并通过 didFinishLaunchingWithOptions 传递通知对象。但是,如果用户没有激活通知,则什么都不会发生。 在 iOS7 中,当应用程序处于非活动状态时,我没有看到来自 iOS 的任何通知。设置了徽章,但是当点击进入图标应用程序时,没有调用任何函数。 当用户点击通知而不在委托中时,有没有办法处理本地通知?我想从本地通知中获取深层链接,但在 Delegate 中没有这样做,但我不知道这是否可能。【参考方案2】:<Matrix-Morpheus-Meme title="WHAT IF I TOLD YOU">
当应用程序由于用户点击本地通知警报而从“未运行”状态启动时,该应用程序已由 iOS 启动,而不是由 Xcode 启动,因此它没有在调试器下运行。您不能在其中设置断点,NSLog() 也不会向 Xcode 控制台发送任何内容。使用UIAlertController
进行测试。
</Matrix-Morpheus-Meme>
【讨论】:
以上是关于iOS 从非运行状态启动应用程序后处理通知的主要内容,如果未能解决你的问题,请参考以下文章
iOS,先强制退出应用,点击接收通知banner后,应用启动失败