調(diào)試時發(fā)現(xiàn),iOS 處理推送通知的方式在 iOS 9 和 iOS 10 上面有所不同。接收消息推送有兩個代理方法:
方法 1:application:didReceiveRemoteNotification:
方法 2:application:didReceiveRemoteNotification:fetchCompletionHandler:
當(dāng)同時實現(xiàn)方法兩個方法時,應(yīng)用在不同狀態(tài)下調(diào)用的方法不一致。
一般應(yīng)用有三種狀態(tài):
a)應(yīng)用未啟動;
b)應(yīng)用已啟動,但處于后臺;
c)應(yīng)用處于前臺。
官方文檔描述
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:
結(jié)論:
目前最保險的方法就是,在application:didFinishLaunchingWithOptions:以及上述兩個方法中都檢測是否存在推送通知,并進(jìn)行處理。