您的位置:首页 > 移动开发 > IOS开发

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消息启动的程序,具体处理就是如下:

//程序在未启动时通过点击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? 

    所以说,这种情况,真实的需求会有,但是没有固定的方法(比如一定会存在代理函数自动被调用)实现,如果想实现,还要针对需求通过具体的设计实现!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息