iOS推送通知

推送通知

此通知非彼通知。
NSNotification是抽象的,看不见的,但是可以监听,属于观察者模式的一种设计模式。
推送通知是可见的,能用肉眼看见的,是真正的和用户打交道的通知。
推送通知分为两种:
(1)本地推送通知
(2)远程推送通知
作用:可以让不在前台运行的app告知用户app内部发生了什么事情。比如微信、QQ
不在前台有两种情况:一种是程序退出到后台,另一种是程序被杀死。
不管是被杀死还是在后台,都可以接受推送通知。
推送通知的多种呈现效果:一种是从屏幕上方拉出来横幅。一种是在屏幕中间弹出UIElertView。(这种少见)。一种是推送通知的时候有音效。一种是在锁屏状态呈现。还有一种是呈现消息数量。还有一种是通知中心。
推送通知的使用细节:
点击推送通知后,默认会自动打开发出推送通知的app。不管这个app是处于在后台状态还是被杀死状态
 
本地推送通知:
顾名思义,就是不需要联网就能发出推送通知(不需要服务器的支持)
如何发出本地推送通知:
1.创建本地推送通知对象
UILocalNotification *ln = [[UILocalNotification alloc] init];
2,设置本地推送通知的属性
(1)推送通知的触发时间
@property (nonatomic,copy) NSDate *fireDate;
(2)推送通知的具体内容
@property (nonatomic,copy) NSString *alertBody;
 推送通知的触发时间和具体内容属性是必须要设置的。另外,还有一些其他额外的属性,在此不再介绍。
注意,和iOS7不同的是,iOS 8开始,发送通知,需要用户授权允许。一般都是在程序一启动就请求用户允许,所以在didFinishLaunch方法里进行请求,以请求用户允许授权?
所以,需要进行系统版本判断
锁屏快捷键:command + L
 
点击通知跳转到指定界面:
利用application的代理方法 - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
(1)如果应用程序是在前台,依然会收到本地通知,但是收到通知后不应该跳转
(2)如果应用程序在后台,收到本地通知后执行跳转代码
(3)如果应用程序被杀死,收到本地通知后不会执行上面的代理方法里的代码,所以要在didFinishLaunch:withOptions方法里进行跳转
     如果正常启动,launchOptions为null;其他方式启动launchOptions不为空。
     因为程序被其他应用程序打开后也会执行didFinishLaunch:withOptions方法且launchOptions不为空,所以需要过滤掉被其他应用程序打开后也执行跳转的情况,解决方法是判断launchOptions的UIApplicationLaunchOptionsLocalNotificationKey是否有值
 
远程推送通知:
APNs服务:Apple Push Notification Services 苹果远程推送通知服务
不管程序处于什么状态,前台、后台、关闭,只要手机处于联网状态,应用程序都会收到远程推送通知。
所有的苹果设备在联网的状态下都会与苹果的服务器建立一个长连接。
短连接一般是http请求
长连接一般是通过建立socket会话
长连接可以保证服务器主动把消息推送给客户端。
以前短连接的情况下,短连接是客户端主动发起建立的连接(客户端主动请求数据),服务器是无法把消息主动推送给客户端的。
当然也可以通过轮询的方式同步消息,每隔一定时间客户端就和服务器建立一次短连接。
但是相比较长连接,频繁的建立、释放短连接会非常消耗服务器的性能;并且会产生消息同步不及时的情况。
长连接的另一个功能:
时间校正(苹果设备不需要更新时间)。
版本更新(系统更新版本)。
查找我的iPhone(iCloud服务器会给客户端发送位置请求请求客户端的位置)。
远程推送的原理:
客户端和服务器通过长连接保持通信,实现远程推送。具体来讲:客户端通过定期给服务器发送心跳包来保持长连接。如果服务器一定时间内或者连续几次没有收到客户端的心跳包,那么服务器就会断开和这个客户端的长连接。断开的原因是服务为和客户端的关系是一对多的,繁忙的时候并发数非常大,一个服务器很有可能同时和百万个客户端保持着长连接,如此导致服务器的压力非常大,为了节省服务器的性能和内存开销,所以需要断开不必要的长连接。
客户端app处于前台状态下,app服务器可以通过长连接向客户端app发送消息。
当客户端app退出到后台或者程序被杀死,客户端app和app服务器就会断开长连接,那么app服务器无法向客户端app推送通知。此时就需要借助于苹果的APNs服务器进行远程推送,只有当客户端app处于后台或者被杀死的情况下才会由APNs服务器推送。
苹果的APNs服务器和每个设备有一个长连接,专门服务于远程推送通知。所以,app服务器可以把消息发送给苹果的APNs服务器。苹果的APNs服务器可以代替该app服务器把消息通过远程通知的方式推送到指定的设备的指定app上,这就实现了远程推送通知。
APNs服务器如何找到指定设备的指定app呢?
通过device token,device token是设备的UDID和应用程序的bundle identifier加密而来的。可以通过UDID定位到某个具体的设备,然后通过bundle identifier定位到某个具体的应用。实现远程通知的精准推送。
如上图:
前期:
(1)客户端app发送设备的UDID和应用的Bundle Identifier给苹果的APNs服务器。
(2)苹果的APNs服务器会把二者加密生成一个deviceToken返回给客户端app。
(3)客户端app把当前用户的deviceToken和用户的标志(比如某个QQ号码或者id)发送给app服务器。
(4)app服务器把这些数据存储到数据库。
后期:
(5)李四给张三发送QQ消息数据,该数据包括消息体和双方的QQ号码等。
(6)QQ服务器根据QQ号码等信息去数据库查询该号码对应的deviceToken。
(7)QQ服务器把查询到的deviceToken和QQ消息数据一并推送给苹果的APNs服务器。
(8)苹果的APNs服务器通过查找之前注册过的deviceToken找到张三的设备,进而再通过deviceToken把消息数据推送给张三的设备上的QQ应用的张三的QQ账号。
 

 

posted @ 2015-11-09 00:44  oneSong  阅读(606)  评论(0编辑  收藏  举报