iOS APNs的几个问题

1、关于推送机制:

APNs推送机制

从上图我们可以看到大概:

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

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

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

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

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

2、关于Certificates:

除了APP 的开发证书、发布证书之外,还需要个给我们server的SSL证书,此证书用于server与APNs发送数据的加密和安全认证。

在APPID配置中生成该证书(和其他证书一样有两种即Development SSL Certificate、Production SSL Certificate),以开发环境为例:下载证书是aps_development.cer
在钥匙串中。这个证书就是我们的server需要的,后台的开发语言不同这个证书的格式也不同,所以根据不同的后台要对证书格式转换。

  • 如果是PHP后台:需要把证书转为aps_development.pem格式,同时导入该证书的秘钥key.p12文件也转为.pem格式。打开终端操作如下步骤:
1、将aps_development.cer转换为pem文件。
$ openssl x509 -in aps_development.cer -inform der -out aps_development.pem

2、将p12私钥文件转换为pem文件。
$ openssl pkcs12 -nocerts -out key.pem -in key.p12 

3、将两个文件合成同一个。
$ cat aps_development.pem key.pem > ck.pem

4、测试证书是否有效。
$ openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert aps_development.pem -key key.pem 
如果有效的话,会输出一堆信息,并且建立连接,否则不会成功建立连接。

最终的ck.pem就是要交给后台的证书文件,如果有还需证书的密码。

  • 如果java后台:证书安装后导出.p12格式。

无论是Development SSL Certificate还是Production SSL Certificate 都有过期时间的。而ProductionPush SSL Certificate的有效期是一年。需要注意在过期之前生成新的证书给server,以免影响使用。

3、关于deviceToken:

首先清楚开发环境和生产环境下的deviceToken是不一样的。同一环境下token也是会变的,比如系统恢复设置或刷机操作。

app向iOS系统注册通知后,APNs 会返回这个标记该设备唯一性的token,然后把这个token传给我们的server作为推送消息的目标设备标记。

每次要推送消息时,sever从数据库取出deviceToken,如果用户把我们的app删了,再发送消息肯定是收不到了,所以server要不断的更新数据库的deviceToken去掉那些无效的deviceToken。APNs的The Feedback Service就是解决这个场景的问题的。当APNs发送消息给iOS设备时,由于根据APPID信息找不到该应用所以发送失败,会给APNs反馈信息标记该token。所以server通过这里可以获取无效的token然后数据库中清除。

4、关于APNs接口:

消息推送:

开发接口:gateway.sandbox.push.apple.com:2195

发布接口:gateway.push.apple.com:2195

反馈服务:

开发接口:feedback.sandbox.push.apple.com:2196

发布接口:feedback.push.apple.com:2196

所以不同的环境下、不同的证书、不同的地址、不同的token,所以实际中要注意能够一一对应,否则无法完成消息推送。

5、关于消息格式:

消息就是一json 格式的字典,eg:

{
    "aps" : {
        "alert" : {
            "title" : "Game Request",
            "body" : "Bob wants to play poker",
            "action-loc-key" : "PLAY"
        },
        "badge" : 5
    },
    "acme1" : "bar",
    "acme2" : [ "bang",  "whiz" ]
}

消息最大长度不是网上很多说的256了,根据使用的HTTP版本不同而不同了,所以大多现在http1.0,最大长度也就是2K。官方描述如下:

For regular remote notifications, the maximum size is 4KB (4096 bytes)
For Voice over Internet Protocol (VoIP) notifications, the maximum size is 5KB (5120 bytes)
NOTE
If you are using the legacy APNs binary interface to send notifications instead of an HTTP/2 request, the maximum payload size is 2KB (2048 bytes)

以上字典中的key都是固定的。官方链接描述

当要发送消息时后台按照如下格式拼接,


pushformat.png

然后APNs在按照此格式解析数据得到所需的token,然后发送给ios设备。

梦想在其他都会在.jpg

THE END

你可能感兴趣的:(iOS APNs的几个问题)