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后,应用启动失败

(iOS) 从非 ascii 键捕获事件

当 iOS 应用程序从非活动/挂起状态被召回时,何时刷新视图

未运行状态下的远程通知处理

iOS如何在本地通知上启动后台任务

远程通知的后台任务在片​​刻后暂停