当应用程序被强行退出时,似乎未调用函数application:didReceiveRemoteNotification:fetchCompletionHandler
。我的印象是,无论应用程序处于什么状态,都会调用该函数,但似乎只有在应用程序已在后台运行时才会调用它。有没有办法在后台唤醒应用程序,如果它尚未使用新的iOS 7远程通知后台模式运行?
答案 0 :(得分:51)
application:didReceiveRemoteNotification:fetchCompletionHandler:
也会被调用。另外值得注意的是,该方法仅适用于iOS 7。这是apple documentation。
但是,如果应用程序被强行关闭(即通过使用应用程序切换器进行查杀),该应用程序将不启动。(请参阅SO answer)
编辑:我在iOS 7.1上再次检查了这一点,看看他们是否解决了这个问题,但仍然存在这样的情况:如果手动杀死该应用,应用将不会被唤醒,application:didReceiveRemoteNotification:fetchCompletionHandler:
将会不被称为
当接收推送时,只有“如果需要”唤醒应用才能调用application:didReceiveRemoteNotification:fetchCompletionHandler:
方法(即您必须在推送通知有效负载内设置“content-available”标志。请参阅{{ 3}})。如果用户然后通过点击通知打开应用程序,则该方法将再次被称为 。
答案 1 :(得分:23)
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary
*)launchOptions {
//Remote Notification Info
NSDictionary * remoteNotifiInfo = [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey];
//Accept push notification when app is not open
if (remoteNotifiInfo) {
[self application:application didReceiveRemoteNotification: remoteNotifiInfo];
}
return YES;
}
答案 2 :(得分:3)
应用程序应该启动,即使它没有运行。 Apple文档说:
当此值存在且推送通知到达设备时,系统将发送 通知您的应用(在需要时启动)并给它一些时间来处理>在向用户显示任何内容之前的通知。 (iOS应用程序编程指南)
当推送通知到达时,系统会向用户显示通知 在后台启动应用程序(如果需要),以便它可以调用此方法。 (UIApplicationDelegate协议参考)
与应用程序不同:didReceiveRemoteNotification:方法,仅在调用时调用 您的应用正在运行,无论您的应用状态如何,系统都会调用此方法。如果 您的应用暂停或未运行,系统唤醒或启动您的应用并置入 它在调用方法之前进入后台运行状态。 (UIApplicationDelegate协议参考)
然而,当使用“content-available”进行测试时:1推送应用程序在未运行时永远不会启动。当应用程序暂停时,它可以正常工作。
你发现自己是一个解决方案吗?
答案 3 :(得分:3)
当您的应用被强制退出时,不会调用该方法。相反,像往常一样,调用(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
。
如果通过点击打开应用程序"打开"在通知弹出窗口中,通知在launchOptions
内。
获取这样的推送通知字典:
NSDictionary * pushNotificationUserInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if (pushNotificationUserInfo)
{
// call your handler here
}
答案 4 :(得分:1)
正如Apple所记录的那样,新的多任务API(提取和远程通知)仅在应用处于暂停/后台/前景状态时才有效。
在后台/前景状态下,application:didReceiveRemoteNotification:fetchCompletionHandler
将被触发。
在已暂停状态下,-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
将被触发。
在未运行状态(您的情况)中,application:didReceiveRemoteNotification:fetchCompletionHandler
永远不会被触发。
有关应用状态的更多信息,请参阅Apple documentation。
答案 5 :(得分:1)
如果您强制退出应用程序切换器中的某个应用程序,则不会在后台(通过任何方式)唤醒该应用程序,直到下次启动它为止。当您强制退出应用程序时,您实际上是在向操作系统说明您不希望此应用程序运行,即使后台事件通常会将其唤醒。
这在测试期间值得关注,因为您可能已强制退出应用程序,以便在应用程序未运行时检查是否通过推送通知启动了该应用程序。事实上,您使用强制退出将是为什么无法启动的原因。
答案 6 :(得分:1)
对于Swift 2.0中的关注我已经解决了我的问题,就像这是背景
if let remoteNotification = launchOptions?[UIApplicationLaunchOptionsRemoteNotificationKey] as? NSDictionary {
pushNotificationAction(remoteNotification as [NSObject : AnyObject])
}
答案 7 :(得分:0)
我最近遇到了同样的问题,我发现Apple更新了他们的文档并说:
但是,如果用户强行退出,系统不会自动启动您的应用。在这种情况下,用户必须重新启动您的应用程序或重新启动设备,然后系统才会再次尝试自动启动您的应用。
application(_:didReceiveRemoteNotification:fetchCompletionHandler:)
所以我猜当应用程序被强制退出杀死时,没有办法做任何事情?