未启动应用程序时的handleActionWithIdentifier

Posted

技术标签:

【中文标题】未启动应用程序时的handleActionWithIdentifier【英文标题】:handleActionWithIdentifier when app isn't launched 【发布时间】:2016-05-14 10:23:28 【问题描述】:

我一直在使用交互式通知,当我的应用在后台挂起时效果很好,但在我的应用被终止时会出现问题。

我已经使用 NSLog 来确定应用程序未启动时触发交互式通知时的应用程序生命周期。

以下内容按列出的顺序继续,应用程序没有明显启动:

完成启动 handleActionWithIdentifier 查看didload viewwilllayoutsubviews viewdidlayoutsubviews 看过了

然后应用程序似乎在没有调用的情况下终止 didenterbackground 或 willTerminate

它对我造成问题的原因是因为我在 viewdidload 中创建了在 didenterbackground 中无效的计时器。

因为没有调用 didenterbackground,所以当应用程序在触发交互式通知后随后启动时,我将得到两个计时器实例。

有人能解释一下为什么应用程序终止但没有调用 didenterbackground 或 willTerminate 吗?

【问题讨论】:

因为你的应用是直接在后台启动的。它不会从前台过渡到后台 【参考方案1】:

您不应该假设对 didfinishlaunching 的调用意味着您在前台。正如@PaulW11 在他的评论中所说,对于您的应用程序未运行时的本地通知,您会直接启动到后台,并且永远不会看到前台到后台的转换,因为您从一开始就没有在前台。

如果您被启动到前台,系统将调用applicationDidBecomeActive:。您应该将启动计时器的代码放在那里。

文档说本地通知通知在后台被调用:

当用户点击远程或本地警报中的自定义操作时 通知的,系统调用 应用程序:handleActionWithIdentifier:forRemoteNotification:completionHandler: 或者 应用程序:handleActionWithIdentifier:forLocalNotification:completionHandler: 方法在后台,以便您的应用程序可以执行相关的 行动。

您应该编写application:handleActionWithIdentifier:forLocalNotification:completionHandler: 方法来检查它是从前台调用还是从后台调用。

我使用这样的(Objective-C)代码来判断我是在前台还是后台:

BOOL inBackground = [UIApplication sharedApplication].applicationState == UIApplicationStateBackground;

【讨论】:

以上是关于未启动应用程序时的handleActionWithIdentifier的主要内容,如果未能解决你的问题,请参考以下文章

应用程序未运行时的 Windows Phone 7 推送通知

启动 SonarQube 7.1 Web 服务器时的问题

Apache 正在运行但 MySQL 未启动 - WAMP

删除未命中的路线

通过Jenkins自动构建dubbo服务时的问题汇总

应用程序未运行时的本地通知