以下為一些常見的技術(shù)問題解答及常見概念的理解,對推送有疑問的開發(fā)者可以自行Ctrl+F搜索關(guān)鍵字找尋解答。
一、概況問題
1.如何申請接入?
感謝您選擇小米推送,點(diǎn)此查看接入指南(https://dev.mi.com/console/doc/detail?pId=68);
2.小米推送收費(fèi)嗎?
小米推送的基礎(chǔ)服務(wù)目前是免費(fèi)的。
3.小米推送目前支持哪些平臺?
目前支持iOS和Android兩大平臺。
4.如何刪除推送后臺應(yīng)用?
您可以在開放平臺——管理控制臺——小米應(yīng)用商店,選擇你要刪除的應(yīng)用,點(diǎn)擊“更多服務(wù)”,即可刪除該應(yīng)用。
5.如何衡量推送的效果,提供哪些數(shù)據(jù)統(tǒng)計(jì)結(jié)果?
小米推送目前提供的數(shù)據(jù)統(tǒng)計(jì)如下:
1)推送數(shù)據(jù):當(dāng)日實(shí)時的推送量(區(qū)分單發(fā)和群發(fā))和送達(dá)量,歷史每天的推送量(區(qū)分單發(fā)和群發(fā))和送達(dá)量;
2)消息記錄:每條消息的計(jì)劃推送量、送達(dá)量和送達(dá)率、點(diǎn)擊量和點(diǎn)擊率;
3)用戶數(shù)據(jù):需要開發(fā)者選擇啟用才開始記錄,包括當(dāng)日實(shí)時在線數(shù)和最高在線數(shù),歷史每天的最高在線數(shù)、新增用戶數(shù)和日活躍用戶數(shù)(推送的日活定義為當(dāng)日長連接在線過的設(shè)備)歷史數(shù)據(jù)支持自定義時間段的查詢和導(dǎo)出xls文件。
詳細(xì)可以參考:小米推送統(tǒng)計(jì)指標(biāo)說明文檔(https://dev.mi.com/console/doc/detail?pId=341)
6.小米推送服務(wù)有哪些限制?
目前針對首批合作開發(fā)者,小米推送服務(wù)沒有設(shè)置任何推送頻率的使用限制。而且所提供的推送服務(wù)完全免費(fèi)。對于單條消息,可攜帶的數(shù)據(jù)量最大不能超過4KB。
二、概念解釋
1.關(guān)于送達(dá)率
1.1.小米推送的送達(dá)率是怎么計(jì)算的?
小米推送送達(dá)率=本次推送真正送達(dá)的設(shè)備數(shù)/所覆蓋的所有設(shè)備數(shù);
如果目標(biāo)對象的選取是所有用戶,那分母就是歷史上所有激活過推送服務(wù)的有效設(shè)備數(shù);如果是按照標(biāo)簽選取的,那分母是歷史上所有訂閱過這個標(biāo)簽的有效設(shè)備數(shù);如果是按照別名或者regID來選取,那么分母就是所請求的所有合法的別名或regID。
1.2.有哪些影響送達(dá)率的因素?
按照送達(dá)率計(jì)算方式,會有如下幾個影響送達(dá)率的因素:
1)應(yīng)用的留存率。已經(jīng)卸載了app的設(shè)備,肯定是推送不到的,按照目前的計(jì)算方式,大部分的卸載設(shè)備會被計(jì)入分母(計(jì)劃推送數(shù))當(dāng)中。
2)應(yīng)用所在設(shè)備的聯(lián)網(wǎng)情況。如果在消息有效期內(nèi),設(shè)備一直不聯(lián)網(wǎng),那消息也是不能送達(dá)的,但也會被計(jì)入分母當(dāng)中。
3)消息的有效期。有效期越短,在有效期內(nèi)聯(lián)網(wǎng)的設(shè)備數(shù)勢必就越少,因此送達(dá)率會隨之下降。
4)目標(biāo)設(shè)備的選取。如果選取的是全量用戶,那其送達(dá)率肯定會比按照用戶聯(lián)網(wǎng)情況精準(zhǔn)提取目標(biāo)設(shè)備(如選取7天內(nèi)有過打開應(yīng)用行為的用戶)要低。
2.關(guān)于regID
2.1.regID是根據(jù)什么生成的?
regID是在客戶端向小米推送服務(wù)注冊時,小米推送服務(wù)端根據(jù)設(shè)備標(biāo)識、appID以及當(dāng)前時間戳生成,因此能夠保證每個設(shè)備上每個app對應(yīng)的regID都是不同的。
2.2.regID會不會變化?
當(dāng)app注冊成功后,小米推送服務(wù)客戶端SDK會在本地通過shared_prefs來保存這個regID,之后app調(diào)用注冊,SDK后會在本地直接讀取出這個regID并直接返回,不會重新請求服務(wù)器。因此只要應(yīng)用不卸載重裝或者清除應(yīng)用本地數(shù)據(jù),regID就不會變化。否則,如果SDK沒有從本地讀取到緩存的regID,則會向服務(wù)端重新請求,此時regID會重新生成。
2.3.regID在哪些情況下會失效?
regID在如下幾種情況下會被判斷失效:
1)app卸載重裝或者清除數(shù)據(jù)后重新注冊,這種情況下會生成一個新的regID,而老的regID會失效;
2)app調(diào)用了unregisterPush;
3)在MIUI上,app卸載時,如果能成功上報,則regID會被判定失效;
4)設(shè)備超過3個月沒有和小米push服務(wù)器建立長連接;
2.4.如何獲取失效的regID?
可以通過feedback接口從小米推送服務(wù)后臺拉取失效regID的列表。
3.標(biāo)簽(topic)
開發(fā)者可結(jié)合自己的業(yè)務(wù)特征,給用戶打上不同的標(biāo)簽(Topic)。在消息的推送過程中,開發(fā)者結(jié)合每條消息的內(nèi)容和目標(biāo)用戶,選擇每條消息所對應(yīng)的標(biāo)簽,可以進(jìn)行更精準(zhǔn)的定向推送。
4.別名(Alias)
應(yīng)用可為每個設(shè)備ID(即RegID)設(shè)定一個別名(Alias),方便開發(fā)者與自有的ID系統(tǒng)進(jìn)行關(guān)聯(lián),避免因需要保存設(shè)備RegID與自有帳號的對應(yīng)關(guān)系而給開發(fā)者帶來額外的開發(fā)和存儲成本。
5.透傳消息
透傳類推送是指開發(fā)者可選擇不通過任何預(yù)定義的方式展現(xiàn),由應(yīng)用直接接收推送消息。利用透傳消息,開發(fā)者可自定義更多使用推送的方式和展現(xiàn)形式,從而能更為靈活地使用消息推送通道。在一些擁有應(yīng)用啟動管理功能的Android系統(tǒng)上(如MIUI),透傳的實(shí)現(xiàn)需要應(yīng)用在后臺處于啟動狀態(tài)。
6.透傳和通知欄,在送達(dá)率上有什么分別?
透傳消息是指當(dāng)小米推送服務(wù)客戶端SDK接收到消息之后,直接把消息通過回調(diào)方法發(fā)送給應(yīng)用,不做任何處理;
通知欄消息是指在設(shè)備接收到消息之后,首先由小米推送服務(wù)SDK彈出標(biāo)準(zhǔn)安卓通知欄通知,在用戶點(diǎn)擊通知欄之后,激活應(yīng)用。
在非MIUI系統(tǒng)中,由于維護(hù)小米推送服務(wù)長連接的service是寄生在App的運(yùn)行空間當(dāng)中的,因此透傳和通知欄方式在送達(dá)率上并沒有任何區(qū)別,都需要應(yīng)用駐留在后臺。即,如果一臺設(shè)備通知欄消息能夠接收到并彈出,那么其透傳消息也同樣能接收到。
在MIUI系統(tǒng)中,由于長連接是由MIUI系統(tǒng)服務(wù)建立并維護(hù)的,因此在接收消息的時候并不需要應(yīng)用駐留后臺。如果采用通知欄方式接收消息,由于通知欄也是MIUI系統(tǒng)服務(wù)彈出的,就可以做到不需要用戶后臺駐留或者可以自啟動消息就能送達(dá)。而如果采用透傳消息,由于需要直接執(zhí)行應(yīng)用的代碼,因此即使消息已經(jīng)到了系統(tǒng)服務(wù),如果應(yīng)用沒有駐留后臺或者能自啟動,消息依然不能送達(dá),需等下次用戶手動點(diǎn)擊激活應(yīng)用后,才能接收到消息。
綜上,在MIUI系統(tǒng)中,通知欄消息的送達(dá)率會遠(yuǎn)高于透傳方式;在非MIUI系統(tǒng)中,通知欄和透傳方式的送達(dá)率是一樣的。
7.alias和user account有什么區(qū)別
alias和user account都可以用來設(shè)置設(shè)備對應(yīng)的用戶賬號,所不同的是,一個alias只能對應(yīng)一臺設(shè)備,如果有多臺設(shè)備設(shè)置了同樣的alias,則最后一個設(shè)置成功的生效,其它設(shè)備就會失效。而一個user account可對應(yīng)10臺以內(nèi)的設(shè)備。因此如果應(yīng)用是單點(diǎn)登錄的,一個賬號只會在一臺設(shè)備上生效,用alias會比較合適。而如果產(chǎn)品需求是單賬號多點(diǎn)登錄同時接收消息,則用user account會更合適。
三、系統(tǒng)服務(wù)問題
1.如果我使用通知欄類型消息,能否在通知欄消息到達(dá)之前,先執(zhí)行一段app的代碼?或者在通知欄到達(dá)時,通知app?
在MIUI系統(tǒng)上,通知欄類型的消息,是不需要應(yīng)用啟動就能彈出的(這一特性決定了通知欄消息的彈出可以不受應(yīng)用自啟動管理的影響),因此在整個彈出通知欄消息的過程中,app是完全不可感知的,當(dāng)用戶點(diǎn)擊通知欄消息之后,才會執(zhí)行到app的代碼。
2.當(dāng)我的應(yīng)用被殺掉之后,還能否接收到小米推送服務(wù)的消息?
1)如果是在MIUI系統(tǒng)中,使用通知欄類型的消息,是不需要應(yīng)用出于啟動狀態(tài)就能接收并彈出通知欄的。使用透傳消息,則需要應(yīng)用駐留后臺才能接收,由于MIUI的自啟動管理限制,所以如果應(yīng)用被殺,是收不到透傳消息的。
2)如果是在非MIUI系統(tǒng)中,是需要應(yīng)用駐留后臺才能接收消息的,因此如果應(yīng)用被殺死并且不能后臺自啟動的話,是沒有辦法接收消息的。為了讓app盡可能的駐留后臺,小米推送服務(wù)SDK監(jiān)聽了網(wǎng)絡(luò)變化等系統(tǒng)事件,并且有應(yīng)用之間的互相喚醒,但這些措施并不能保證應(yīng)用可以一直在后臺駐留。
3.小米push是不是共享通道的?
在MIUI系統(tǒng)中,push服務(wù)的消息走的是系統(tǒng)通道,不需要應(yīng)用單獨(dú)建立連接。
在非MIUI上,通道會建立在每個app的進(jìn)程中,每個接入mipush服務(wù)的app都會建立一條單獨(dú)的通道。
這種設(shè)計(jì)的考慮原因如下:使用共享通道,會有如下幾個問題解決不了,1.流量。假如你的app不幸被選中成為其它app的消息通道,而某個惡意app通過這個通道發(fā)了大量的消息,所產(chǎn)生的流量,都會算在你的app的頭上。2.安全性。如果你的消息走的是別的app的通道,數(shù)據(jù)需要通過另一個app的進(jìn)程中轉(zhuǎn),則在這過程中很容易被偽造、纂改、攔截。
4.在MIUI中,小米推送支持的最低Android版本和MIUI版本是什么?
Android支持4.0以上版本;onNotificationMessageArrived回調(diào)等功能需要MIUI7以上版本支持;
5.有沒有方法檢測小米推送是否已經(jīng)注冊的方法
客戶端調(diào)用getregid,如果有返回,就注冊成功了;