未启动应用程序时的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的主要内容,如果未能解决你的问题,请参考以下文章