iOS APNs的幾個問題
1、關於推送機制:
從上圖我們可以看到大概:
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都是固定的。官方連結描述
當要傳送訊息時後臺按照如下格式拼接,
然後APNs在按照此格式解析資料得到所需的token,然後傳送給ios裝置。
THE END
相關文章
- 幾個 iOS 端底層網路問題iOS
- iOS程式設計師面試要注意的幾個問題~iOS程式設計師面試
- Java面試常問的幾個問題Java面試
- Typora 使用中的幾個問題
- 面試官常問的Nginx的幾個問題面試Nginx
- iOS編碼需要注意的幾點問題iOS
- azkaban 安裝中的幾個問題
- 入行 AI 的幾個常見問題AI
- Redis學習的幾個小問題Redis
- 圖靈社群的幾個小問題圖靈
- 搭建dataguard碰到的幾個小問題
- 最近遇到的幾個LINUX問題Linux
- 面試官常問的Nginx的那幾個問題?面試Nginx
- 【技術學院】iOS APNs實戰分享iOS
- C語言初學者最常問的幾個問題C語言
- Swift ABI 穩定後的幾個問題Swift
- 有關 socialiteproviders 存在的幾個問題IDE
- npm module 釋出 遇到的幾個問題NPM
- 關於ImageView的幾個常見問題View
- 開發以太坊遇到的幾個問題
- 關於解決問題的幾個段位
- linux下幾個問題的除錯Linux除錯
- HTML5Canvas遇到的幾個問題HTMLCanvas
- itm UA編寫注意的幾個問題
- Linux下使用mozilla的幾個問題Linux
- 一個毫無道理的iOS問題iOS
- mysql叢集02:幾個問題MySql
- 邦芒面試:面試時要問清楚的幾個問題面試
- 跨域請求中常見的幾個問題跨域
- Python import 時要注意的幾個問題PythonImport
- Vue 實踐過程中的幾個問題Vue
- 購買硬碟應該注意的幾個問題硬碟
- GCD 容易讓人迷惑的幾個小問題GC
- 關於網路安全幾個問題的整理
- Mysql6.0連線中的幾個問題MySql
- Web應用開發中的幾個問題Web
- 解決mysql出現幾個l的問題MySql
- 今晚實施goldengate遇到的幾個問題Go