从didReceiveRemoteNotification:fetchCompletionHandler解析警告

69

在添加了来自Parse.com的这段代码后,我遇到了一个错误:

- (void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo
fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
    if (application.applicationState == UIApplicationStateInactive) {
        [PFAnalytics trackAppOpenedWithRemoteNotificationPayload:userInfo];
    }
}

我不太理解目前发生了什么事情,但是我在日志中看到了这个警告:

你已经实现了 -[application:didReceiveRemoteNotification:fetchCompletionHandler:] 方法,但你还需要将 "remote-notification" 添加到 Info.plist 文件的支持的 UIBackgroundModes 列表中。

我认为在 plist 文件中添加 UIBackgroundModes - remote-notification 可以解决这个问题,

但是当我这样做时,它会将字词更改为以下内容:

必需的后台模式 -> 应用程序响应推送通知而下载内容

然而我的应用程序没有这样做,所以我对于首先进行此操作感到困惑。

5个回答

212

如果您不想手动添加密钥到您的 .plist 文件中,那么这里有一个 @MurraySagal 的答案的图形化版本,按照步骤 1 到 7 进行操作即可完成。

输入图像描述

注意:如果您无法阅读步骤,请使用 Command++(Zoom in)和 Command+-(Zoom out)的组合来缩放当前选项卡。 如果 Command 不起作用,您可以尝试使用 Ctrl


1
这解决了我遇到的GCM问题。这是一个很好的做法。 - MNM
1
完美的解决方案! - Chetan Dobariya

38

我认为@djshiow没有解决你的问题。

你需要在info.plist文件中添加以下内容:

远程通知

1)添加一行,在左列中选择所需后台模式

2)在0号项目行上,点击右侧列并输入:remote-notification。按Enter键。

来源:http://hayageek.com/ios-silent-push-notifications/


31
如果您不想在响应远程通知时获取数据,我认为您可以实现以下委托方法:
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 

e.g.

- (void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo {
    if (application.applicationState == UIApplicationStateInactive) {
        [PFAnalytics trackAppOpenedWithRemoteNotificationPayload:userInfo];
    }
}

使用当前不适合您的版本,可以考虑换一个新的版本。


这正是我所需要的:如果你遵循解析指南,那么假设你想通过推送后台下载数据。但我不想这样做。因此,这个答案对我来说是正确的。 - xaphod
2
主要区别在于您不实现fetchCompletionHandler:版本的didReceiveRemoteNotification:方法。 - pkamb
5
在iOS 10中,- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo方法已经被弃用。 - Giorgio

22

在 Xcode 6 中:

  • 在项目导航器中点击项目
  • 在“项目和目标”列表中点击目标。
  • 点击“功能”
  • 展开并打开“后台模式”
  • 点击“远程通知”

这将向 info.plist 添加必需的后台模式键和“应用程序响应推送通知下载内容”的值。


0

当您使用新的didReceive...方法时,您需要完成两件事:

  1. 在您的plist中添加必要的条目
  2. 添加一个完成处理程序来处理数据处理事件

如果您不想下载任何数据,可以将此内容添加到您的didReceive...方法中

completionHandler(.NoData)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接