iOS远程推送

远程推送在iOS或者andriod中都有很广泛的应用,有很多的第三方推送平台集成。我这篇博客不是介绍怎么使用第三方平台来完成推送功能,而是讲解推送的过程及原理。

一、推送的五种形态

1. 在屏幕顶部显示一块横幅(显示具体内容)

2. 在屏幕中间弹出一个UIAlertView(显示具体内容)

3. 在锁屏界面显示一块横幅(显示具体内容)

4. 更新app图标的数字,即角标(说明新内容的数量)

5. 播放音效(提醒作用)

二、APNs

APNs是苹果的远程推送通知服务,全拼为 Apple Push Notification services。 APNs是长连接。所有的苹果设备,在联网状态下,都会与苹果服务器建立长连接。

关于长连接

1. 什么是长连接?

只要联网了,就一直建立连接 (相比较而言,http协议一般使用的是短连接)。

2. 长连接的作用?

2.1)时间校准

2.2)系统升级

2.3)查找我的iPhone

.....

3. 长连接的好处?

3.1)数据传输速度快

3.2)数据保持最新状态

三、远程推送流程及原理说明

先看看远程推送的流程图:

iOS远程推送_第1张图片

PS:下面的描述,均假设应用有远程推送的功能。

1. 当你打开某个应用,即进入启动状态后,此应用会向苹果的APNs服务发送 SSL connect连接,并发送请求。

现在很多的推送都有集成,如果自己手动发送这一请求的话,可以在程序启动的代码中加入以下代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    // 程序开始,注册远程通知
    // (注意:要将Build Settings --> Provisioning profile中的文件修改为生成的Provision file, 比如这里生成的文件PushTest.mobileprovision)
    UIUserNotificationSettings * settings =[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge categories:nil];
    [application registerUserNotificationSettings:settings];
    
    [application registerForRemoteNotifications];
}

代码中的最后一句,就是向APNs服务器发送请求,告诉APNs服务器此应用需要远程推送服务。 以上所述,就是流程图中的步奏一。


2. 苹果的APNs服务器接受到请求后,会将用户的UIID和appid经过加密算法得到deviceToken.

在AppDelegate中的两个代理方法中,我们可以查看相关的设备是否具有远程推送的功能。

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    // 苹果APNs服务响应之后,会返回deviceToken
    // 然后可以将deviceToken发送给公司的服务器
    NSLog(@"%@",deviceToken);
}

- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
{
    NSLog(@"Error");
}

如果成功,可以获取到deviceToken,可以将这些deviceToken信息保存到自己公司的数据库中,用来实现用户之间的消息推送,下面会叙述到。以上所述,就是流程图中的步奏二,三,四。


3. 现在假设客户端用户 "张三" 向 "李四" 发送了一条消息,首先这一操作,会向QQ的服务器发送请求,请求成功后,会在QQ的数据库列表中查找是否存在李四的deviceToken (保存deviceToken已经在第2步中代理请求成功中完成) ,如果找到,则此时把相关的推送信息发送给APNs,APNs收到消息后,立刻会将信息推送给李四。这一系列的操作,正如流程图中红线的标注。


Question: 为什么腾讯不将用户之间的消息传递,直接通过自己公司的服务器完成相关的推送的功能?

因为腾讯自己的服务器是建立在短连接基础上的,具有接受消息的功能,而不具有主动推送消息的功能。

你可能感兴趣的:(ios,服务器,应用,长连接,远程推送)