调试时发现,iOS 处理推送通知的方式在 iOS 9 和 iOS 10 上面有所不同。接收消息推送有两个代理方法:
方法 1:application:didReceiveRemoteNotification:
方法 2:application:didReceiveRemoteNotification:fetchCompletionHandler:
当同时实现方法两个方法时,应用在不同状态下调用的方法不一致。
一般应用有三种状态:
a)应用未启动;
b)应用已启动,但处于后台;
c)应用处于前台。
官方文档描述
Let’s review the possible scenarios that can arise when the system delivers a local notification or a remote notification for an app.
The notification is delivered when the app isn’t running in the foreground.In this case, the system presents the notification, displaying an alert, badging an icon, perhaps playing a sound, and perhaps displaying one or more action buttons for the user to tap.
The user taps a custom action button in an iOS 8 notification.In this case, iOS calls eitherapplication:handleActionWithIdentifier:forRemoteNotification:completionHandler:or application:handleActionWithIdentifier:forLocalNotification:completionHandler:. In both methods, you get the identifier of the action so that you can determine which button the user tapped. You also get either the remote or local notification object, so that you can retrieve any information you need to handle the action.
The user taps the default button in the alert or taps (or clicks) the app icon.If the default action button is tapped (on a device running iOS), the system launches the app and the app calls its delegate’sapplication:didFinishLaunchingWithOptions:method, passing in the notification payload (for remote notifications) or the local-notification object (for local notifications). Although application:didFinishLaunchingWithOptions:isn’t the best place to handle the notification, getting the payload at this point gives you the opportunity to start the update process before your handler method is called.
For remote notifications, the system also calls theapplication:didReceiveRemoteNotification:fetchCompletionHandler:method of the app delegate.
If the app icon is clicked on a computer running OS X, the app calls the delegate’sapplicationDidFinishLaunching:method in which the delegate can obtain the remote-notification payload. If the app icon is tapped on a device running iOS, the app calls the same method, but furnishes no information about the notification.
The notification is delivered when the app is running in the foreground.The app calls theapplication:didReceiveRemoteNotification:fetchCompletionHandler:orapplication:didReceiveLocalNotification:method of the app delegate. (If application:didReceiveRemoteNotification:fetchCompletionHandler:isn’t implemented, the system calls application:didReceiveRemoteNotification:.) In OS X, the system callsapplication:didReceiveRemoteNotification:
结论:
目前最保险的方法就是,在application:didFinishLaunchingWithOptions:以及上述两个方法中都检测是否存在推送通知,并进行处理。
网友评论