天天看点

ios苹果推送-APNS

什么是远程推送通知

顾名思义,就是从远程服务器推送给客户端的通知(需要联网)远程推送服务,又称为APNs(Apple Push Notification Services)

为什么需要远程推送通知

  • 传统获取数据的局限性 只要用户关闭了app,就无法跟app的服务器沟通,无法从服务器上获得最新的数据内容
  • 远程推送通知可以解决以上问题 不管用户打开还是关闭app,只要联网了,都能接收到服务器推送的远程通知

远程推送通知使用须知

  • 所有的苹果设备,在联网状态下,都会与苹果的服务器建立长连接 什么是长连接 只要联网了,就一直建立连接
  • 长连接的作用 时间校准 系统升级 查找我的iPhone .. ...
  • 长连接的好处 数据传输速度快 数据保持最新状态

推送原理

苹果推送其实就是借助了苹果的APNS来推送的。

步骤:

1:向apns请求注册通知,需不需要要进行通知发送。(一般都在didFinishLaunchingWithOptions方法里)

2:请求完毕,apns同意,返回给你token,(代码是didReceiveRemoteNotification方法,如果是第三方,则把token传给第三方保存,如果是你们自己写的,则传给你们的服务器保存。)

3:现在要发通知了:服务器把token和消息一起发送给apns,apns根据token查找对应的设备,然后发送。

4:当设备已接收到远程通知,

    *  程序运行状态,:调用application:didReceiveRemoteNotification:方法

    *  当程序处于后台或者被杀死状态,当你进入(aunch)程序时:调用application:didReceiveRemoteNotification:fetchCompletionHandler:来处

        理你需要做的事情,比方:除了badge、保存数据、发送消息、弹框等等。

总:apns就是一个中转站,你的所有的消息不是直接发送,需要经过apns这个中转站倒手才能发送过去。

具体图例

ios苹果推送-APNS
ios苹果推送-APNS

根据图片我们可以概括一下:

1、应用程序注册APNS消息推送。

2、ios从APNS Server获取devicetoken,应用程序接收device token。

3、应用程序将device token发送给程序的PUSH服务端程序。

4、服务端程序向APNS服务发送消息。

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

问题

1:Device token for an iPhone device生成之后就永远不变吗?

不是,if a device is wiped (应该是重装系统), it will get a new device token. 

官方网站是这样写的: If the user restores backup data to a new device or computer, or reinstalls the operating system, the device token changes

正是因为device有可能改变,所以建议在app start时(即在didFinishLaunchingWithOptions  里)调用registerForRemoteNotificationTypes来获取device token以检查device token是否改变,如果改变了就应该把新token传给push provider。(官方描述:An application should register every time it launches and give its provider the current token)

device token应该存储在NSUserDefaults来达到新旧比较的目的

那么旧device token在push provider对应的record怎么办?

方案1:把旧device token send to provider and request delete record

方案2:使用apns feedback service。

方案2可能更好些,因为总是需要使用apns feedback service来处理用户在device里删除app的情况。

调用registerForRemoteNotificationTypes方法后,成功注册后,APNS就会返回一个device token,然后回调delegate methoddidRegisterForRemoteNotificationsWithDeviceToken, 如果注册失败,则回调delegate method didFailToRegisterForRemoteNotificationsWithError。

注意:

* 在第一次调用registerForRemoteNotificationTypes方法时没有联网,则既不会调用didRegisterForRemoteNotificationsWithDeviceToken,也不会调用didFailToRegisterForRemoteNotificationsWithError

*在第一次调用registerForRemoteNotificationTypes注册成功后,之后即使没有联网,再调用registerForRemoteNotificationTypes时都会以最上一次的device token作为参数回调didRegisterForRemoteNotificationsWithDeviceToken方法。

其他

准备证书类的工作都是一样的,可以查看这个连接

友情链接 http://www.51testing.com/html/46/249846-857789.html

继续阅读