冷启动:指app被后台杀死后,在这个状态打开app,这种启动方式叫做冷启动。
热启动:指app没有被后台杀死,仍然在后台运行,通常我们再次去打开这个app,这种启动方式叫热启动。
冷启动流程:
一般而言,大家把iOS冷启动的过程定义为:从用户点击App图标开始到appDelegate didFinishLaunching方法执行完成为止。这个过程主要分为两个阶段:
T1:main()函数之前,即操作系统加载App可执行文件到内存,然后执行一系列的加载&链接等工作,最后执行至App的main()函数。
T2:main()函数之后,即从main()开始,到appDelegate的didFinishLaunchingWithOptions方法执行完毕。
背景:
因为调整了消息权限通知的位置,将消息注册的方法:
image.png
从appDelegate移动到TabBarController中,但是center.delegat指定的是TabBarController,没有指定 [TBClientAppDelegate getAppDelegate],(刚开始注册和代理方法都在appDelegate中
导致问题:
(热启动)点击push的通知,原本会调起app并刷新首页,导致接受推送通知的application:didReceiveRemoteNotification:不执行;
(冷启动)点击push通知,却执行了,因为冷启动走的是didFinishLaunchingWithOptions,传入的参数都在launchOptions中
iOS 程序启动时总会调用[application:didFinishLaunchingWithOptions:],其中第二个参数launchOptions为NSDictionary类型的对象,里面存储有此程序启动的原因。
1 若用户直接启动,lauchOptions内无数据;
2 若由其他应用程序通过openURL:启动,则UIApplicationLaunchOptionsURLKey对应的对象为启动URL(NSURL),UIApplicationLaunchOptionsSourceApplicationKey对应启动的源应用程序的bundle ID (NSString);
3 若由本地通知启动,则UIApplicationLaunchOptionsLocalNotificationKey对应的是为启动应用程序的的本地通知对象(UILocalNotification);
4 若由远程通知启动,则UIApplicationLaunchOptionsRemoteNotificationKey对应的是启动应用程序的的远程通知信息userInfo(NSDictionary);
5 其他key还有UIApplicationLaunchOptionsAnnotationKey,UIApplicationLaunchOptionsLocationKey,
6 UIApplicationLaunchOptionsNewsstandDownloadsKey。
①.当程序处于关闭状态收到推送消息时,点击图标会调用- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 这个方法,那么消息给通过launchOptions这个参数获取到。
②.当程序处于前台工作时,这时候若收到消息推送,会调用- (void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo这个方法
③.当程序处于后台运行时,这时候若收到消息推送,如果点击消息或者点击消息图标时,也会调用- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary *)userInfo这个方法
④.当程序处于后台运行时,这时候若收到消息推送,如果点击桌面应用图标,则不会调用didFinishLaunchingWithOptions和didReceiveRemoteNotification方法,所以无法获取消息
网友评论