從上圖可以看出划滋,JPush iOS Push 包括 2 個(gè)部分,APNs 推送(代理)腰湾,與 JPush 應(yīng)用內(nèi)消息雷恃。
紅色部分是 APNs 推送,JPush 代理開(kāi)發(fā)者的應(yīng)用(需要基于開(kāi)發(fā)者提供的應(yīng)用證書(shū))费坊,向蘋(píng)果 APNs 服務(wù)器推送倒槐。由 APNs Server 推送到 iOS 設(shè)備上。
藍(lán)色部分是 JPush 應(yīng)用內(nèi)推送部分附井,即 App 啟動(dòng)時(shí)讨越,內(nèi)嵌的 JPush SDK 會(huì)開(kāi)啟長(zhǎng)連接到 JPush Server两残,從而 JPush Server 可以推送消息到 App 里。
APNs 通知
APNs 通知:是指通過(guò)向 Apple APNs 服務(wù)器發(fā)送通知把跨,到達(dá) iOS 設(shè)備人弓,由 iOS 系統(tǒng)提供展現(xiàn)的推送。用戶可以通過(guò) IOS 系統(tǒng)的 “設(shè)置” >> “通知” 進(jìn)行設(shè)置着逐,開(kāi)啟或者關(guān)閉某一個(gè) App 的推送能力崔赌。
JPush iOS SDK 不負(fù)責(zé) APNs 通知的展現(xiàn),只是向 JPush 服務(wù)器端上傳 Device Token 信息耸别,JPush 服務(wù)器端代理開(kāi)發(fā)者向 Apple APNs 推送通知峰鄙。
應(yīng)用內(nèi)消息
應(yīng)用內(nèi)消息:JPush iOS SDK 提供的應(yīng)用內(nèi)消息功能,在 App 在前臺(tái)時(shí)能夠收到推送下來(lái)的消息太雨。App 可使用此功能來(lái)做消息下發(fā)動(dòng)作吟榴。
此消息不經(jīng)過(guò) APNs 服務(wù)器,完全由 JPush 提供功能支持囊扳。
APNs通知與應(yīng)用內(nèi)消息對(duì)比
如果只需要發(fā)送通知吩翻,則可以忽略應(yīng)用內(nèi)消息的處理。對(duì)于兩種消息的代碼處理可以參考API 部分的描述锥咸。
JPush API v3 支持同時(shí)一次調(diào)用同時(shí)推送 APNs 通知與 JPush 應(yīng)用內(nèi)消息狭瞎。這在某些應(yīng)用場(chǎng)景里是有意義的。
APNS應(yīng)用內(nèi)消息
推送原則由JPush服務(wù)器發(fā)送至APNS服務(wù)器搏予,再下發(fā)到手機(jī)熊锭。由JPush直接下發(fā),每次推送都會(huì)嘗試發(fā)送雪侥,如果用戶在線則立即收到碗殷。否則保存為離線。
離線消息離線消息由APNS服務(wù)器緩存按照Apple的邏輯處理速缨。用戶不在線JPush server 會(huì)保存離線消息,時(shí)長(zhǎng)默認(rèn)保留一天锌妻。離線消息保留5條。
推送與證書(shū)環(huán)境應(yīng)用證書(shū)和推送指定的iOS環(huán)境匹配才可以收到旬牲。自定義消息與APNS證書(shū)環(huán)境無(wú)關(guān)仿粹。
接收方式應(yīng)用退出,后臺(tái)以及打開(kāi)狀態(tài)都能收到APNS需要應(yīng)用打開(kāi)原茅,與JPush 建立連接才能收到吭历。
展示效果如果應(yīng)用后臺(tái)或退出,會(huì)有系統(tǒng)的APNS提醒擂橘。
如果應(yīng)用處于打開(kāi)狀態(tài)晌区,則不展示。
非APNS,默認(rèn)不展示契讲。可通過(guò)獲取接口自行編碼處理滑频。
處理函數(shù)Apple提供的接口:didReceiveRemoteNotificationJPush提供的接口:networkDidReceiveMessage
為什么iOS收不到推送消息捡偏?
如果你確認(rèn) appKey 在 SDK 客戶端與 Portal 上設(shè)置是一致,其他環(huán)節(jié)也按照文檔正確地操作峡迷。但還是收不到推送消息银伟。那么,有一定的可能性绘搞,是你在 Portal 上上傳的證書(shū)彤避,不是 APNs (Push) 證書(shū)。推送時(shí)指定的iOS推送環(huán)境和應(yīng)用證書(shū)是同一個(gè)環(huán)境夯辖。
請(qǐng)參考iOS 證書(shū)設(shè)置指南再次檢查證書(shū)選擇是否正確琉预。
請(qǐng)注意:iOS能接受消息的必要條件是:應(yīng)用程序的證書(shū)要和你上傳到j(luò)push portal上的證書(shū)對(duì)應(yīng),如果你的程序是直接在xcode上運(yùn)行的蒿褂,你的應(yīng)用部署環(huán)境必須是開(kāi)發(fā)狀態(tài)才能收到APNS消息圆米。
溫馨提示:目前api推送的時(shí)候可以通過(guò)參數(shù)apns_production可以指定推送環(huán)境,false為開(kāi)發(fā)環(huán)境啄栓,true為生產(chǎn)環(huán)境娄帖。V3 api不帶此參數(shù)則默認(rèn)為生產(chǎn)環(huán)境,V3 api封裝的sdk 默認(rèn)為開(kāi)發(fā)環(huán)境昙楚。如果api有傳apns_production則以此值為準(zhǔn)近速,否則以應(yīng)用詳情的部署環(huán)境為準(zhǔn)。
注意這里的參數(shù)apns_production 根據(jù)后臺(tái)設(shè)置的參數(shù)堪旧,和客戶端設(shè)置的參數(shù)削葱,兩者配置的參數(shù)一直的話,才會(huì)收到通知淳梦,所以在驗(yàn)證的時(shí)候佩耳,一定要確定客戶端和后臺(tái)傳遞的參數(shù)是一致的,避免因參數(shù)不一致導(dǎo)致的時(shí)間浪費(fèi)谭跨,因?yàn)檫@個(gè)參數(shù)是有默認(rèn)值的干厚。