didReceiveRemoteNotification不在后台工作

我正在开发一个有大量遗留代码的大型应用程序。 目前 – 有一个实施:

- (void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 

问题是只有当应用程序处于前台时才会调用它,或者当应用程序在后台时用户点击通知。 我试图实现:

 - (void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler 

但该应用程序的行为相同。 在任何情况下 – 当应用程序在后台时不会调用此方法。 可能是什么问题呢?

实现didReceiveRemoteNotification:fetchCompletionHandlerdidReceiveRemoteNotification:fetchCompletionHandler是正确的方法,但是您还需要执行以下操作:

确保注册远程通知,请参阅文档 :

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)]; return YES; } 

另外请确保编辑Info.plist并检查“启用后台模式”和“远程通知”checkbox:

在这里输入图像说明

此外,您需要将"content-available":1到您的推送通知有效内容中,否则应用程序将不会在后台中唤醒(请参阅此处的文档 ):

对于触发下载操作的推送通知,通知的有效内容必须包含内容可用密钥,其值设置为1.当该密钥存在时,系统在后台唤醒应用程序(或将其启动到后台)以及调用应用程序委托的应用程序:didReceiveRemoteNotification:fetchCompletionHandler:方法。 该方法的实现应下载相关内容并将其集成到您的应用程序中

所以有效载荷应该至less看起来像这样:

 { aps = { "content-available" : 1, sound : "" }; } 
  1. 在应用程序代理中注册推送通知。
  2. 在应用function中添加背景模式。
  3. 在发送推送通知的同时添加“content-available”=“1”(如果使用firebase,则在从服务器端发送推送通知时,用“content_available”=“true”replace“content-available”=“1”)。

我有同样的问题。 出现通知横幅,但是-application:didReceiveRemoteNotification:fetchCompletionHandler:方法未被调用。 为我工作的解决scheme是添加实施 – 应用程序:didReceiveRemoteNotification:方法和转发呼吁 – 应用程序:didReceiveRemoteNotification:fetchCompletionHandler ::

 func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) { self.application(application, didReceiveRemoteNotification: userInfo) { (UIBackgroundFetchResult) in } }