? ? 由于谷歌服務(wù)在國內(nèi)不能用,Android 的推送真是一大痛點(diǎn)俱两,但也推動了國內(nèi)一批做第三方服務(wù)的廠商饱狂。第三方推送做的比較好的有極光、個推宪彩、百度休讳、友盟,經(jīng)過比較之后毯焕,最后選擇了極光推送衍腥。其實(shí)這些第三方推送之間的差別并不太大,技術(shù)上都沒問題纳猫,能不能收到推送婆咸,關(guān)鍵還是看前端進(jìn)程是不是還活著,這也是影響推送成功率的關(guān)鍵芜辕。從我們App來看尚骄,Android的成功率一直不高,還不到iOS的五分之一侵续。
????前面說了倔丈,影響推送成功的關(guān)鍵是前端進(jìn)程是否活著,App想要收到推送的話状蜗,就要一直在后臺運(yùn)行需五,還有一些流氓軟件,為了長期在后臺運(yùn)行轧坎,充分利用Android系統(tǒng)的開放性宏邮,無所不用其極,這也是早期Android給人體驗(yàn)差的一個重要原因。后來Android系統(tǒng)加強(qiáng)了對后臺進(jìn)程的限制蜜氨,尤其是國內(nèi)的手機(jī)廠商械筛,在對付國產(chǎn)軟件方面,有很高的造詣飒炎,甚至有的手機(jī)廠商就只給微信開了特權(quán)埋哟,其他軟件到后臺幾分鐘就被殺掉或凍結(jié)了。這樣用戶體驗(yàn)是上來了郎汪,但是對于推送來說赤赊,真是雪上加霜。
? ? 還好怒竿,小米砍鸠、華為等手機(jī)廠商也意識到了這個問題扩氢,紛紛推出了自家的推送服務(wù)耕驰。想從根本上解決Android的問題,還得依賴這些廠商呀录豺!2017年10月16日朦肘,工信部也聯(lián)合國內(nèi)各大廠商和互聯(lián)網(wǎng)公司,發(fā)起成立了統(tǒng)一推送聯(lián)盟双饥,致力于解決Android推送問題媒抠,統(tǒng)一推送標(biāo)準(zhǔn),但估計(jì)看到成果還需要些時日咏花,遠(yuǎn)水解不了近渴趴生。于是最近抽時間,研究了華為昏翰、小米苍匆、OPPO、VIVO這幾家國內(nèi)主流廠商的服務(wù)棚菊。
? ? 通過對各家推送服務(wù)SDK的研究浸踩,將分別對每家的推送進(jìn)行分析,最終給出整合意見统求。
????先放上各家推送服務(wù)傳送門:華為检碗,小米,VIVO码邻,OPPO折剃。
?華為:
? ? 感覺華為推送的文檔比較少,可能跟他的功能太簡單有關(guān)像屋。首先需要解釋下幾個名詞:Hms(華為移動服務(wù))怕犁,NC(通知中心)。通知欄推送:即常規(guī)的推送,消息抵達(dá)時由NC因苹,或者是小米/VIVO/OPPO/等推送服務(wù)彈出通知欄苟耻。透傳:可簡單理解為格式自由定義,不彈起通知欄的推送扶檐,且透傳一般情況下需要在APP處于前后臺時才能收到凶杖。
????注意,HMS除了支持推送款筑,還支持華為賬號登錄智蝠,華為支付等功能,你可以根據(jù)需要自由對接奈梳,但因?yàn)槲覀冄芯康姆较騿栴}杈湾,這里只講推送部分。其實(shí)在此之前攘须,還有一個老版本的華為推送漆撞,但SDK升級后老推送就不再支持,文檔也不見了于宙,且新老推送是不兼容的浮驳,你只能二選一。
? ? 新的華為推送服務(wù)不支持IOS捞魁,非華為手機(jī)使用華為推送SDK則需要APP各自建立長鏈接至会。在非華為手機(jī)上首次點(diǎn)開APP后,SDK會引導(dǎo)用戶下載華為HMS安裝谱俭,體驗(yàn)比較差奉件,所以不建議大家在非華為手機(jī)上使用該SDK,而且個人嘗試了下昆著,雖然下載安裝了HMS县貌,但未能在非華為手機(jī)成功收到token。
? ? 華為手機(jī)使用官方推送的好處是顯而易見的宣吱,殺掉APP通知欄依然可以收到通知窃这,所有APP共享推送通道,手機(jī)更省電征候,但如果想要使用透傳功能杭攻,就需要手機(jī)處于前后臺狀態(tài)。另外即便是EMUI的手機(jī)疤坝,也不是接入了SDK就能接收推送了兆解,文檔中寫到只有部分EMUI4.0和4.1的手機(jī),以及5.0之后的手機(jī)才能收到NC服務(wù)跑揉,其次锅睛,刪除token和通知欄消息開關(guān)的api 在EMUI5.1以上的手機(jī)上才能起到效果埠巨。最后FAQ中有講到EMUI8.0目前有個系統(tǒng)底層關(guān)于通知欄的bug,請將工程buildVersion现拒、targetVersion和compileVersion都改成26之前的版本辣垒。
? ? 那如何分辨手機(jī)是否支持華為推送呢,官方FAQ提供了幾個方法印蔬,點(diǎn)開“在線幫助”-“常見問題說明”中勋桶,有具體的EMUI版本及HMS版本的識別方法,這里不再復(fù)述侥猬。
????服務(wù)端API調(diào)用有流控限制例驹,用戶短時間內(nèi)發(fā)送大量的消息會被流控,并返回HTTP 503狀態(tài)碼退唠。默認(rèn)3000條/秒鹃锈,如需要調(diào)整,請聯(lián)系華為客服瞧预。并且每次API調(diào)用攜帶的device_token_list最大為1000個推送量屎债,如果你的推送是群發(fā)則不用理會這個限制。
? ? 查看文檔時松蒜,請著重看“開發(fā)準(zhǔn)備”扔茅,和“客戶端開發(fā)指南”,兩處的文檔描述很詳細(xì)秸苗。
? ? 集成SDK時還有一點(diǎn)需要注意,除了使用gradle集成SDK运褪,還需要下載一個hms agent壓縮包惊楼,這個壓縮包其實(shí)就是一些華為的代碼,可能官方覺得把所有功能都整合到SDK里太大了秸讹,就用這種方式希望大家按需解壓檀咙,但個人感覺其實(shí)沒什么必要。解壓后的根目錄中有readme文件璃诀,建議仔細(xì)閱讀弧可,如果你是windows,請點(diǎn)擊bat文件劣欢,執(zhí)行后根據(jù)提示按需選擇即可棕诵,最終把提取出來的java文件放入工程目錄里。
? ? 在完成開發(fā)者賬號申請凿将,創(chuàng)建APP校套,集成SDK,修改manifest等準(zhǔn)備工作后牧抵,你就可以嘗試推送一條消息給手機(jī)了笛匙。
? ? 其實(shí)接入推送SDK侨把,我們開發(fā)人員關(guān)心的無非三件事,一是如何獲取token/regid妹孙,二是通知消息怎么回調(diào)秋柄,三是推送格式怎么寫。
? ? 首先token方面蠢正,華為SDK是異步獲取华匾,即調(diào)用gettoken方法后,方法內(nèi)部最多只返回成功失敗的狀態(tài)碼机隙,只有在自定義消息接收器里才能收到token值蜘拉。而我們常用的極光SDK,則是同步方法:getregid有鹿,直接返回空或者具體值旭旭。這是他們之間的差異。
? ? 接下來說下華為推送消息回調(diào)葱跋,這里有些坑需要注意持寄。目前自定義的接收器,只能接受兩個回調(diào)信息娱俺,onEvent和onPushMsg稍味,前者是通知欄消息的回調(diào),后者是透傳的回調(diào)荠卷。但通知欄回調(diào)在通知消息到達(dá)時是無法收到的模庐,無論前后臺都不行,只有用戶點(diǎn)擊了攜帶附加消息的通知油宜,onEvent才能觸發(fā)正常掂碱,而透傳之前說過了,必須在前后臺狀態(tài)才可以慎冤,所以如果大家收不到推送到達(dá)的回調(diào)疼燥,不要著急,SDK就是這樣設(shè)計(jì)的蚁堤。
? ? 其實(shí)接入到這里醉者,感覺華為這個推送SDK設(shè)計(jì)的很別扭,相信很多開發(fā)者是需要收到推送的時候在APP執(zhí)行一些操作的披诗,但是華為的推送不支持撬即,用戶不點(diǎn)擊通知欄,即便應(yīng)用處于前臺藤巢,你也永遠(yuǎn)不知道這條推送到達(dá)了搞莺。所以如果大家用推送到達(dá)的回調(diào)來處理一些業(yè)務(wù)邏輯的話,建議發(fā)送通知欄消息的時候掂咒,再疊加一條透傳用于業(yè)務(wù)處理才沧。
? ? 而推送格式方面迈喉,華為支持比較有限,通知欄推送只能指定打開APP(即首頁温圆,大部分APP首頁都是閃屏)挨摸,或者打開特定頁面,不夠靈活岁歉。譬如我們的使用場景是根據(jù)接受的推送信息分別跳轉(zhuǎn)至ABC等頁面得运,使用極光就可以自己在receiver里自由處理,而華為只能用兩種方式锅移,一是指定通知欄點(diǎn)擊動作為打開APP熔掺,同時對scheme添加附加信息或?qū)ν扑吞砑觘xtra,在啟動頁根據(jù)獲取到的附加信息進(jìn)行處理非剃;二是按照scheme協(xié)議的格式置逻,在我們的app的manifest里每個要跳轉(zhuǎn)的頁面都加入scheme,后臺推送時候針對發(fā)送即可备绽∪耄或者將兩個思路融合,創(chuàng)建一個透明樣式的activity肺素,每次推送我們都指向該頁面恨锚,然后再解析附加信息按需跳轉(zhuǎn)即可。而且用這種方式的好處是不用在onEvent里處理回調(diào)倍靡。
小米:
? ? 小米文檔感覺非常詳細(xì)全面猴伶,閱讀完之后感覺和極光差不多,如果你熟悉極光推送菌瘫,那么小米推送接入的應(yīng)該會很快蜗顽,而且原有邏輯部分幾乎不需要修改。小米推送的優(yōu)勢是雨让,在MIUI中所有APP共享推送通道,APP被殺死也依然能收到通知忿等,除此之外還支持u3d,python等sdk栖忠,還有花哨的呼吸燈等推送配置。而且小米推送也是支持IOS的贸街,所以理論上庵寞,如果你沒有使用其他的統(tǒng)計(jì)崩潰統(tǒng)計(jì)等功能的話,完全可以用小米推送替換掉極光薛匪,友盟等捐川。
? ? 因?yàn)樾∶孜臋n十分完善,這里直接從系統(tǒng)判斷逸尖,token獲取古沥,回調(diào)方式瘸右,推送格式四方面分析。
? ? 判斷MIUI岩齿,直接在文檔中心搜索“如何識別小米設(shè)備/MIUI系統(tǒng)”即可太颤,官方文檔會告訴你答案。
? ? token上盹沈,小米提供了同步的MiPushClient.getRegId的同步方法龄章,以及recevier接收兩種方式。使用比較靈活乞封。
? ? 消息回調(diào)上做裙,onNotificationMessageArrived在推送消息到達(dá)時觸發(fā),onNotificationMessageClicked則在用戶點(diǎn)擊通知欄時觸發(fā)肃晚,onReceivePassThroughMessage在透傳消息到達(dá)時觸發(fā)锚贱,但是需要注意,透傳依然需要APP處于前后臺狀態(tài)時候才能回調(diào)陷揪。而通知欄消息到達(dá)回調(diào)惋鸥,只有APP在前后臺才能收到,在APP殺死后重啟悍缠,不再能回調(diào)成功卦绣。
? ? 推送格式上,小米除了提供了像華為一樣的飞蚓,打開APP滤港,打開指定頁面(scheme格式)外,還有自定義模式趴拧,自定義模式就是用戶點(diǎn)擊通知欄后溅漾,打不打開頁面,打開什么頁面著榴,完全由開發(fā)者在receiver收到回調(diào)后自己處理添履。
? ? 另外,小米推送的功能比華為強(qiáng)大不少脑又,支持分組暮胧,別名等功能。后臺API調(diào)用次數(shù)按照文檔說法问麸,目前沒有限制往衷,但是如果是針對regid推送,每次API調(diào)用最多只能攜帶1000個严卖。
VIVO:
? ? ? vivo的推送文檔是pdf格式席舍,需要下載。按照文檔哮笆,vivo推送目前只支持自家rom来颤,而在token獲取汰扭,回調(diào),推送格式上脚曾,和極光小米也是類似的东且。
? ? 但是對于vivo推送,有一些需要注意本讥,點(diǎn)我--push推送--push接入FAQ中珊泳,有幾個關(guān)鍵點(diǎn),一個是目前vivo推送不支持接入金融類服務(wù)拷沸!二是支持vivo push的vivo 機(jī)型特別少色查,對,你沒看錯撞芍,vivo自己家的推送服務(wù)秧了,就支持那幾款手機(jī)而已。
? ? 不過SDK提供了識別手機(jī)是否支持vivo推送的方法序无,使用PushClient.getInstance(application).isSupport()或者是判斷回調(diào)狀態(tài)碼101均可验毡。經(jīng)個人嘗試,找到了若干款型號類似的手機(jī)帝嗡,譬如文檔中講支持VIVO X21手機(jī)晶通,但是我用X21A就不支持推送,可見這個局限性還挺大哟玷。因?yàn)檎也坏椒蠗l件的手機(jī)狮辽,目前只是把代碼整合進(jìn)去了,具體還沒進(jìn)行測試巢寡。
????token獲取提供了PushClient.getInstance(application).getRegId()同步方法喉脖,onReceiveRegId回調(diào)方法,但文檔描述這個回調(diào)僅僅在regid變化時可收到抑月。
? ??onNotificationMessageArrived回調(diào)在推送到達(dá)時觸發(fā)树叽,onNotificationMessageClicked回調(diào)在推送點(diǎn)擊時觸發(fā),因?yàn)闆]有真機(jī)測試成功谦絮,在殺死APP重啟后是否能繼續(xù)收到未經(jīng)驗(yàn)證菱皆。
? ? 而且即便大家整合完畢,也需要留意挨稿,官方文檔中描述,VIVO推送是分時段的京痢,為了避免打擾用戶奶甘,目前vivo手機(jī)接收的消息為9:00-21:00,服務(wù)器允許推送時間為9:00-20:00祭椰,單推不受此時間限制臭家。限制時間外的推送將被作廢疲陕,不再重發(fā)。所以需要整合的小伙伴要權(quán)衡钉赁。
OPPO:
? ? oppo推送目前處于公測階段蹄殃,打開就會提示只對部分開發(fā)者開放,至于如何成為部分受邀開發(fā)者你踩,需要通過郵件進(jìn)行申請诅岩,但是到哪里申請不知道。這里也沒有往下進(jìn)行了带膜。但想到OV(OPPO和VIVO吩谦,以下簡稱OV)其實(shí)是一個老板,而且看VIVO那邊的情況膝藕,差不多也就明白了式廷,OV的推送服務(wù)應(yīng)該是剛開始起步,估計(jì)只有部分新款手機(jī)才能支持芭挽,雖然OV手機(jī)的用戶占比比較高滑废,但是能收到推送的新機(jī)型比例應(yīng)該還是很低的。所以目前是否需要接入看大家各自需要袜爪。
推送整合 :
? ? 老牌三方推送蠕趁,極光SDK也支持各家推送通道進(jìn)行整合,就類似sharedsdk整合分享原理一樣饿敲,前提是需要分別注冊各家大廠的推送賬號妻导,創(chuàng)建應(yīng)用。最后按極光的文檔配置各種appid,appkey即可怀各,但是極光的該功能是收費(fèi)服務(wù)倔韭,具體費(fèi)用需要咨詢極光商務(wù)。而自己整合肯定沒有費(fèi)用問題瓢对。
? ? 單獨(dú)接入各家SDK的最終目的還是要整合在一起寿酌,按照目前的粗略調(diào)查,OV的ROM占比高達(dá)45%以上硕蛹,還是很可觀的醇疼,如果加上華為,小米法焰,四家廠商的ROM會高達(dá)85%+秧荆,整合后的效果會比單純集成極光好很多。魅族也有推送埃仪,但是比例低于1%乙濒,三星及其它手機(jī)則更低,所以就沒有關(guān)注其他的推送。
????整合的意義在于提高推送到達(dá)率颁股,更加省電么库。?由于目前的OV推送服務(wù)有很大的不確定性,建議不是特別緊急就不用集成了甘有,保持關(guān)注即可诉儒,畢竟隨著時間的推移,支持OV推送的手機(jī)比例會大幅度增加亏掀,屆時再接入也不遲忱反。
? ? 目前整合的大致思路是首先識別ROM,依據(jù)rom類型分別啟動不同SDK(前邊已經(jīng)介紹了各個廠商識別自家ROM的方法)幌氮,如果無法成功識別或者啟動SDK異常缭受,則使用極光等三方推送或小米推送作為兜底。
? ? 第二是獲取不同廠家的token/regid该互,上報給自己的服務(wù)器進(jìn)行綁定米者,因?yàn)橛械膹S家是異步,有的是同步獲取宇智,需要大家視情況自己處理業(yè)務(wù)邏輯蔓搞。
? ? 第三由服務(wù)器針對APP上報的信息,使用不同廠家的推送API推送信息随橘。推送方式和格式上建議統(tǒng)一喂分,即創(chuàng)建一個透明activity,統(tǒng)一使用scheme格式并攜帶附加信息机蔗,看起來大概是這個樣子:你定義的scheme:你定義的host?action=你定義的action蒲祈,然后在透明的activity里根據(jù)action跳轉(zhuǎn)至不同頁面,處理完成后及時關(guān)閉這個透明界面即可萝嘁。
? ? 至此整個SDK集成的分析就結(jié)束了梆掸,今后可能會對此文檔不定期更新,感謝閱讀牙言。