1. 程式人生 > >友盟推送SDK整合測試、常見問題以及注意事項總結

友盟推送SDK整合測試、常見問題以及注意事項總結

      最近為了解決公司APP在一些手機出現的推送問題重新集成了最新版的友盟推送SDK,花費了幾天時間終於把整合和測試工作完成,最終在華為,Nexus,三星,小米,HTC,魅族等10多部手機上測試並達到了預想效果,這裡把期間遇到的問題和整合注意事項記錄下來方便自己總結和迭代更新,也希望能給碰到相同問題的朋友帶去一點幫助,在此特別感謝友盟團隊的技術人員範亞傑(向睿)以及產品運營趙橫(沐惶)對我給予的幫助,話不多說,進入正題:

一、SDK整合

SDK版本:V3.1.0a

官網下載地址:http://dev.umeng.com/push/android/sdk-download

具體整合步驟參考官網:http://dev.umeng.com/push/android/integration

整合過程並不複雜,大體如下

1、在官網(http://push.umeng.com)上使用應用包名建立應用,獲取應用對應的AppKey和Umeng Message Secret。

2、下載SDK的壓縮檔案並解壓縮(解壓後的檔案路徑不能有中文),把解壓縮後得到的目錄下的PushSDK當做Module匯入到自己的工程。

 

如圖所示,則需要新增arm64-v8a以及arm64-v7a兩個資料夾

4、配置Appkey和Secret,新增Channel ID

    在工程的Application Module的AndroidManifest.xml中的<Application>標籤下新增:

<meta-data

   android:name="UMENG_APPKEY"

   android:value="xxxxxxxxxxxxxxxxxxxxxxxxxxxx">

</meta-data>

<meta-data

   android:name="UMENG_MESSAGE_SECRET"

   android:value="xxxxxxxxxxxxxxxxxxxxxxxxxxxx">

</meta-data>

<meta-data

   android:name="UMENG_CHANNEL"

   android:value="Channel ID" >

</meta-data>

把步驟1中的AppKey和Umeng Message Secret新增到UMENG_APPKEY和UMENG_MESSAGE_SECRET的相應value。你可以自定義Channel ID來標識App的推廣渠道,作為推送訊息時給使用者分組的一個維度新增到UMENG_CHANNEL的value處。

5、配置build.gradle

    在Application Module的build.gradle檔案的dependencies下新增compile project(':PushSDK'),另外必須在defaultConfig中設定applicationId並保證和自己的包名一致,否則PushSDK依賴庫AndroidManifest中${applicationId}將不能正常替換成包名,例如:

6、註冊推送服務(是否開啟推送都要呼叫註冊方法)

    如果專案中沒有使用者開啟關閉推送功能則只需要呼叫register方法,不用呼叫enable或者disable,否則按需呼叫enable和disable方法,例如我們專案有設定推送開關

7、統計應用啟動資料(在BaseActiivty呼叫)

8、新增混淆配置(拷貝官網配置即可)

9、打包測試

測試可按照官網說明,根據deviceToken定向推送

二、測試

測試條件:WIFI條件

測試內容:測試模式下推送訊息檢視手機通知欄是否有訊息送到,根據deviceToken查詢長連線Service線上狀態


測試機型:紅米note2,三星SM-E7009,華為Mate7,華為C199s,魅族M2 note,

ZTE N918St,三星Glaxy S6 edge+,海信 I639T,Coolpad8297-W01,HTC D816V,華為 TIT-CL00,HTC 2PQ93,Nexus 6P

測試系統版本範圍:4.X-6.X

測試步驟:APP首次安裝—>按home鍵,APP退至後臺—>點選系統返回,退出APP—>

從最近開啟列表清除程序—>重新開啟APP—>設定-應用程式-清除資料—>重新開啟APP

結果如下:

 

測試結果總結如下:

(1)所有手機在“APP首次安裝”以及“按home鍵,APP退至後臺”的操作都能正常獲取deviceToken並保證長連線Service處於線上狀態,並能及時收到推送訊息。

(2)幾乎所有手機在“點選系統返回鍵,退出APP”後長連線Service都能從離線狀態恢復成線上狀態,這個過程耗時10秒左右,並能收到離線時傳送的歷史訊息以及線上狀態的及時訊息。一小部分特殊機型需要允許自啟動或者關聯啟動才能線上,特殊機型參考後文。

(3)超過半數的手機能在使用者“從最近開啟列表清除程序”的操作後長連線Service能從離線狀態恢復成線上狀態,並接受到及時訊息,原生系統手機基本都能正常工作,比如Nexsus,三星,HTC等等,不能正常工作的多為定製化廠商系統比如華為,小米等部分手機,因為這些手機系統底層做了限制,基本上無能為力。

(4)絕大多數手機在使用者進行“設定-應用程式-清除資料”操作後長連線Service都處於離線,推送都不能送達,一小部分手機(原生系統手機)能正常工作。

(5)所有手機都能重新開啟APP的時候保證長連線Service線上並接收到離線或者及時訊息(不管是點選系統返回鍵退出後還是清除最近使用列表程序還是清除資料後都正常)。

(6)如果手機上有裝有其他集成了友盟推送SDK的應用,比如UC瀏覽器,暴風影音,魯大師等阿里系的應用基本都能一直保持長連線Service線上,從而正常工作,極大的提高推送成功率。因為友盟推送訊息路由機制是複用長連線,能互相喚醒,只是宿主不同而已。

注:原生系統機器不會對推送做任何限制,長連線Service基本上不會被殺死,因為殺死還能自動起來,推送成功率很高(清除資料除外,因為這跟安裝完後沒開啟差不多)。

三、注意事項彙總

1、  Android特殊機型整理&整合注意事項(不定期更新)

2、  必須在專案Application類的 onCreate() 方法中註冊推送服務,無論推送是否開啟都需要呼叫register方法

3、  device-token的生成規則及其變化條件

device token是【友盟+】生成的用於標識裝置的id,長度為44位,不能定製和修改。同一臺裝置上不同應用對應的device token不一樣。

(1)device-token是SDK在初始化的時候向伺服器端發起註冊請求,由伺服器端生成之後頒發給客戶端的。 SDK向伺服器端註冊的時候,要把裝置的標識id(umid + utdid)和app的標識(appkey,包名)作為引數告知伺服器,伺服器以裝置id和appkey為基礎,結合一定的演算法生成device-token。所以device-token可以近似認為是“裝置id + appkey”的結合。

(2)裝置device-token變化有兩種最可能的情況:一種是裝置解除安裝過,又重新安裝,token可能會變化另一種是裝置沒有SD卡,裝置id變化導致的device-token變化。另外我發現清除資料再次開啟APPdeviceToken也有概率性變化,應該也是屬於裝置id變化導致,經過測試,Nexus 6P手機清除資料或者解除安裝APP後每次都會變化。而其他手機變化的機率比較小。另外register方法的回撥不一定每次都會返回deviceToken(有時候為null),只有程序被殺,重啟app,才會有返回值(這是友盟技術人員告訴我的),如果沒有被殺死則會返回null,所以不能在回撥中儲存deviceToken,而應該是通過mPushAgent.getRegistrationId()來獲取。

4、  So庫的引用導致的accs bindapp error以及獲取不到deviceToken問題

解壓縮我們的APK,發現APP主專案和依賴庫總共引入了4個平臺so檔案,SDK標準提供了兩個

所以得下載全平臺的so庫,新增另外兩個資料夾到PushSDK,也能解決部分手機上獲取不到DeviceToken的bug,比如紅米note2(4個資料夾基本能滿足需求了,關於這點我也向友盟技術人員確認過了)。

5、 官網整合文件說明請勿在呼叫register方法時做程序判斷處理,主程序和channel程序均需要呼叫register方法才能保證長連線的正確建立,事實上是可以只在主程序和channel程序兩個中呼叫register方法即可(官方回覆)

6、 關閉推送方法disable呼叫後會同步到友盟SDK,如果沒有呼叫enable開啟推送功能是不會再次開啟推送的,極端操作是我在設定中關閉推送,這個時候我清除APP資料功能,如果deviceToken沒變化的手機上開啟APP時沒有呼叫enable則會出現推送不了的情況,因為會提示“使用者未註冊”,雖然在沒呼叫disable時,不用呼叫enable方法就能推送,那麼這個時候就需要在初始化時候加上一定條件條件判斷,例如:

7、 Register方法必須放在Application中執行,如果滯後到MainActivity中則只能開啟APP活著App處於前臺才能收到推送訊息,這個問題對於有特殊要求的應用有一定印象,比如說手機預裝應用,因為預裝應用中的聯網,讀取裝置資訊等操作都必須等待使用者同意之後才能進行,所以register方法可能需要滯後,當然另外一種解決辦法是第一次開啟不進行register方法,直到使用者某次允許後才初始化,那麼在這之前推送功能則無效,這個問題也需要具體分析對待。

8、 讀寫SD卡許可權以及read phone state許可權都是非必須許可權,沒有也基本不影響推送功能,當然有最好,這是友盟技術人員告訴我的。

9、 清除資料後理論上程序會被殺死,但有的機子上也不一定,所以清除資料,一般都是要開啟重新註冊推送才能正常工作的。

10、SDK預設在“23:00”到“7:00”之間收到通知訊息時不響鈴,不振動,不閃燈。如果需要改變預設的靜音時間,可以使用以下介面:

public void setNoDisturbMode(int startHour, intstartMinute, int endHour, int endMinute)

11、 預設情況下,同一臺裝置在1分鐘內收到同一個應用的多條通知時,不會重複提醒,同時在通知欄裡新的通知會替換掉舊的通知。可以通過如下方法來設定冷卻時間:

mPushAgent.setMuteDurationSeconds(int seconds);

12、 mPushAgent.enable(newIUmengCallback())回撥失敗,返回300,bind Agoo service fail也不影響推送功能的使用。

13、整合測試可以PushAgent.setDebugMode(true)在logcat中過濾message標籤檢視具體的日誌,也可以過濾在channel程序中檢視所有推送SDK的操作日誌,包括網路請求、響應的json以及心跳檢測,ping等操作,對於長連線的保活能有一定的指導作用。

14、 同一個裝置deviceToken變化後可以檢測到線上,但是傳送提示“裝置號格式錯誤”。