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