如下圖如示
就是APP的服務端在使用者未打開APP程序時,還能發通知給使用者APP的服務技術
Provider:提供推送的第三方服務系統
Device:蘋果裝置,例如iphone和ipad等
APNS:蘋果推送消息服務,屬于蘋果的服務
APP:安裝在蘋果裝置上的應用程式
DeviceToken:裝置的辨別,用于确定接收通知的裝置及APP
Payload:推送消息的傳輸形式

從上圖可以看出Provider與APNS之間是要建立連接配接的,APNS和Device之間也是要建立連接配接的,這兩個連接配接都是加密的,采用的TLS的方式,加密用的證書是在蘋果官方網站上購買生成的,這個證書分兩種,一種是“開發者證書”,使用開發者證書的APP可以釋出在APPSTORE上面,開發者證書的使用費是每年99美元,另一種是“企業證書”,使用企業證書的APP隻能發在企業内部市場,不能發在APPSTORE上,企業證書的年費是299美元,企業證書對安裝人數是沒有限制的,但開發者證書對APP的安裝人數是有限制的,但從APPSTORE上安裝則沒有限制。
安全連接配接的建立方式如圖:
Provider如何取得DeviceToken呢?具體如圖所示:
擷取是由APP通過注冊服務後取得DeviceToken,然後傳給Provider。由于這個DeviceToken是會變的,是以最好是APP在每次啟動時都能注冊一下,擷取最新的DeviceToken
IOS下的注冊擷取DeviceToken的代碼官方給出如下:
Provider和APNS之間是一個安全的Socket連接配接,傳輸的是規定格式的二進制資料,如下形式
當然,這個就是TCP封包,然而具體的封包又有好幾種,有發送普通消息的傳輸形式,有擷取錯誤響應的傳輸形式,還有擷取回報的封包形式等,對于普通的發消息的封包格式如圖如示:
最前面1個位元組是指令類型,2-3位元組是DeviceToken的長度,後面是DeviceToken的具體值,後面是消息的長度和消息的具體内容。發完消息後,在關閉Socket前還可以檢視錯誤的響應,以便确認消息是否成功地發給APNS,錯誤響應的封包如下:
指令為8的表示是錯誤響應的封包,Status是錯誤碼,Identifier是用于定位具體的哪條推送消息,這個是增強型通知裡的傳入的值,首先看下蘋果都有哪些傳回錯誤碼:
再看下Identifier傳入使用的增強型的通知封包格式:
官方給出發送普通消息的C++代碼如下:
發送增強的通知消息的代碼:
還有一個重要的概念是角标,如下:
這個角标是推送消息裡傳的,可以指定,這個要看具體的業務怎麼定了,用于提醒使用者未讀消息個數。
了解了以上原理和過程,相信用什麼語言都可以寫Provider程式了,本人基于java語言也簡單寫了個demo,可以支援多個應用的推送,等完善了就可以放github了