iOS APNs的幾個問題

weixin_34402408發表於2017-03-16

1、關於推送機制:

1859207-45df89870a8a7253.jpg
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都是固定的。官方連結描述

當要傳送訊息時後臺按照如下格式拼接,


1859207-eb7984156cf45c71.png
pushformat.png

然後APNs在按照此格式解析資料得到所需的token,然後傳送給ios裝置。

1859207-b6c92698290caebe.jpg
夢想在其他都會在.jpg

THE END

相關文章