2016-05-14 75 views
0

我一直在使用交互式通知,它适用于当我的应用程序被挂起在后台,但当我的应用程序被终止时导致问题。handleActionWithIdentifier当应用程序未启动

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

以下的推移,在列出的顺序,而不应用明显启动:

didfinishlaunching handleActionWithIdentifier viewDidLoad中 viewwilllayoutsubviews viewdidlayoutsubviews viewdidappear

则APP似乎终止,而无需调用 didenterbackground或willTerminate

它之所以会导致m问题e是因为我在viewDidload中创建了在didenterbackground中失效的定时器。

因为didenterbackground没有被调用,所以当应用程序在触发一个交互式通知后被启动时,我结束了两个定时器实例。

任何人都可以阐明为什么应用程序终止,但didenterbackground或willTerminate没有被调用?

+0

因为你的应用程序直接射入的背景。它不会从前景转换到背景 – Paulw11

回答

0

你不应该认为对didfinishlaunching的调用意味着你处于前台。正如@ PaulW11在他的评论中所说的,对于当你的应用程序没有运行时的本地通知,你会直接进入后台,并且从不会看到前景到后台的转换,因为你从来没有处于前台。

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

的文档说本地通知通告得到在后台调用:

当用户点击一个远程或本地 通知在警报自定义操作,则系统会调用 应用:handleActionWithIdentifier: forRemoteNotification:completionHandler: 或 application:handleActionWithIdentifier:forLocalNotification:completionHandler: 方法在后台运行,以便您的应用可以执行关联的 操作。

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

我使用(Objective-C的)代码告诉我是否在前台或后台:

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