一、点击push消息启动的2种情况
当用户通过点击push消息启动应用的时候,有两种情况:
1)、应用在后台运行,此时会走到- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler。
2)、应用未启动,此时会走到- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(nullable NSDictionary *)launchOptions。
二、第二种情况的注意事项
如果应用在后台时收到push,- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler方法会立刻执行一次;当用户点击push消息启动的时候,会执行第二次。所以在该方法中需要区分是不是用户点击push消息启动,如果不是则不处理。
typedef NS_ENUM(NSInteger,UIApplicationState){
UIApplicationStateActive,
UIApplicationStateInactive,
UIApplicationStateBackground
}NS_ENUM_AVAILABLE_IOS(4_0);
上面是UIApplicationState的定义,可以简单理解UIApplicationStateActive是前台状态,UIApplicationStateBackground是后台状态,UIApplicationStateInactive就是第二次调用- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler方法时的状态(具体含义请参考官方文档,在此只是大致理解下)。
三、应用处于前台时收到推送
应用处于前台收到推送时,此时会走到- (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操作系统优先选择未废弃的方法,也就是第一个方法,所以在目前普遍都升级到iOS9的情况下,第二个方法可以不实现。