Ada*_*hns 13 apple-push-notifications ios appdelegate swift
如果我覆盖
override func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
println("hey)
}
Run Code Online (Sandbox Code Playgroud)
当我发送推送通知时,我成功地使用应用程序在前台调用了该方法.
如果我覆盖
override func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
println("hey")
}
Run Code Online (Sandbox Code Playgroud)
在前台发送应用程序通知时,我没有调用该方法.为什么第一个工作,但第二个不适用于应用程序在前台?
请注意,我一次只实现其中一个.不是两个在同一时间.
fou*_*dry 15
您应该使用回调版本,除非您需要支持ios <7(当它被引入时).当你使用Swift时,我预计情况并非如此.
旧方法可以追溯到ios3,除了名称之外全部弃用:
application:didReceiveRemoteNotification:fetchCompletionHandler:尽可能实现方法而不是这个方法.如果您的委托实现了这两种方法,则app对象会调用该application:didReceiveRemoteNotification:fetchCompletionHandler:方法.
旧版本也会根据应用程序是实时(前景或后台)还是从冷启动启动来提供不同的结果.在后一种情况下,它不会被调用,你将需要拦截launchOptionsdict didFinishLaunchingWithOptions以获取infoDict:
如果远程通知到达时应用程序未运行,该方法将启动应用程序并在启动选项字典中提供相应的信息.该应用程序不会调用此方法来处理该远程通知.
使用回调版本.它适用于所有情况.您不必使用完成处理程序/块,在这种情况下效果是相同的(更好地,与更新的方法更一致).
更新
对不起,苹果公司说,你就必须"尽快"调用完成块-你有30秒这样做之前,OS上你放弃.这可能是您警告的来源.
处理完通知后,必须立即调用处理程序参数中的块,否则您的应用程序将被终止.您的应用程序有最多30秒的挂钟时间来处理通知并调用指定的完成处理程序块.实际上,您应该在处理完通知后立即调用处理程序块.
所以调用完成块:
completionHandler(UIBackgroundFetchResult.NoData)
Run Code Online (Sandbox Code Playgroud)
我一直在使用这种方法而没有调用完成块并且没有遇到任何问题,但我现在要添加一个只是为了安全.Apple建议如果你不这样做,你的应用程序将不会被预见到,但我在实践中没有看到它.
| 归档时间: |
|
| 查看次数: |
10738 次 |
| 最近记录: |