【问题标题】:didReceiveRemoteNotification:fetchCompletionHandler: but the completion handler was never calleddidReceiveRemoteNotification:fetchCompletionHandler: 但从未调用过完成处理程序
【发布时间】:2015-02-26 22:20:42
【问题描述】:

我一直在尝试实现获取完成块,但没有成功。每当我发送 APN 时,xcode 仍然抱怨它没有实现。这是我的代码

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {

    println("2. User Data", userInfo)

    completionHandler(UIBackgroundFetchResult.NewData)

}

我在 xcode 控制台中收到的警告是这样的

Warning: Application delegate received call to -application:didReceiveRemoteNotification:fetchCompletionHandler: but the completion handler was never called.

不确定我是否在这里实现了正确的语法

【问题讨论】:

  • 去掉println或者改成NSLog,然后重试。如果这不起作用,则将completionHandler包装在一个调度块中并将其提交到某个后台队列(不是主线程),因此在此方法返回之后调用它。
  • @DavidH 当我将println 替换为NSLog 时,我不再看到警告。谢谢!

标签: ios iphone swift


【解决方案1】:

删除 println 或将其更改为 NSLog,然后重试。问题很可能是因为此方法是在后台而不是在主线程中出现的。 println 比 NSLog 简单得多,NSLog 是线程安全的,并且经过多年的强化。

【讨论】:

  • 谢谢大卫。这条信息对于新的 iOS 开发者来说并不明显。
  • 我实际上猜测了 - 我一直使用这种方法,但从未见过那个错误。很多关于 println 的抱怨,因为它不是线程保存。如果你在 SO 上搜索,你会看到很多人将 println 包装在他们自己的包装器中,以便它在主线程上得到输出。
【解决方案2】:

我遇到了完全相同的问题,但解决方案完全不同。我的问题是我导入了Intercom,以便人们可以在应用内聊天,并且似乎它拦截了通知并且didReceiveRemoteNotification 从未在我的AppDelegate 中被调用。

我终于可以停止用头撞墙了,希望这可以节省别人的时间。

【讨论】:

  • 这是 4 年前的一个长镜头,但自从我将 Intercom 添加到应用程序后,我遇到了同样的问题,但我无法手动推送通知(将 IntercomAutoIntegratePushNotifications NO 添加到 Info. plist 和所有这些);你最后是怎么解决这个问题的?
  • 再次,您是否设法通过对讲通知解决了这部分?
【解决方案3】:

不知道为什么,但是用NSLog 替换println 解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 2014-08-16
    • 1970-01-01
    • 1970-01-01
    • 2019-12-07
    相关资源
    最近更新 更多