技术分享|手机推送原理剖析指南
源寶導(dǎo)讀:本文旨在對(duì)手機(jī)推送原理進(jìn)行剖析和闡述,對(duì)業(yè)務(wù)開發(fā)做一些方向性的解惑。
一、手機(jī)推送的基本概念?——什么是手機(jī)推送?
百度詞條:手機(jī)推送服務(wù)是指服務(wù)器?定向?qū)⑿畔?shí)時(shí)送達(dá)手機(jī)的服務(wù)
詞條中有2組概念:
第一組是“服務(wù)器”和“手機(jī)”,說明了一條推送消息從哪里啟程(服務(wù)器),到哪里是終點(diǎn)(手機(jī));
第二組是“定向”和“實(shí)時(shí)”,說明推送是可以指定接收者的,并且到達(dá)的速度非常快!
我們平時(shí)所說的“推送”,“通知”,“app推送”,“推送服務(wù)”,“通知消息”,“通知欄消息”等等,指的都是同一個(gè)。
1、在蘋果手機(jī)中的樣式
2、安卓手機(jī)中樣式
3、推送原理
由于移動(dòng)網(wǎng)絡(luò)的限制,服務(wù)器并不能在沒有連接的情況下主動(dòng)發(fā)送信息到移動(dòng)端。所以推送本質(zhì)上都是由手機(jī)設(shè)備發(fā)起,與推送服務(wù)器建立起連接通道(TCP長連接),通道就是保障推送到達(dá)的關(guān)鍵。
在iOS系統(tǒng)中,推送服務(wù)器是由蘋果公司維護(hù),所有的應(yīng)用均使用Apple 推送通知服務(wù) (APNs) 來實(shí)現(xiàn)。
在android系統(tǒng)中,海外有谷歌的GMS,用于推送。GMS全稱為GoogleMobile Service,即谷歌移動(dòng)服務(wù)。當(dāng)然由于眾所周知的原因,國內(nèi)是使用不上的。
APNs和GMS的推送原理基本一致,通過系統(tǒng)建立推送通道,所有應(yīng)用均使用該通道,推送信息由該通道進(jìn)行分發(fā):
其中系統(tǒng)接收到推送信息有兩種可做的行為,一種是通知,一種是透?jìng)鳌?/p>
通知:系統(tǒng)只負(fù)責(zé)彈出下拉欄列表,需要用戶點(diǎn)擊才能喚醒應(yīng)用。
透?jìng)?/strong>:系統(tǒng)將信息投遞給相關(guān)的應(yīng)用,應(yīng)用實(shí)時(shí)收到信息,可以進(jìn)行業(yè)務(wù)邏輯,前提是應(yīng)用未被殺死。
它們的關(guān)系如下:
iOS系統(tǒng)由于國內(nèi)可用APNs服務(wù),所以到達(dá)率相當(dāng)穩(wěn)定。而android系統(tǒng)沒有統(tǒng)一的推送,導(dǎo)致發(fā)展較為緩慢,大致可以分為三個(gè)階段:
1、混沌期
Android早期版本對(duì)于app限制極少,app可以在后臺(tái)一直活著,甚至被殺還能被自動(dòng)拉起。這時(shí)候很多app建立了自己的長連接推送:
這時(shí)候自建推送的技術(shù)門檻還是挺高的,維護(hù)成本也高,用戶體驗(yàn)也不好,經(jīng)常出現(xiàn)性發(fā)熱卡頓等情況,還會(huì)偷偷的上傳用戶行為,畢竟這和植入一個(gè)木馬區(qū)別也不大。
2、門派林立期
隨著android系統(tǒng)權(quán)限的收縮,很少有應(yīng)用可以在后臺(tái)活著了,很多應(yīng)用根本就活不久。加上這時(shí)候各大廠已經(jīng)形成了自己的體系,比如企鵝系,阿里系等等,大廠間的基礎(chǔ)設(shè)施逐漸完善,應(yīng)用活不久沒關(guān)系,只要用戶用了派系中的一個(gè)還是可以相互喚醒的。
而其他應(yīng)用則可以抱團(tuán)使用第三方的推送,第三方也可以實(shí)現(xiàn)使用同一推送間相互喚醒:
3、廠商掌權(quán)期
隨著android版本的進(jìn)一步提升,廠商們開始考慮各種用戶體驗(yàn)問題,喚醒鏈也不好使了。為了電量和性能,app的生存現(xiàn)狀堪憂。
第三方的如極光百度推送自建的推送越來越難到達(dá)了。各大手機(jī)廠商推出了自己的系統(tǒng)推送服務(wù),扮演起了如蘋果般的角色。
到了這個(gè)時(shí)候,推送的原理已經(jīng)APNs基本一致了。
有些廠商比較有野心,像小米除了自家的系統(tǒng)推送外,也支持別的手機(jī),但是此時(shí)它的工作原理就和極光一樣,實(shí)現(xiàn)的是第三方推送了,所以到達(dá)率也和薛定諤的貓差不多,時(shí)靈時(shí)不靈。
小結(jié):
到現(xiàn)在為止,國內(nèi)擁有自主廠商通道主要有華為、小米、oppo、vivo、魅族,這幾家合計(jì)占據(jù)85%以上的android市場(chǎng)份額,接入這幾家廠商推送,可以保障大部分的機(jī)型推送能到達(dá),至于其他小眾品牌,只能依賴第三方推送,第三方推送大家起點(diǎn)都一樣,能否到達(dá)就有點(diǎn)看緣分了。
推送能到達(dá),不一定就能滿足業(yè)務(wù)場(chǎng)景,像網(wǎng)絡(luò)電話直接喚起應(yīng)用的場(chǎng)景,在應(yīng)用死亡的情況下,還是做不到的。
當(dāng)然也有例外,比如微信支付寶等:
加油把自己app做到億級(jí)用戶,你也能有這樣的特權(quán)!
二、業(yè)務(wù)實(shí)踐
那么一個(gè)業(yè)務(wù)如何實(shí)現(xiàn)接入自己的推送呢?
簡單描述一下大致的流程:
1、推送都會(huì)生成一個(gè)設(shè)備ID,這個(gè)設(shè)備ID在一段時(shí)間內(nèi)維持不變。在app啟動(dòng)的時(shí)候應(yīng)該就可以獲取到。
2、將這個(gè)設(shè)備ID和用戶綁定起來,做映射關(guān)系。
3、業(yè)務(wù)推送到用戶的時(shí)候,就轉(zhuǎn)換成設(shè)備ID訪問廠商推送接口。
4、廠商推送將信息送達(dá)用戶。
注意點(diǎn):
1、廠商推送接口一般為http接口,每次訪問有設(shè)備數(shù)量限制,而且有些還有調(diào)用頻率限制,一個(gè)好的實(shí)踐是異步批量調(diào)用,隊(duì)列+切片是常用的做法。
2、有些廠商會(huì)提供回調(diào)接口,用來反饋到達(dá)的情況,可以看情況使用。
準(zhǔn)備工作:
iOS:需要推送證書,在蘋果的開發(fā)者平臺(tái)向蘋果公司申請(qǐng),使用時(shí)候證書和代碼實(shí)現(xiàn)要在一起。
Android:各個(gè)平臺(tái)要求不一樣,大致如下:
平臺(tái) | 地址 | 需要填寫的參數(shù) |
小米 | https://dev.mi.com/console/appservice/push.html | XIAOMI_APP_ID、XIAOMI_APP_KEY |
OPPO | https://push.oppo.com/ | OPPO_APP_KEY、OPPO_APP_SECRET |
VIVO | https://dev.vivo.com.cn/openAbility/pushNews | VIVO_APP_ID、VIVO_APP_KEY |
魅族 | http://push.meizu.com/ | MEIZU_APP_ID、MEIZU_APP_KEY |
可能遇到的問題:
推送收不到!
推送收不到分為2種情況,一種是從來沒有收到過推送;一種是原本推送服務(wù)使用正常,突然收不到推送了!
對(duì)于前者,一般在程序開發(fā)階段就能解決問題,相對(duì)比較簡單; 對(duì)于后者,情況就復(fù)雜一些了。針對(duì)后者出現(xiàn)的情況,需要做如下方向上的排查:
- 手機(jī)能否聯(lián)網(wǎng),網(wǎng)絡(luò)是否通暢?無網(wǎng)時(shí)是不能收到推送的。
- 手機(jī)系統(tǒng)近期是否有發(fā)布新的版本,用戶更新到了新的版本?如果是,則可能需要對(duì)新版本做適應(yīng)性的配置。
- APP的代碼,和服務(wù)端的代碼,近期是否有與推送功能相關(guān)的改動(dòng)?如果有,請(qǐng)排查代碼影響。
iOS推送證書的有效期長度一般為1年,在申請(qǐng)時(shí)即可看到過期時(shí)間!如果使用了第三方服務(wù),第三方僅可以保管證書,不能更新證書。因此推送證書過期后需要重新申請(qǐng)新的證書,并上傳到第三方。
部分第三方服務(wù)提供者,在證書過期時(shí)未能給到明顯的提示。該問題的在排查時(shí)也比較隱蔽,不易發(fā)現(xiàn),因此需要多加注意。
若使用了三方的付費(fèi)服務(wù),也應(yīng)該檢查余額是否充足,欠費(fèi)時(shí)推送服務(wù)會(huì)被停止。不過相對(duì)于證書過期問題的提示,欠費(fèi)的催繳提示會(huì)格外明顯,基本不可能被忽略!比如發(fā)送多份提醒郵件,或第三方客服直接給相關(guān)的負(fù)責(zé)人打電話提醒需要充值續(xù)費(fèi)?。
如果以上情況經(jīng)過排查后均沒有問題,則需要考慮一些不常見的場(chǎng)景和偶發(fā)性的情況,包括但不限于如下所述:
- 用戶對(duì)手機(jī)進(jìn)行了恢復(fù)出廠設(shè)置,之后尚未允許授予APP推送功能權(quán)限
- 用戶對(duì)APP的推送權(quán)限進(jìn)行了手動(dòng)關(guān)閉
- 信號(hào)差、網(wǎng)絡(luò)波動(dòng)導(dǎo)致推送明顯延遲或丟失
- 手機(jī)系統(tǒng)偶爾出現(xiàn)的bug導(dǎo)致推送接收失敗
- 手機(jī)系統(tǒng)提供商的推送服務(wù)器問題
- 其他未知原因…………
解決問題三步曲:
第一步:刪除APP,重新下載安裝后打開,在詢問是否允許授予推送權(quán)限時(shí),點(diǎn)擊“允許” ,然后進(jìn)行推送測(cè)試!
第二步:若第一步未能奏效,請(qǐng)重啟手機(jī),然后進(jìn)行推送測(cè)試!
第三步:說出來你可能不信,如果第二步仍未奏效,請(qǐng)刪除APP后重啟手機(jī),重啟后下載新的APP,打開并允許接收推送,然后進(jìn)行推送測(cè)試!
除此之外根據(jù)推送的原理,如果不在廠商推送的機(jī)型,是極有可能收不到的。
解決的辦法:
1、社會(huì)工程學(xué)。引導(dǎo)客戶設(shè)置通知權(quán)限,開啟白名單。可以提高到達(dá)率,主要機(jī)制是讓應(yīng)用不死那么快,第三方(如小米)可以活著接受到推送。
Android可以參考云助手的推送設(shè)置方式:https://tenants.fdccloud.com/wzsversion/pub-view/wzshelper-for-phone-list
iOS記得給權(quán)限:
1、鈔能力。如果是強(qiáng)時(shí)效性的業(yè)務(wù),建議增加短信、電話等通知。
2、努力把自己變成強(qiáng)勢(shì)的一方,比如每天都億級(jí)活躍用戶。
其他的問題:
特殊場(chǎng)景:如網(wǎng)絡(luò)電話等,可以和廠商談合作,但都有極高的門檻。
其他的需求歡迎咨詢移動(dòng)超級(jí)app一組。
最后歡迎使用移動(dòng)appcloud提供的mpush插件和對(duì)各廠商封裝的PHP-SDK
PHP-SDK:https://packagist.org/packages/yunchuang/push
mpush文檔地址:https://appcloud-static.mypaas.com.cn/plugin/readme/mpush/1.2.4/index.html
----- END ------
作者簡介
弓同學(xué):?研發(fā)工程師,目前負(fù)責(zé)超級(jí)APP平臺(tái)相關(guān)工作。
也許您還想看:
記AWSS3在iOS端的一次改造事件
移動(dòng)平臺(tái)對(duì)于跨平臺(tái)技術(shù)方案的探索
更多明源云·天際開放平臺(tái)場(chǎng)景案例與開發(fā)小知識(shí),可以關(guān)注明源云天際開發(fā)者社區(qū)公眾號(hào):
【集成】新一代集成開放平臺(tái)——星圖你了解嗎?
【建模】ERP日志分表,提升海量日志存取性能
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的技术分享|手机推送原理剖析指南的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于.NET微服务最热门的问题解答
- 下一篇: ML.NET Cookbook:(7)如