偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

國內(nèi)90%以上的 iOS 開發(fā)者,對 APNs 的認(rèn)識都是錯的

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

[[165663]]

前言:

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

正文:

對 APNs 的吐槽

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

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

答案會穿插在下文中。

APNs新聞

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

[[165664]]

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

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

新舊 APNs 協(xié)議工作示意圖對比

接下來我們分別對新舊協(xié)議進(jìn)行一下介紹:

反人類的舊APNs協(xié)議設(shè)計

在介紹新版 APNs 前,讓我們來吐槽下舊的基于二進(jìn)制的 APNs 協(xié)議設(shè)計是多么反人類:

在理論上,推送分發(fā)的服務(wù)器要打開一個同 APNs 網(wǎng)關(guān)服務(wù)器的

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

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

示意圖:

圖中的 PN2 去哪里了?它被放到了 feedback 列表里,等待下次你調(diào)用 feedback 服務(wù),然后重發(fā)。

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

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

(這些監(jiān)督進(jìn)程由一個引導(dǎo)進(jìn)程(bootstrap process)發(fā)起,當(dāng)監(jiān)督進(jìn)程遇到錯誤的時候,引導(dǎo)進(jìn)程會將其重啟)

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

這也可能讓你想到 DNS 服務(wù)發(fā)展史:

DNS 在設(shè)計之初是基于 UDP 的,顯然這樣的設(shè)計不能滿足當(dāng)今社會的準(zhǔn)確性的需求,于是涌現(xiàn)了如 DNSPod 這樣的基于 HTTP 的 DNS 解析服務(wù)。但是當(dāng)時為什么這樣設(shè)計,實際也很好理解,UDP 效率高,一來一回網(wǎng)絡(luò)上傳輸?shù)闹挥袃蓚€包,而 HTTP則需要三次握手三個包,再一拆包,就需要四個包。這是受限于當(dāng)時整個社會的帶寬水平較低,而現(xiàn)在沒人會感激 UDP 所節(jié)省的流量,所有人都在詬病DNS污染問題。這樣你也許就理解了,為什么舊的 APNs 設(shè)計如此反人類。這個是必經(jīng)階段。

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

基于 HTTP/2 的全新 APNs 協(xié)議

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

1)Request 和 Response 支持JSON網(wǎng)絡(luò)協(xié)議

2)APNs支持狀態(tài)碼和返回 error 信息

  • APNs推送成功時 Response 將返回狀態(tài)碼200,遠(yuǎn)程通知是否發(fā)送成功再也不用靠猜了!

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

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

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

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

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

示意圖:

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

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

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

順便介紹下 HTTP/2:

HTTP/2 是 HTTP 協(xié)議發(fā)布后的首個更新,于2015年2月17日被批準(zhǔn)。它采用了一系列優(yōu)化技術(shù)來整體提升 HTTP 協(xié)議的傳輸性能,如異步連接復(fù)用、頭壓縮等等,可謂是當(dāng)前互聯(lián)網(wǎng)應(yīng)用開發(fā)中,網(wǎng)絡(luò)層次架構(gòu)優(yōu)化的首選方案之一。

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

而且如果我們要使用 HTTP/2,那么在網(wǎng)絡(luò)庫的選擇上必然要使用 NSURLSession。

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

Universal Push Notification Client SSL 證書

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

改進(jìn)了,但仍需改進(jìn)。還是有坑

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

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

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

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

這中間發(fā)生了什么?

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

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

為什么這么設(shè)計?APNs的存儲-轉(zhuǎn)發(fā)能力太弱,大量的消息存儲和轉(zhuǎn)發(fā)將消耗Apple服務(wù)器的資源,可能是出于存儲成本考慮,也可能是因為 Apple 轉(zhuǎn)發(fā)能力太弱??傊Y(jié)果就是 APNs 從來不保證消息的達(dá)到率。并且設(shè)備上線之后也不會向服務(wù)器上傳信息。

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

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

對App開發(fā)的影響

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

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

如何創(chuàng)建 Universal Push Notification Client SSL 證書

現(xiàn)在你知道什么是 Universal Push Notification Client SSL 證書了,那么如何創(chuàng)建它?

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

這里也推薦使用 Universal 推送證書來進(jìn)行推送服務(wù)。詳細(xì)的創(chuàng)建步驟如下所示:

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

  • 點擊下圖中紅色邊框內(nèi)的加號按鈕。

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

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

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

  • 根據(jù)它的說明創(chuàng)建 Certificate Signing Request。

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

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

  • 下載證書。

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

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

結(jié)束語

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

參考鏈接:

Configuring Push Notifications

APNs Provider API

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

責(zé)任編輯:倪明 來源: iOS程序犭袁的簡書
相關(guān)推薦

2021-09-01 14:38:35

鴻蒙HarmonyOS應(yīng)用

2017-12-08 08:39:12

2012-10-16 09:33:18

iOS最年輕開發(fā)者

2020-02-11 17:15:09

開發(fā)者拋棄 Executors

2020-02-13 09:14:16

Executors開發(fā)Java

2012-06-13 01:23:30

開發(fā)者程序員

2015-10-30 08:59:34

進(jìn)度落后程序員工作流程

2012-09-19 10:25:56

iPhone 5游戲開發(fā)者

2023-09-28 21:39:26

HutoolJava工具包

2012-05-22 09:50:32

iOSiPhone

2014-03-11 10:17:42

HTML5iOS

2013-08-29 09:53:48

開發(fā)者iOS 7

2016-04-05 10:31:59

ioswwdc2016

2018-01-04 08:54:35

iOS開發(fā)者應(yīng)用

2014-04-04 17:13:13

iOSAndroid開發(fā)技巧

2015-10-21 13:42:54

iOS開發(fā)watch OS2

2011-04-27 09:34:18

Android盈利困境Android

2011-08-09 15:17:07

iOS開發(fā)

2014-04-15 10:21:57

iOS工具集開發(fā)者
點贊
收藏

51CTO技術(shù)棧公眾號