四、接入過程問題
1.第一次接觸安卓版小米推送服務(wù),使用你們的demo沒有成功,怎么辦?
第一次使用小米推送服務(wù)(安卓版),請仔細(xì)閱讀如下指南:小米推送Android版快速接入指南(https://dev.mi.com/console/doc/detail?pId=100)。
一般注冊推送服務(wù)沒成功,常見的原因如下:
1)沒有開啟推送服務(wù)。使用推送服務(wù)前需要登錄開發(fā)者賬號、創(chuàng)建應(yīng)用、開通推送服務(wù)3個步驟,缺一不可。
2)沒有正確配置AndroidManifest.xml文件。需要特別注意包名、權(quán)限部分,包名需要跟開發(fā)者站點(diǎn)上開通推送服務(wù)的一致,權(quán)限的前綴需要改成包名。
3)系統(tǒng)時間錯誤。由于小米推送服務(wù)需要使用https請求向服務(wù)器注冊一個匿名賬號,在次過程中如果系統(tǒng)時間錯誤,會引起https過期,導(dǎo)致注冊不成功。
4)聯(lián)網(wǎng)被阻止。小米推送服務(wù)客戶端需要使用5222和443兩個端口,如果在公司內(nèi)網(wǎng),需要聯(lián)系IT部門把這兩個端口開放。同時需要檢查應(yīng)用的聯(lián)網(wǎng)是否會被一些手機(jī)安全助手阻止。需要特別注意的是,在MIUI系統(tǒng)上,長連接是由“小米服務(wù)框架”這個系統(tǒng)應(yīng)用維護(hù)的,因此需要確保這個應(yīng)用的聯(lián)網(wǎng)并沒有被阻止。
2.為什么onNotificationMessageArrived方法沒被調(diào)用到?
首先,確認(rèn)接入是否正確,這個方法需要在manifest中添加<action android:name=”com.xiaomi.mipush.MESSAGE_ARRIVED”/>這個action。
在MIUI系統(tǒng)上,這個方法的調(diào)用需要同時滿足如下兩個條件:
1)新版的MIUI。這個特性是在2015年才加進(jìn)小米推送服務(wù)的,因此需要MIUI升級到較新的版本才能調(diào)用這個方法。
2)需要應(yīng)用駐留后臺。小米推送服務(wù)的通知欄消息,是可以在應(yīng)用不啟動的前提下,就彈出通知欄消息的,在這種情況下,由于MIUI的自啟動管理,限制了應(yīng)用不能在被殺后被后臺喚醒,所以推送消息不能直接喚醒應(yīng)用執(zhí)行這個方法。
3.為什么我在onNotificationMessageClicked方法中的startActivity不能調(diào)起目標(biāo)界面?
由于onNotificationMessageClicked中傳入的context是application context,本身沒有activity棧,因此需要在創(chuàng)建activity時候加入NEW_TASK的flag:Intent i=new Intent(context,MyActivity.class);i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);context.startActivity(i);
4.為什么我的設(shè)備在調(diào)用registerPush的時候會出現(xiàn)no account的錯誤?
在app第一次在一臺設(shè)備上注冊推送服務(wù)時,sdk會通過https請求,從小米推送服務(wù)器生成一個匿名賬號。這個錯誤是由于這個請求失敗導(dǎo)致的。一般請求失敗常見的原因包括如下幾種:
1)系統(tǒng)時間錯誤。時間錯誤會導(dǎo)致https在校驗證書有效期的時候,出現(xiàn)證書過期,導(dǎo)致https請求失敗。
2)網(wǎng)絡(luò)原因。這個大部分的原因都是設(shè)備架了代理服務(wù)器或連了vpn,如果排除這些原因,就檢查一下app是否申請了聯(lián)網(wǎng)權(quán)限,是否被什么安全軟件阻止了登錄,公司wifi是否能用,等等。
3)如果是在MIUI系統(tǒng)上,生成匿名賬號是在一個叫小米服務(wù)框架的系統(tǒng)app上完成的,還需要檢查這個app的聯(lián)網(wǎng)是不是在安全中心的聯(lián)網(wǎng)控制中被手動關(guān)閉了。
5.我們iOS應(yīng)用還沒發(fā)布到蘋果商店,是不是正式包還收不到消息,要等發(fā)布了才行?
將MISDKRun設(shè)置為online,然后使用adHoc的證書即可收到生產(chǎn)環(huán)境的消息;
6.如何進(jìn)行通知分類、實(shí)現(xiàn)通知欄多條消息并存?
可以使用notifyId(Integer id)可選項。
https://dev.mi.com/console/doc/detail?pId=1278#_3_3
默認(rèn)情況下,通知欄只顯示一條推送消息。如果通知欄要顯示多條推送消息,需要針對不同的消息設(shè)置不同的notify_id(相同notify_id的通知欄消息會覆蓋之前的)。
7.注冊推送,SDK日志提示“MIIDManager startMIIDUpdateListener failed cause lack of GET_ACCOUNTS permission”。
這是推送的一種消息推送方式,不影響正常使用;當(dāng)sdk執(zhí)行按miid推送消息的時候,會檢查一下app有沒有獲得miid的權(quán)限,如果沒有,會打印相關(guān)消息。
8.注冊推送提示“Don't send message before initialization succeeded!”
Mipush sdk內(nèi)部邏輯,檢測消息通道是否順暢,不影響推送功能正常使用。
9.Mipush是否支持通知欄自定義顯示圖片/如何自定義通知欄樣式?
SDK可以根據(jù)推送消息中指定的layout文件和填充內(nèi)容,自由定制展示樣式。在MIUI中,通知展示由系統(tǒng)通道負(fù)責(zé),需要MIUI升級后才支持自定義通知。具體使用方法可以參考《服務(wù)端Java SDK文檔》。另外,關(guān)于自定義通知欄layout的配置目前只支持app本地資源已有的圖片和布局文件,可以通過這個服務(wù)器自定義布局顯示出來;暫不支持網(wǎng)絡(luò)圖片下載。
10.推送消息支持靜默推送(即無聲音、無燈光、無震動)嗎?
支持,可以在構(gòu)建消息時調(diào)用notifyType(Integer type)方法,將type設(shè)置成0即可。
notifyType表示設(shè)置通知類型,type類型支持以下值:
·1:使用默認(rèn)提示音提示
·2:使用默認(rèn)震動提示
·4:使用默認(rèn)led燈光提示
·-1(系統(tǒng)默認(rèn)值):以上三種效果都有
·0:以上三種效果都無,即靜默推送。
并且支持1,2,4的任意OR運(yùn)算來實(shí)現(xiàn)聲音、震動和閃光燈的任意組合。
11.timeToLive最大時長為多少?
timeToLive表示消息的生命周期,若用戶離線,設(shè)置消息在服務(wù)器保存的時間,單位:ms,服務(wù)器默認(rèn)最長保留14天。
12.如何開啟/關(guān)閉app在前臺時的通知彈出?
應(yīng)用在前臺的情況下,通知消息到達(dá)客戶端后是否彈出通知可以通過服務(wù)端來設(shè)置。服務(wù)端調(diào)用Message.Builder類的extra(String key,String value)方法將EXTRA_PARAM_NOTIFY_FOREGROUND的值設(shè)置為"0"或者"1"。當(dāng)EXTRA_PARAM_NOTIFY_FOREGROUND值為”1″時,app會彈出通知欄消息;當(dāng)EXTRA_PARAM_NOTIFY_FOREGROUND值為”0″時,app不會彈出通知欄消息。注:默認(rèn)情況下會彈出通知欄消息。
示例:
Message message = new Message.Builder()
.title(title)
.description(description).payload(messagePayload)
.restrictedPackageName(MY_PACKAGE_NAME)
.passThrough(0)
.notifyType(1)
.extra(Constants.EXTRA_PARAM_NOTIFY_FOREGROUND, "0")
.build();
13.給IOS10系統(tǒng)推送消息時,如何設(shè)置title?
如果使用的Java或PHP的SDK,可以使用IOSBuilder的title、subtitle、body方法。
14.如何理解消息回執(zhí)中的barStatus參數(shù)?
barStatus表示用戶是否允許該app的消息在通知欄展示。barStatus的值只和用戶本地的配置有關(guān)系。用戶設(shè)置允許app彈出通知,返回Enable;用戶設(shè)置不允許app彈出通知,返回Disable;本地獲取狀態(tài)出現(xiàn)異常時,返回Unknown。Disable時,如果有消息到達(dá),不會顯示通知;Enable時,如果有消息到達(dá),會顯示通知。
15.為什么有時候獲取到的regID是非正式環(huán)境的?(平臺類型是iOS類型)
客戶端獲取到的regId環(huán)境,與MiSDKRun有關(guān)。MiSDKRun=debug為測試環(huán)境,MiSDKRun=online為正式環(huán)境。
16.IOS平臺接入時是否支持swift?
支持,具體用法請參見文檔:https://dev.mi.com/console/doc/detail?pId=98#_3_13。
17.使用推送運(yùn)營平臺發(fā)送消息時,如何設(shè)置notifyId?
可以在“通知分類”輸入框里設(shè)置。
18.IOS和android平臺需要分別創(chuàng)建應(yīng)用還是可以使用同一個?
IOS和android平臺需要創(chuàng)建不同的應(yīng)用,要分開創(chuàng)建,AppId和APPKey也是不同的。
19.收到回調(diào):onCommandResult:command={Registration},resultCode={70000001},reason={the push is not connected.},category={null},commandArguments={null}
該errorCode一般是由于網(wǎng)絡(luò)問題導(dǎo)致的,請先確認(rèn)設(shè)備網(wǎng)絡(luò)是否正常,網(wǎng)絡(luò)是否使用代理。另外,修改系統(tǒng)時間也會導(dǎo)致上述錯誤??赏ㄟ^設(shè)備瀏覽器登錄如下鏈接來確認(rèn)設(shè)備網(wǎng)絡(luò)及設(shè)置是否正常:
國內(nèi):https://api.xmpush.xiaomi.com/_x/monitor/status
海外:https://api.xmpush.global.xiaomi.com/_x/monitor/status
20.蘋果手機(jī)的應(yīng)用在打開狀態(tài)時收不到消息,在后臺和未打開狀態(tài)時卻能收到消息,這種現(xiàn)象正常嗎?
正常。蘋果手機(jī)的應(yīng)用在前臺時,消息是不會展示的,但手機(jī)實(shí)際是收到消息的,可以在接受消息的回調(diào)中打斷點(diǎn),或者打印log進(jìn)行驗證。
五、推送統(tǒng)計數(shù)據(jù)問題
1.計劃推送數(shù)是指什么?怎么計算的?
計劃推送數(shù)是指推送請求所覆蓋的所有的設(shè)備數(shù),如果目標(biāo)對象的選取是所有用戶,那分母就是歷史上所有激活過推送服務(wù)的有效設(shè)備數(shù);如果是按照標(biāo)簽選取的,那分母是歷史上所有訂閱過這個標(biāo)簽的有效設(shè)備數(shù);如果是按照別名或者regID來選取,那么分母就是所請求的所有合法的別名或regID。
2.設(shè)備有效性的判定規(guī)則:
如果應(yīng)用調(diào)用了unregisterPush,或者在MIUI上卸載了,或者超過3個月都沒有和小米服務(wù)器建立過長連接,則會判定設(shè)備失效。
3.為什么在數(shù)據(jù)統(tǒng)計后臺看,按天統(tǒng)計中,會出現(xiàn)計劃推送少于送達(dá)數(shù)的現(xiàn)象?
這是正常現(xiàn)象,在按天統(tǒng)計中,計劃推送是指當(dāng)天的所有請求總共覆蓋了多少設(shè)備數(shù),而送達(dá)數(shù)則是當(dāng)天這個app所有的送達(dá),因此這個送達(dá)數(shù)不但包括當(dāng)天發(fā)的消息送達(dá)了多少,也包括了之前發(fā)的消息,作為離線消息當(dāng)天抵達(dá)設(shè)備的數(shù)量。因此這個送達(dá)數(shù)是存在大于計劃推送數(shù)的可能性的。
4.如何查詢統(tǒng)計數(shù)據(jù):
1)使用服務(wù)端SDK中的數(shù)據(jù)API直接拉取統(tǒng)計數(shù)據(jù),可方便地與開發(fā)者現(xiàn)有的統(tǒng)計系統(tǒng)結(jié)合;
2)登錄開發(fā)者站,進(jìn)入應(yīng)用的推送服務(wù)查看推送統(tǒng)計數(shù)據(jù);
5.從計劃推送量到實(shí)際下發(fā)量再到送達(dá)量會有一定比例的損耗,如何降低這個損耗?
一方面,可以調(diào)用服務(wù)端的feedback接口,拉取無效的設(shè)備,以后在推送總量里剔除這部分設(shè)備。開發(fā)者也可以自行維護(hù)有效設(shè)備集合,減少發(fā)送的設(shè)備里存在過多取消注冊或無效的設(shè)備。
另一方面,可以設(shè)置合適的ttl(timeToLive消息過期時間),建議如果消息沒有實(shí)效性的話可以適度增大ttl,也可不設(shè)置該值直接使用我們服務(wù)器的默認(rèn)時間(2周),這樣的話只要用戶在ttl有效期之內(nèi)上線,就能收到之前推送的消息。