一、點(diǎn)擊push消息啟動的2種情況
????當(dāng)用戶通過點(diǎn)擊push消息啟動應(yīng)用的時候,有兩種情況:
????????1)、應(yīng)用在后臺運(yùn)行,此時會走到- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler。
????????2)、應(yīng)用未啟動,此時會走到- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(nullable NSDictionary *)launchOptions。
二、第二種情況的注意事項(xiàng)
????如果應(yīng)用在后臺時收到push,- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler方法會立刻執(zhí)行一次;當(dāng)用戶點(diǎn)擊push消息啟動的時候,會執(zhí)行第二次。所以在該方法中需要區(qū)分是不是用戶點(diǎn)擊push消息啟動,如果不是則不處理。
????????????????typedef NS_ENUM(NSInteger,UIApplicationState){
????????????????????UIApplicationStateActive,
????????????????????UIApplicationStateInactive,
????????????????????UIApplicationStateBackground
????????????????}NS_ENUM_AVAILABLE_IOS(4_0);
? ? 上面是UIApplicationState的定義,可以簡單理解UIApplicationStateActive是前臺狀態(tài),UIApplicationStateBackground是后臺狀態(tài),UIApplicationStateInactive就是第二次調(diào)用- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler方法時的狀態(tài)(具體含義請參考官方文檔,在此只是大致理解下)。
三、應(yīng)用處于前臺時收到推送
????應(yīng)用處于前臺收到推送時,此時會走到- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(nullable NSDictionary *)launchOptions方法,此時在方法中通過UIApplicationStateActive判斷是否為該場景。
四、方法廢棄策略
????- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo fetchCompletionHandler:(void(^)(UIBackgroundFetchResultresult))completionHandlerNS_AVAILABLE_IOS(7_0);
????- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo NS_DEPRECATED_IOS(3_0, 10_0, "");
????雖然第二個方法可以支持到iOS10,但是如果第一個方法存在,則iOS操作系統(tǒng)優(yōu)先選擇未廢棄的方法,也就是第一個方法,所以在目前普遍都升級到iOS9的情況下,第二個方法可以不實(shí)現(xiàn)。