应用程序:didReceiveRemoteNotification:fetchCompletionHandler不调用
它出现了函数application:didReceiveRemoteNotification:fetchCompletionHandler
在应用程序强制退出时不被调用。 我的印象是,无论应用程序处于什么状态,函数都会被调用,但只有当应用程序已经在后台运行时才会调用该函数。 如果还没有使用新的iOS 7远程通知背景模式运行,有没有办法在后台唤醒应用程序?
application:didReceiveRemoteNotification:fetchCompletionHandler:
即使应用程序被挂起,根本不运行,后台或活动,也会被调用。 另外值得注意的是该方法仅适用于iOS 7。 这是苹果文档 。
但是,如果应用程序被强行closures(即通过与应用程序切换杀),应用程序将不会启动。 (见答案 ) 编辑:我再次检查了这一点在iOS 7.1上,看看他们是否解决这个问题,但仍然是这样的情况下,如果应用程序手动杀死,应用程序将不会被唤醒和application:didReceiveRemoteNotification:fetchCompletionHandler:
不会叫做
当接收到推送时,应用程序仅在需要调用application:didReceiveRemoteNotification:fetchCompletionHandler:
程序时被唤醒application:didReceiveRemoteNotification:fetchCompletionHandler:
方法(即,您必须在推送通知有效载荷中设置“content-available”标志。 如果用户通过点击通知打开应用程序,该方法将被再次调用。
编辑:没有在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:方法不同,该方法仅在应用程序运行时调用,系统将调用此方法,而不pipe应用程序的状态如何。 如果您的应用程序被暂停或未运行 ,则在调用该方法之前,系统会唤醒或启动您的应用程序并将其置于后台运行状态。 (UIApplicationDelegate协议参考)
但是,当使用“content-available”进行testing时:1推送应用程序在未运行时从未启动。 当应用程序被暂停它的作品。
你有没有发现自己的解决scheme?
当你的应用程序已经强制退出该方法没有被调用。 相反,像(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
被调用。
如果通过点击通知popup窗口中的“打开”来打开该应用程序,则通知位于launchOptions
。
获取这样的推送通知字典:
NSDictionary * pushNotificationUserInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; if (pushNotificationUserInfo) { // call your handler here }
如果您强制退出应用程序切换器的应用程序,它将不会在后台(通过任何方式)被唤醒,直到下一次启动。 当您强制退出应用程序时,即使后台事件通常已经唤醒,您也正在有效地向操作系统表示您不希望此应用程序运行。
这在testing中值得注意,因为您可能会强制退出应用程序,以便在应用程序未运行时检查是否通过推送通知启动。 事实上,你使用武力退出将是它不能发射的原因。
正如苹果所记载的那样,新的多任务处理API(提取和远程通知)只有在应用程序处于挂起/后台/前台状态时才能工作。
-
在后台/前台状态,然后
application:didReceiveRemoteNotification:fetchCompletionHandler
将被触发。 -
在Suspended状态下,则
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
将启动-(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]) }