didReceiveRemoteNotification无法在后台运行

Yog*_*ton 35 xcode push-notification apple-push-notifications ios xcode6

我正在开发一个包含大量遗留代码的大型应用程序.目前 - 有一个实现:

- (void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
Run Code Online (Sandbox Code Playgroud)

问题是它仅在应用程序位于前台或用户在应用程序处于后台时点击通知时调用.我试图实现:

- (void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
Run Code Online (Sandbox Code Playgroud)

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

Bar*_*kar 69

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

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

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

    return YES;
}
Run Code Online (Sandbox Code Playgroud)

还要确保编辑Info.plist并选中"启用后台模式"和"远程通知"复选框:

在此输入图像描述

此外,您需要添加"content-available":1到推送通知有效负载,否则如果应用程序在后台,则不会被唤醒(请参阅此处的文档):

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

因此有效载荷至少应如下所示:

{
    aps = {
        "content-available" : 1,
        sound : ""
    };
}
Run Code Online (Sandbox Code Playgroud)

  • @godmoney查看我的更新答案,您需要在通知负载中添加""content-available":"1"` (6认同)
  • 没有"声音":""它似乎不起作用 (3认同)
  • 我启用了远程通知的后台模式,有效负载应包含内容可用:1 个键值对,但不调用我的后台方法 (2认同)
  • iOS 14 也出现同样的问题。当应用程序处于后台时(不是强制关闭),`didReceiveRemoteNotification` 方法永远不会被调用。对此有何建议?我遵循了确切的程序,并在 aps.txt 文件中添加了“content-available”:1。“didReceiveRemoteNotification”仅在前台被调用。 (2认同)

Mah*_*ale 14

  1. 在app delegate中注册推送通知.
  2. 在应用功能中添加背景模式.
  3. 在发送推送通知时添加"content-available"="1"(如果使用firebase,则在从服务器端发送推送通知时,将"content-available"="1"替换为"content_available"="true").


ZaE*_*FaR 5

我有同样的问题。出现通知横幅,但未调用-application:didReceiveRemoteNotification:fetchCompletionHandler:方法。对我有效的解决方案是添加-application:didReceiveRemoteNotification:方法的实现,并向前调用-application:didReceiveRemoteNotification:fetchCompletionHandler ::

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {

    self.application(application, didReceiveRemoteNotification: userInfo) { (UIBackgroundFetchResult) in

    }
}
Run Code Online (Sandbox Code Playgroud)