在 iOS 平臺(tái)上,,大部分應(yīng)用是不允許在后臺(tái)運(yùn)行并連接網(wǎng)絡(luò)的,。在應(yīng)用沒(méi)有被運(yùn)行的時(shí)候,只能通過(guò) Apple Push Notification Service (APNs) 把數(shù)據(jù)發(fā)送到終端用戶,。對(duì)于互聯(lián)網(wǎng)應(yīng)用,,正確高效的使用 APNs 顯然非常重要。 JPush 為 iOS,、Android 平臺(tái)提供了一個(gè)統(tǒng)一推送消息的平臺(tái),,而對(duì) APNs 接口的封裝管理是其中非常重要的一部分。本文分享一下 JPush 團(tuán)隊(duì)在使用 APNs 過(guò)程中碰到的問(wèn)題以及我們的解決辦法,,以幫助應(yīng)用開(kāi)發(fā)者更好的理解 APNs,。 Apple 為應(yīng)用開(kāi)發(fā)者提供了一個(gè) APNs 推送接口,稱為 binary interface,。 Binary Interface V1最初版本的 binary interface 協(xié)議如下圖,,這里我們稱之為 v1,。 Binary Interface V1 v1 協(xié)議有幾個(gè)問(wèn)題:
也就是說(shuō)如果我們給一批用戶發(fā)消息,,只要有一個(gè) deviceToken 不合法,,將會(huì)有可能造成若干個(gè)用戶收不到消息。并且沒(méi)辦法確認(rèn)哪些 deviceToken 不合法,,哪些 deviceToken 需要被重發(fā),。這應(yīng)該是 APNs 丟消息的一個(gè)重要的原因。 Binary Interface V2經(jīng)過(guò)開(kāi)發(fā)者不斷的向 Apple 反饋這個(gè)問(wèn)題,,Apple 終于推出了一個(gè)新版本的 binary interface,,稱為 enhanced binary interface,我們稱這為 v2,。 Binary Interface V2 我們發(fā)現(xiàn),,在 v1 的基礎(chǔ)上增加了兩個(gè)字段: Identifier —— 一個(gè)任意的值,用于一條消息的識(shí)別,。如果發(fā)送出現(xiàn)問(wèn)題,,錯(cuò)誤應(yīng)答里會(huì)把 Identifier 帶回來(lái)。 Expiry —— 離線消息超時(shí)的時(shí)間,,如果為0或者小于0,,APNs 不會(huì)保存這條消息。 和 v1 一樣,,如果消息發(fā)送沒(méi)有問(wèn)題,,APNs 不會(huì)有任何返回。和 v1 不同,,并且很重要的改進(jìn)是,,如果發(fā)送出現(xiàn)錯(cuò)誤,v2 會(huì)在斷鏈之前返回一個(gè)錯(cuò)誤應(yīng)答,,帶上發(fā)消息時(shí)的 Identifier 和一個(gè)錯(cuò)誤碼,。 error-response packet 根據(jù)這個(gè)錯(cuò)誤應(yīng)答,我們有機(jī)會(huì)找到是哪條消息發(fā)送出錯(cuò),,并確定哪些消息需要被重發(fā),。 JPush 的解決辦法為了確保每一位用戶都能正確的收到消息,,JPush 目前已經(jīng)放棄 binary interface v1,完全采用 binary interface v2,。(在我寫這篇文章時(shí),,發(fā)現(xiàn) Apple 已經(jīng)把文檔中對(duì) binary interface v1 的描述移除,看來(lái) Apple 也已經(jīng)放棄 v1) 在系統(tǒng)設(shè)計(jì)上,,我們?yōu)槊恳粋€(gè) APNs 鏈接維護(hù) 一個(gè)已發(fā)送列表,,按發(fā)送的先后順序排序。如果收到發(fā)送錯(cuò)誤應(yīng)答,,根據(jù)返回的 Identifier 找到出錯(cuò)的消息,,從該消息的下一條重新開(kāi)始發(fā)送。 發(fā)送隊(duì)列 總結(jié)為了持續(xù)提高 JPush 推送服務(wù)的質(zhì)量,,我們團(tuán)隊(duì)做了很多研究和嘗試,。APNs 管理模塊我們最初用 C 語(yǔ)言實(shí)現(xiàn)了一個(gè)版本,后來(lái)覺(jué)得用 Erlang 實(shí)現(xiàn)可能更方便,,所以又從頭開(kāi)始學(xué)習(xí) Erlang 并重新用 Erlang 寫了一個(gè)版本,,目前使用效果良好。 在 APNs 管理系統(tǒng)改造的過(guò)程中,,包括 JPush 的其他模塊,,都大量的使用了開(kāi)源的模塊或者系統(tǒng),為了回饋開(kāi)源社區(qū),,我們準(zhǔn)備把 APNs 管理系統(tǒng)的 Erlang 實(shí)現(xiàn)開(kāi)放源碼,,敬請(qǐng)期待。 參考
No related posts. |
|