IOS推送

推送:

用户被动的接收消息,是程序在后台的一种通知机制推送通知跟NSNotification不同
1.NSNotification是抽象的,不可见的
2.推送通知是可见的

IOS中提供了两种推送通知

1.本地推送通知(Local Notification)
2.远程推送通知(Remote Notification)

源生和极光

推送的作用:可以让不在前台运行的app,告知客户app内部发生的事情。(QQ消息推送,微信消息推送等)

推送通知的呈现效果:

1.在屏幕顶部显示的一条横幅
2.在屏幕中间弹出一个UIAlertView
3.在锁屏界面显示一块横幅
4.更新app图标的数字
5.播放提示音

PS:工作常用、面试必问

推送

源生方法

  • 推送原理
    1.应用程序注册消息推送。
    2.IOS从APNS Server获取device token,应用程序接收device token.
    3.应用程序将device token发送给PUSH服务端程序
    4.服务端向APNS发送推送消息
    5.APNS服务将消息发送给iPhone应用程序
IOS推送_第1张图片
Paste_Image.png

一、推送证书

二、配置工程

三、需要实现的代码

首先由应用注册远程通知。注册成功之后APNS会返回一个唯一标识的设备令牌码deviceToken,应用拿到分配的设备令牌码之后,需要将该设备的设备令牌码连同其他设备以及账户相关信息(如果有必要的话)传递给该应用对应的后台服务器。当后台服务器需要推送消息时,就将消息以及需要推送设备对应的deviceToken传递给APNS,由APNS完成推送工作
建立我们的推送的项目(注意Bundleldentifier必须和我们推送应用的App id一致
在AppDelegate里didiFinishLaunchingWithOptions函数里写

- (BOOL)application:(UIApplication *)applicationdidFinishLaunchingWithOptions:(NSdicionary *)launchOptions {
......
//推送的形式:标记,声音,提示
[[UIApplication sharedApplication] registerForRemoteNotificationTypes: UIRemoteNotificationTypeBadge |UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert];
   return YES;
}
 
- (void)application:(UIApplication *)applicationdidRegisterForRemoteNotificationsWithDeviceToken:(NSData *)pToken {
   NSLog(@"regisger success:%@",pToken);
   //注册成功,将deviceToken保存到应用服务器数据库中
}
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
    // 处理推送消息
    NSLog(@"userinfo:%@",userInfo);
   
    NSLog(@"收到推送消息:%@",[[userInfo objectForKey:@"aps"] objectForKey:@"alert"]);
 //Icon推送数量设为0  
//    application.applicationIconBadgeNumber=0;  

}
- (void)application:(UIApplication *)applicationdidFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
   NSLog(@"Registfail%@",error);
}

我们运行程序的时候会有提示,说我们的程序要发送推送通知。
应用程序不出在后台,且通过推送通知打开的时候,如果需要推送下来相关的信息可以在

- (**BOOL**)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions  

方法中加入

 ///应用程序不处在后台,并且是通过推送打开应用的时候  
** ****if** (launchOptions) {  
     ///获取到推送相关的信息  
     NSDictionary *userInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];  
 }  

第三方
极光推送、友盟等
详见官网
https://www.jpush.cn/

什么是远程推送?
远程:从远程服务器推送给客户端的通知(需要联网)
从服务器发送了一个通知,接收到通知以后做的和本地通知类似的事情,这个通知只不过是从远方的服务器传过来的,要做的这个远程推送通知是由远程推送服务,又称为APNS(Apple Push Notification Services:苹果推送通知服务),苹果给我们提供了这个服务就可以做远程推送服务了。
为什么要用苹果的服务器?-->我们都知道,程序在或者的时候是可以跟自己的服务器进行交互的(程序或着可以执行代码),但只要用户关闭了app,就无法跟app的服务器沟通,无法从服务器上获得最新的数据内容。我们在使用QQ的时候,即使没有登录QQ也能收到信息,这就是用远程推送通知做的,不管登录还是没有登录QQ,都可以接收到信息(前提是联网状态下)

  • 远程推送通知使用须知
    所有的苹果设备在联网的状态下,都会与苹果的设备建立长连接(只要建立连接,想发送数据,随时都可以发送,始终保持连接)苹果有一个服务器集群,跟所有的苹果设备建立长连接
  • 长连接的作用
    时间校准、系统升级、查找我的iPhone
  • 长连接的好处
    数据保持最新状态,数据传输快(以前的连接需要根据协议多次进行连接,苹果的直接就是已经连接上的了)。只要和苹果的设备保持长连接就可以享受苹果的APNS服务,举个例子:

比如说我AgentLXJ现在有一部IPhone手机,手机里面有很多应用比如QQ,QQ有服务器吧,我的手机现在联网并且QQ软件要打开,陌陌的服务器就可以和我交互,我想传递消息,或者我接收到了消息,陌陌服务器金额以直接的告诉我.如果退出了QQ(不是卸载),但我的手机还在联网,这时QQ就不能给我推送消息,这时候苹果的服务就可以,只要我的手机在联网状态下(苹果建立的就是长连接),苹果要给我推送消息要是知道是哪个设备,怎么区分是哪一台设备呢?我们的手机都有自己的唯一标识,有了设备的唯一标识就知道推送给哪一台设备,但是还有一个问题,我的手机上不可能只有QQ这么一个软件,比如还有微信,陌陌等软件,所以苹果还要知道软件的BundleID(应用程序的唯一标识),有了设备和程序的唯一标识,就知道了推送给哪个设备的哪个应用程序.现在又有了一个问题,苹果不知道要推送什么消息内容.这里说明一个概念:消息体(来源:是谁发给我的,比如是:小媳妇.消息内容:比如给我说的是:吃饭了么?),苹果不知道这个消息体,但这个消息QQ知道,我的小媳妇发的这个消息体先到QQ服务器(告诉QQ我要给他发送一条消息),QQ服务器先看看被接受的人(我)在线没有,在线了直接发过去就完了,如果我不在线,这时苹果服务器可以发送,所以要发给苹果服务器,但是发给苹果服务器是有要求的1:交99美元成为开发者才能享受此服务.2:消息体 3目标的DeviceToken,QQ的服务器没有资格保存每一个设备的唯一标识和BundleID,苹果想了一个办法,叫做DeviceToken(APPID(应用位置标识)和UUID(设备唯一标识)).告诉我这三点苹果就可以帮我们做事情,怎么解析DeviceToken苹果知道,所以QQ有一个数据库,一旦有人注册或者是登陆(因为手机和苹果是长连接,一旦登陆或注册之前就会发送设备ID和软件ID,并在苹果服务器获得DeviceToken)QQ数据库就会存用户的信息,比如ID,名字,性别,DeviceToken(假如我的DeviceToken经苹果的加密生成的是ApentLXJ)等等信息,DeviceToken在每次登陆的时候保存,因为用户有可能换手机,一旦换手机用户的UUID就换了,这时需要重新生成一个DeviceToken,然后把最新的Devicetoken保存到服务器中,小媳妇我发消息的时候就去找苹果,看是否符合上面你的三条(交过钱了,有消息体,有目标的DeviceToken:ApentLXJ)),一看都符合就发给我了
补充的:一个手机有多少个应用程序就有多少个DeviceToken,
如果QQ同时推送给多台设备?比如我的QQ手机上登了,IPAD上也登了,这时候取决于QQ服务器的发给苹果的APNS的DeviceToken,发一个就发给一台设备,两个DeviceToken,就发给两台设备.*

你可能感兴趣的:(IOS推送)