美文网首页
问题:Push Notification 是如何工作的?

问题:Push Notification 是如何工作的?

作者: 姜小舟 | 来源:发表于2020-08-25 09:47 被阅读0次

首先我们看一下苹果官方给出的对ios推送机制的解释。如下图

apple APNS

Provider就是我们自己APP的后台服务器,APNS是Apple Push Notification Service的缩写,也就是苹果的推送服务器。
上图可以分为三个阶段:
第一阶段:应用程序的服务器端把要发送的消息、目的iPhone的标识打包,发给APNS。
第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发送到iPhone。
第三阶段:iPhone把发来的消息传递给相应的应用程序,并且按照设定弹出Push通知。

APNS推送通知的详细工作流程
下面这张图是说明APNS推送通知的详细工作流程:

image

根据图片我们梳理一下详细步骤:

1. APP注册APNS消息推送。

a. 只有注册过的APP才有可能接收到消息,APP中通常通过UIApplicationregisterUserNotificationSettings:方法注册,iOS8中通知注册的方法发生了改变,如果是iOS7及之前版本的iOS请参考其他代码。

b. 注册之前有两个前提条件必须准备好:开发配置文件(provisioning profile,也就是.mobileprovision后缀的文件)的App ID不能使用通配ID必须使用指定APP ID并且生成配置文件中选择Push Notifications服务,一般的开发配置文件无法完成注册;应用程序的Bundle Identifier必须和生成配置文件使用的APP ID完全一致。

2、iOS从APNS Server获取devicetoken,APP接收device token。

a. 在UIApplication-(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken代理方法中获取令牌,此方法发生在*第一步APP注册APNS消息推送*之后。

b. 如果无法正确获得device token可以在UIApplication-(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error代理方法中查看详细错误信息,此方法发生在获取device token失败之后。

c. 必须真机调试,模拟器无法获取device token

3、APP将device token发送给App的PUSH服务端。

a. device token的生成算法只有Apple掌握,为了确保算法发生变化后仍然能够正常接收服务器端发送的通知,每次APP启动都重新获得device tokendevice token的获取不会造成性能问题,苹果官方已经做过优化)。

b. 通常可以创建一个接口发送给APP的服务器端, 在这个过程中最好将上一次获得的device token存储起来,避免重复发送,一旦发现device token发生了变化最好将原有的device token一块发送给服务器端,服务器端删除原有令牌存储新令牌避免服务器端发送无效消息。

4、APP的服务端向苹果APNS服务器发送消息。

APP的服务端把要发送的消息、目的iPhone的标识打包,发给苹果APNS服务器。即APP的服务端发送device token和消息内容,并且完全按照苹果官方的消息格式组织消息内容打包,发给苹果APNS服务器。

5、苹果APNS服务器将消息发送给iPhone应用程序。

a. 苹果APNS服务器在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发送到iPhone。iPhone把发来的消息传递给相应的应用程序,并且按照设定弹出Push通知。

b. 正常情况下可以根据device token将消息成功推送到APP设备中,但是也不排除用户卸载程序的情况,此时推送消息失败,苹果APNS服务器会将这个错误消息通知APP的服务端以避免资源浪费(服务端此时可以根据错误删除已经存储的device token,下次不再发送)。

相关文章

网友评论

      本文标题:问题:Push Notification 是如何工作的?

      本文链接:https://www.haomeiwen.com/subject/zyysjktx.html