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