成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

國內90%以上的 iOS 開發者,對 APNs 的認識都是錯的

移動開發
APNs 協議在近兩年的 WWDC 上改過兩次,2015年12月17日更是推出了革命性的新特性。但在國內傳播的博客、面試題里關于APNs的答案全都是舊的、錯的。

[[165663]]

前言:

APNs 協議在近兩年的 WWDC 上改過兩次,2015年12月17日更是推出了革命性的新特性。但在國內傳播的博客、面試題里關于APNs的答案全都是舊的、錯的。

正文:

對 APNs 的吐槽

APNs 是 Apple Push Notification service 的簡稱(注意 APNs 的大小寫, s不需要大寫)。

以下是我收集的一些關于 APNs 的吐槽,你先看下哪些吐槽比較“到位”:

答案會穿插在下文中。

APNs新聞

2014年6月份WWDC搭載iOS8及以上系統的iOS設備,能夠接收的最大playload大小提升到2KB。低于iOS8的設備以及OS X設備維持256字節。參考文檔:

[[165664]]

2015年6月份WWDC宣布將在不久的將來發布 “基于 HTTP/2 的全新 APNs 協議”,并在大會上發布了僅僅支持測試證書的版本。參考文檔:

2015年12月17日起,發布 “基于 HTTP/2 的全新 APNs 協議”,iOS 系統以及 OS X 系統,統一將最大 playload 大小提升到4KB。參考文檔:Apple Push Notification Service Update 12-17 2015

新舊 APNs 協議工作示意圖對比

接下來我們分別對新舊協議進行一下介紹:

反人類的舊APNs協議設計

在介紹新版 APNs 前,讓我們來吐槽下舊的基于二進制的 APNs 協議設計是多么反人類:

在理論上,推送分發的服務器要打開一個同 APNs 網關服務器的

連接,并保持這個連接。但在舊的協議下,APNs 服務卻不保證 socket 能維持這個連接。如果通道上沒有消息往來,空閑下來到話,socket將被路由掐斷。也就是說:APNs 連接說斷就斷,而你無能為力。有意思的是:在舊的協議下,如果服務器響應成功的話,你將不會收到任何回應,但是如果服務器響應失敗(例如,使用了一個非法的 Push token),服務器將返回了一個錯誤編碼,并關閉這個socket。最重要的是,你必須重新發送使用這個無效 token 以后發送的所有推送(詳情見示意圖)。因此,你可能一直不能確定你的推送是否成功的被 APNs 服務器接收。

成功了不響應,失敗了才響應,這個是最大的反人類。于是許多開發者想到了一個很 tricky 的辦法:利用這個“漏洞”,比如在每發送10條后故意發送一個錯誤的token,如果APNs有響應了,就可以確認 APNs 是處在可用狀態的,進而確認這10條消息是發送成功的。如果沒有響應就說明可能連接已經中斷,那么這10條消息很可能是丟失的,然后做進一步的處理。但代價顯而易見:將導致你們的推送系統性能低下。(本文中所說到“你們的推送系統”,如果是使用的第三方的SDK完成的推送服務,那么就是指SDK提供商所搭建的推送系統。如果是你們公司自己搭建的推送系統,那么就是指你們自己的推送系統。)蘋果有一個名為"feedback"的服務,我們可以定時調用這個服務來獲取invalid tokens的列表。這個服務你只要調用一次就可以獲得所有的invalid tokens 列表。所以,如果一個應用使用了很多不同公司的推送SDK,他們將會爭奪資源去輪詢查找invalid tokens列表。invalid token越多,你們的推送系統性能將越低。而且 APNs 只要一發生錯誤就關閉這個連接,然后重新連接。也就是“重啟” socket 連接。

示意圖:

圖中的 PN2 去哪里了?它被放到了 feedback 列表里,等待下次你調用 feedback 服務,然后重發。

為什么Apple要在舊APNs中設計出“重啟”的策略?為了效率。就像PC機出問題,我們總說“重啟能解決90%的問題”。

為了理解“重啟”策略,我們可以類比下,熟悉 Erlang/OTP 的朋友可能知道, Erlang/OTP 在處理錯誤方面有獨到之處:監督樹(supervision trees)。大致來說,每一個 Erlang 進程都由一個監督進程發起并監視。當一個進程遇到了問題的時候,它就會退出。當進程退出的時候,其監督進程會將其重啟。

(這些監督進程由一個引導進程(bootstrap process)發起,當監督進程遇到錯誤的時候,引導進程會將其重啟)

其思想是,快速的失敗然后重啟比去處理錯誤要快。像這樣的錯誤處理看起來跟直覺相反 —— 當錯誤發生的時候通過放棄處理來獲得可靠性。但是重啟的確是解決暫時性錯誤的靈丹妙藥。

這也可能讓你想到 DNS 服務發展史:

DNS 在設計之初是基于 UDP 的,顯然這樣的設計不能滿足當今社會的準確性的需求,于是涌現了如 DNSPod 這樣的基于 HTTP 的 DNS 解析服務。但是當時為什么這樣設計,實際也很好理解,UDP 效率高,一來一回網絡上傳輸的只有兩個包,而 HTTP則需要三次握手三個包,再一拆包,就需要四個包。這是受限于當時整個社會的帶寬水平較低,而現在沒人會感激 UDP 所節省的流量,所有人都在詬病DNS污染問題。這樣你也許就理解了,為什么舊的 APNs 設計如此反人類。這個是必經階段。

那么接下來就讓我們看看Apple為解決這些問題而推出的基于 HTTP/2 的全新 APNs 協議。

基于 HTTP/2 的全新 APNs 協議

來看下新版的 APNs 的新特性:

1)Request 和 Response 支持JSON網絡協議

2)APNs支持狀態碼和返回 error 信息

  • APNs推送成功時 Response 將返回狀態碼200,遠程通知是否發送成功再也不用靠猜了!

  • APNs推送失敗時,Response 將返回 JSON 格式的 Error 信息。

3)最大推送長度提升到4096字節(4Kb)

4)可以通過 “HTTP/2 PING ” 心跳包功能檢測當前 APNs 連接是否可用,并能維持當前長連接。

5)支持為不同的推送類型定義 “topic” 主題

6)不同推送類型,只需要一種推送證書 Universal Push Notification Client SSL 證書。

示意圖:

其中最大的變化就是基于了 HTTP/2 協議,采用了長連接設計,并提供 “HTTP/2 PING ” 心跳包功能檢測、維持當前 APNs 連接,解決了老 APNs 無法維持連接的問題。

而且新增的狀態碼特性,也解決了這個問題:無法獲知消息是否成功地從你們的推送系統投遞到了 APNs 上。理論上,你們可以保證消息是100%投遞到了APNs的,因為你可以準確的知道哪條消息到達了APNs,哪些沒到。重發特定失敗消息成為可能。

所以上文開頭的吐槽中第一條,有一句是“不到位的”,因為現在SDK的提供商能夠準確地告訴你哪些消息推送到APNs了,哪些沒有。

順便介紹下 HTTP/2:

HTTP/2 是 HTTP 協議發布后的首個更新,于2015年2月17日被批準。它采用了一系列優化技術來整體提升 HTTP 協議的傳輸性能,如異步連接復用、頭壓縮等等,可謂是當前互聯網應用開發中,網絡層次架構優化的首選方案之一。

Apple 對于 HTTP/2 的態度也非常積極,2015年5月 HTTP/2 正式發表后不久,便在緊接著6月召開的WWDC 2015大會中,向全球開發者宣布,iOS 9 開始支持HTTP/2。

而且如果我們要使用 HTTP/2,那么在網絡庫的選擇上必然要使用 NSURLSession。

我們都知道 HTTP/2 是復用 TCP 管道連接的,而且 HTTP/2 也以高復用著稱,這也使新的 APNs 協議更加高性能。(題外話:這點也同樣體現在 NSURLSession 底層對于每個 session 是對多個 task 進行連接的復用。)

Universal Push Notification Client SSL 證書

在開發中,往往一條內容,需要向多個終端進行推送,終端有:iOS、tvOS、 and OS X devices, 和借助iOS來實現推送的 Apple Watch。在以往的開發中,不同的推送,需要配置不同的推送證書:我們需要配置:dev證書、prod證書、VOIP證書、等等。而從2015年12月17日起,只使用一種證書就可以了,不再需要那么多證書,這種證書就叫做Universal Push Notification Client SSL 證書(下文統一簡稱:Universal推送證書)。

改進了,但仍需改進。還是有坑

APNs的確改進來不少,但仍有需要改進對地方。還是有坑:

除了獲取TLS證書比較復雜未解決外,還有一些坑:

文章開頭提到過以下這種情況:

很遺憾的告訴你,你的吐槽是“到位的”:你以后還得忍受這種反人類的設計。

這中間發生了什么?

當 APNs 向你發送了4條推送,但是你的設備網絡狀況不好,在 APNs 那里下線了,這時 APNs 到你的手機的鏈路上有4條任務堆積,APNs 的處理方式是,只保留最后一條消息推送給你,然后告知你推送數。那么其他三條消息呢?會被APNs丟棄。

有一些 App 的 IM 功能沒有維持長連接,是完全通過推送來實現到,通常情況下,這些 App 也已經考慮到了這種丟推送的情況,這些 App 的做法都是,每次收到推送之后,然后向自己的服務器查詢當前用戶的未讀消息。但是APNs也同樣無法保證這四條推送能至少有一條到達你的 App。很遺憾的告訴這些App,這次的更新對你們所遭受對這些坑,沒有改善。

為什么這么設計?APNs的存儲-轉發能力太弱,大量的消息存儲和轉發將消耗Apple服務器的資源,可能是出于存儲成本考慮,也可能是因為 Apple 轉發能力太弱。總之結果就是 APNs 從來不保證消息的達到率。并且設備上線之后也不會向服務器上傳信息。

所以上文開頭的吐槽中第一條,也有一句是“到位的”,因為現在SDK的提供商依然無法保證,消息推到了 APNs,APNs能推到 App 那里。

但Google Cloud Messaging就有這些特性。而且 GCM 現在也支持iOS設備了,那么 APNs 和 GCM 現在就形成了競爭關系。讓我共同期待 APNs 在2016年6月的 WWDC 的能有新的改進吧。

對App開發的影響

想使用新協議,如果你用的第三方推送,這里最明顯的操作,就是你必須更新到支持新協議的SDK版本。因為新協議需要 SDK 上傳你 app 的 bundle id ,生成各個平臺推送用的 topic。如果你們自己搭建的服務,則需要你自己上傳。老協議不用上傳。

新 APNs 支持 iOS6 等全版本推送內容達4096字節,舊 APNs 是14年6月之前只支持256字節,在此之后支持 iOS8 以上2048字節。以前受限于推送字節,比如推文章 url,開發者選擇超出256后推送id,甚至不判斷直接推 id,接收后再請求完整 url。一旦請求錯誤,推送內容可能丟失。現在可以避免了。

如何創建 Universal Push Notification Client SSL 證書

現在你知道什么是 Universal Push Notification Client SSL 證書了,那么如何創建它?

圖中其他方式,就叫做非 Universal 方式(下文簡稱:非 Universal 推送證書):

這里也推薦使用 Universal 推送證書來進行推送服務。詳細的創建步驟如下所示:

  • 選擇在 Certificates 欄下的“All”。

  • 點擊下圖中紅色邊框內的加號按鈕。

  • 選擇 “Production” 欄下的 “Apple Push Notification service SSL (Sandbox & Production)” 勾選后,點擊下一步。

  • 從 App ID 下拉菜單中選擇你需要的 App ID ,點擊下一步。

  • 這時會出現 About Creating a Certificate Signing Request (CSR)。

  • 根據它的說明創建 Certificate Signing Request。

  • 點擊下圖中的 “Choose File” 按鈕:

  • 上傳剛剛生成的 .certSigningRequest 文件 生成 APNs Push Certificate。

  • 下載證書。

  • 雙擊打開證書,證書打開時會啟動鑰匙串訪問工具。

  • 在鑰匙串訪問工具中,你的證書會顯示在 “證書” 中,注意選擇左下角的 “證書” 和左上角 “登錄”。

結束語

對于 APNs 而言,iOS 9 的這一更新是有劃時代意義的,請即刻敦促你們公司的服務端進行升級,或者使用支持新 APNs 協議的 SDK 進行推送服務。 文中如有錯誤,并請幫忙指正,反饋請發往微博@iOS程序犭袁

參考鏈接:

Configuring Push Notifications

APNs Provider API

HTTP/2 Protocol for iOS Push Notification Server(APNS)

責任編輯:倪明 來源: iOS程序犭袁的簡書
相關推薦

2021-09-01 14:38:35

鴻蒙HarmonyOS應用

2017-12-08 08:39:12

2012-10-16 09:33:18

iOS最年輕開發者

2020-02-11 17:15:09

開發者拋棄 Executors

2020-02-13 09:14:16

Executors開發Java

2012-06-13 01:23:30

開發者程序員

2015-10-30 08:59:34

進度落后程序員工作流程

2012-09-19 10:25:56

iPhone 5游戲開發者

2012-05-22 09:50:32

iOSiPhone

2014-03-11 10:17:42

HTML5iOS

2023-09-28 21:39:26

HutoolJava工具包

2013-08-29 09:53:48

開發者iOS 7

2016-04-05 10:31:59

ioswwdc2016

2018-01-04 08:54:35

iOS開發者應用

2014-04-04 17:13:13

iOSAndroid開發技巧

2015-10-21 13:42:54

iOS開發watch OS2

2011-04-27 09:34:18

Android盈利困境Android

2013-09-12 15:02:54

iOS開發者

2011-08-09 15:17:07

iOS開發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲毛片网站 | 久久久国产精品 | 99这里只有精品 | 成人三区四区 | 国产高清一区二区三区 | 亚洲精品白浆高清久久久久久 | 青青草视频网站 | 在线欧美激情 | 免费在线观看一区二区三区 | 中文字幕av亚洲精品一部二部 | 亚洲人精品 | 色综合天天综合网国产成人网 | 人和拘一级毛片c | 国产精品美女一区二区 | www.五月天婷婷.com | 在线小视频 | 中文字幕亚洲精品 | 中国美女av | 国产精品美女久久久久久免费 | 男女网站免费观看 | japanhd美女动 | 成人天堂噜噜噜 | 亚洲欧美激情网 | 欧美日韩综合视频 | 日韩免费中文字幕 | 男人的天堂视频网站 | 国产精品国产成人国产三级 | 精品一区av | 久久777| 国产激情视频网 | 日韩二三区 | 欧美激情在线播放 | 青青草一区二区三区 | 国产精品五区 | 亚洲入口 | 欧美视频在线播放 | 欧美a级成人淫片免费看 | 亚洲视频在线看 | 99久久久无码国产精品 | 欧美一区在线看 | 精品久久中文 |