iOS开发——Push Notification(二)
2016-01-18 22:23
357 查看
说好的(二)是用来介绍push证书的制作流程的,不过一直没有时间,所以这次趁着一个关于语音呼叫的项目刚刚出了push的坑,所以用小篇幅记录一下iOS成功收到push之后会发生什么事儿。
在收到了消息后,此时,app状态+后续操作 进入程序,可以大致分成下面四种:
程序完全没有启动+点击push消息;
程序在后台运行,即处在didEnterBackground的生命周期中+点击push消息;
程序正在前台运行+点击push消息。
无论处在何种状态+点击桌面图标。
锁屏状态,都一样。
貌似就这几种情况,其中第四种没有把app状态分出来,只把后续操作“点击桌面”分为一个类。
情况1
程序完全没有启动,此时启动程序还是要首先直接调用AppDelegate中的
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
其中,launchOptions带有启动信息,用它就能判断是否是通过点击push消息启动的程序,具体处理就是如下:
情况2
程序在后台,比如刚刚按过home,或者其他程序正在Active,这时点击push消息,就不会进入didFinishLaunching中,而是调用
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo代理函数
其中,有好多资料说程序处于“运行”时点击push也会调用这个代理函数,不知道这个“运行”是否指的是Active状态,但是我在active状态是收不到push的,不过确实在上面这个函数中可以进行一下判断:点击push时程序处于active还是inactive,如下:
对于情况2,在点击push消息进入程序后,会执行else if部分的内容。
情况3
上一段提到了,其实我在前台运行时没有收到push消息,可能哪里没有满足条件,如果有的话,则在上面代码的if中执行自己的处理代码就好了。
情况4
点击桌面图标貌似没有办法获取push消息以及其携带的内容,感觉若要实现还得具体问题具体分析。比如,微信的视屏通话,点击push消息进入程序,如果对方没有挂断,是会直接进入等待接听界面的;这时如果点击桌面图标进入程序,虽然也是直接进入等待接听画面,但是我观察到两者的出现的方式不一样,前者由无到有的效果出现,后者像是通过modal进入的。所以我猜测,后者的情况可能和微信收到普通消息,再通过点击桌面进入是一样的处理方式——通过一种独特的pull方法,是否需要实现这个独特的方法,就看各个app具体的需求了,假如一个新闻类的app推送了消息,如果用户点击这个push,则会进入这个新闻的页面,但是如果仍然点击桌面图标进入程序,是不会进入push推送过来的那条新闻的页面里的,你说4不4?
所以说,这种情况,真实的需求会有,但是没有固定的方法(比如一定会存在代理函数自动被调用)实现,如果想实现,还要针对需求通过具体的设计实现!
在收到了消息后,此时,app状态+后续操作 进入程序,可以大致分成下面四种:
程序完全没有启动+点击push消息;
程序在后台运行,即处在didEnterBackground的生命周期中+点击push消息;
程序正在前台运行+点击push消息。
无论处在何种状态+点击桌面图标。
锁屏状态,都一样。
貌似就这几种情况,其中第四种没有把app状态分出来,只把后续操作“点击桌面”分为一个类。
情况1
程序完全没有启动,此时启动程序还是要首先直接调用AppDelegate中的
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
其中,launchOptions带有启动信息,用它就能判断是否是通过点击push消息启动的程序,具体处理就是如下:
//程序在未启动时通过点击push消息的方式进入程序 if (launchOptions) { NSDictionary* pushNotificationKey = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; if (pushNotificationKey) { //our code; } }
情况2
程序在后台,比如刚刚按过home,或者其他程序正在Active,这时点击push消息,就不会进入didFinishLaunching中,而是调用
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo代理函数
其中,有好多资料说程序处于“运行”时点击push也会调用这个代理函数,不知道这个“运行”是否指的是Active状态,但是我在active状态是收不到push的,不过确实在上面这个函数中可以进行一下判断:点击push时程序处于active还是inactive,如下:
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{ NSLog(@"Remote notification UserInfo : %@",userInfo); application.applicationIconBadgeNumber = 0 ; if (application.applicationState == UIApplicationStateActive) { NSLog(@"--------active when tap push info"); //程序当前正处于前台 } else if(application.applicationState == UIApplicationStateInactive) { NSLog(@"--------inactive when tap push info"); } }
对于情况2,在点击push消息进入程序后,会执行else if部分的内容。
情况3
上一段提到了,其实我在前台运行时没有收到push消息,可能哪里没有满足条件,如果有的话,则在上面代码的if中执行自己的处理代码就好了。
情况4
点击桌面图标貌似没有办法获取push消息以及其携带的内容,感觉若要实现还得具体问题具体分析。比如,微信的视屏通话,点击push消息进入程序,如果对方没有挂断,是会直接进入等待接听界面的;这时如果点击桌面图标进入程序,虽然也是直接进入等待接听画面,但是我观察到两者的出现的方式不一样,前者由无到有的效果出现,后者像是通过modal进入的。所以我猜测,后者的情况可能和微信收到普通消息,再通过点击桌面进入是一样的处理方式——通过一种独特的pull方法,是否需要实现这个独特的方法,就看各个app具体的需求了,假如一个新闻类的app推送了消息,如果用户点击这个push,则会进入这个新闻的页面,但是如果仍然点击桌面图标进入程序,是不会进入push推送过来的那条新闻的页面里的,你说4不4?
所以说,这种情况,真实的需求会有,但是没有固定的方法(比如一定会存在代理函数自动被调用)实现,如果想实现,还要针对需求通过具体的设计实现!
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- javaScript中push函数用法实例分析
- jquery中push()的用法(数组添加元素)
- 讲解iOS开发中基本的定位功能实现
- js判断客户端是iOS还是Android等移动终端的方法
- IOS开发环境windows化攻略
- 浅析iOS应用开发中线程间的通信与线程安全问题
- 检测iOS设备是否越狱的方法
- .net平台推送ios消息的实现方法
- perl push的用法及子程序返回值的反思
- javascript使用数组的push方法完成快速排序
- JavaScript使用push方法添加一个元素到数组末尾用法实例
- JavaScript数组函数unshift、shift、pop、push使用实例
- 探讨Android与iOS,我们将何去何从?