首先我们看一下苹果官方给出的对ios推送机制的解释。如下图
apple APNSProvider就是我们自己APP的后台服务器,APNS是Apple Push Notification Service的缩写,也就是苹果的推送服务器。
上图可以分为三个阶段:
第一阶段:应用程序的服务器端把要发送的消息、目的iPhone的标识打包,发给APNS。
第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发送到iPhone。
第三阶段:iPhone把发来的消息传递给相应的应用程序,并且按照设定弹出Push通知。
APNS推送通知的详细工作流程
下面这张图是说明APNS推送通知的详细工作流程:
根据图片我们梳理一下详细步骤:
1. APP注册APNS消息推送。
a. 只有注册过的APP才有可能接收到消息,APP中通常通过
UIApplication
的registerUserNotificationSettings:
方法注册,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 token
(device 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
,下次不再发送)。
网友评论