接入友盟廠商push通道遇到的坑

 

目錄

調試友盟Push問題的檢查清單

客戶端、服務端數據協議

客戶端接入方式

小米廠商通道

華爲廠商通道

魅族廠商通道

VIVO廠商通道

  OPPO廠商通道

支持桌面角標的廠商

吐槽一下集成友盟廠商通道時發現的問題


調試友盟Push問題的檢查清單

  1. 過濾UmengPushAgent開頭的日誌可以看到客戶端整個執行流程
  2. 過濾UMLog標籤就可以打印出客戶端註冊步驟相關的日誌
  3. 過濾NAccs.開頭的日誌,可以看到SDK內部處理push的執行流程日誌
  4. 在和服務端調試之前確保客戶端配置正確並且註冊成功。註冊成功後會有成功的日誌,這個日誌要好好利用。類似於:在tag:MiPushBroadcastReceiver下面打印log: onCommandResult is called. regid= xxxxxxxxxxxxxxxxxxxxxxx接收到小米消息則會打印log: onReceiveMessage,msg= xxxxxxxxxxxxxxxxxxxxxxx
  5. 當收不到消息時,徹底殺死app之後重新啓動再試
  6. 如果各項參數都設置正確了,仍然收不到push。確認下是否開啓了通知欄通知權限。如果還不行,重裝app、重啓手機。
  7. 遇到疑難問題,沒有解決思路的時候,文檔中每個廠商章節最後邊有個xx平臺FAQ,可以藉助這個文檔排查問題(只有魅族沒有提供)。

客戶端、服務端數據協議

  1. 廠商通道,我們需要傳遞自定義參數,當然也希望傳遞儘可能多的自定義參數。所以一開始採用了body.custom參數,但是發現如果after_open:go_activity,這種情況下MipushTestActivity收到的intent是空。扒拉SDK源碼後發現是解析intent數據的代碼中if條件語句並沒有判斷這個值而是用的extra這個值。所以傳遞custom參數會導致MipushTestActivity#onMessage中intent爲空。
  2. 那就採用的extra的方式傳遞,它是(key,value)方式。另外,使用custom傳遞會有最大1000個字節數的限制。而extra並沒有說明是否有字節限制,測試發現滿足我們要傳的數據大小的要求。姑且認爲沒有限制吧。
  3. {
        "msg_id": "uu481201399440513912",
        "display_type": "notification",
        "alias": "",
        "random_min": 0,
        "body": {
            "title": "測試自定義參數",
            "ticker": "測試自定義參數",
            "text": "無",
            "after_open": "go_app",
            "url": "",
            "activity": "",
            "custom": "",
            "play_vibrate": "true",
            "play_sound": "true",
            "play_lights": "true"
        },
        "extra": {
            "key1": "value1",
            "key2": "value2"
        }
    }

     

客戶端接入方式

  1. 友盟通道(非廠商通道)下發的push數據走的是UmengMessageHandler#dealWithCustomMessage(),原先接入的,不需要修改。
  2. 廠商通道,對於要傳遞自定義參數的接入需求。正確的接入方式是,
    1. 離線狀態下走MipushTestActivity#onMessage,
    2. 在線狀態下走UmengMessageHandler#dealWithCustomMessage()或者UmengMessageHandler#openActivity()
    3. 在線狀態不要走MipushTestActivity#onMessage方式,否則會有一系列問題,比如intent爲空,intent裏數據是加密的等情況
  3. 廠商通道,下發的push數據,走的是UmengNotificationClickHandler,這是個基類,需要自己實現一個子類,並複寫openActivity()和dealWithCustomAction()方法。openActivity對應於服務端的after_open=go_activity;dealWithCustomAction對應於服務端的after_open=go_custom。
  4. 所以如果在UmengNotificationClickHandler中實現了openActivity()和dealWithCustomAction()方法,就可以接收到數據(umessage),並做響應的跳轉。而且可以在umessage.extra中傳遞自定義的數據。這是比較方便靈活的接入方式。
  5. 但是如果沒有實現一個UmengNotificationClickHandler子類,默認走MipushTestActivity類,文檔中說會通過MipushTestActivity#onMessage方法中傳遞的intent可以接收到數據。但是測試的時候發現並非如此。在應用活躍時收到的intent是空,拿不到任何數據,根本無法跳轉。雖然這是文檔中一再強調的接入方式,也是我一開始就是採用的接入方式,但是採坑了一週之後發現,這種方式並不適合傳遞自定義數據。要麼是intent爲空,要麼是intent不爲空但是body是加密的數據(SDK內部解密過程出錯)。最後發現這個坑根本無法填上。所以才退而求其次,採用了UmengNotificationClickHandler方式。
  6. 但是使用UmengNotificationClickHandler不知道是否對統計push數據有影響,從SDK源代碼上看,這種方式並SDK內部沒有數據布點。但是MipushTestActivity的方式是有的。

小米廠商通道

  1. 發現小米廠商通道自動支持桌面角標(紅點+數字都顯示),其他廠商通道是不支持的。
  2. 但是小米系統比較噁心,只有小米系統會禁止App後臺啓動。app置於後臺時,點擊push無法把app置於前臺。
  3. 小米手機中“後臺彈出界面”的權限默認被拒絕了,這樣在後臺Service中或者其他一些後臺操作都無法啓動Activity了。在小米手機的應用權限管理中有一個“後臺彈出界面權限”,該項權限會限制當APP處在後臺時彈出Activity的動作,該權限時默認關閉的,可以在小米系統的權限管理頁看到:
  4. 對於這種限制,小米的官方通知是這樣的,所以想解決就找法務去談吧,只有加到白名單纔可以正常彈出。
  5. 我把MipushTestActivity這個文件放到了包名目錄下,測試功能正常。不知道如果不放到這個目錄下是否正常,沒有測試這種情況。
  6. 遇到一臺手機上的device token有兩個的奇怪情況。見如下截圖。後來發現原因是接入的時候使用了錯誤的方法導致的。把mPushAgent.addAlias改成mPushAgent.setAlias就可以了。
  7. addAlias和setAlias的區別,文檔中寫的很清楚。文檔鏈接 https://developer.umeng.com/docs/66632/detail/98583#h1--tag-alias-4
    //別名增加,將某一類型的別名ID綁定至某設備,老的綁定設備信息還在,別名ID和device_token是一對多的映射關係
    mPushAgent.addAlias("別名ID", "自定義類型", new UTrack.ICallBack() {
    
        @Override
        public void onMessage(boolean isSuccess, String message) {
    
        }
    
    });
    //別名綁定,將某一類型的別名ID綁定至某設備,老的綁定設備信息被覆蓋,別名ID和deviceToken是一對一的映射關係
    mPushAgent.setAlias("別名ID", "自定義類型", new UTrack.ICallBack() {
    
        @Override
        public void onMessage(boolean isSuccess, String message) {
    
        }
    
    });
    

     

華爲廠商通道

  1. 華爲廠商通道SDK有個依賴庫支持的minSDKVersion版本是16,接入華爲意味着只能從16開始支持,符合華爲醜的有自己風格的特點。
  2. 友盟沒有沒有全部適配華爲在EMUI8.0+的機型,導致比如EMUI9.0的手機收不到離線消息。建議升級到最新的友盟push SDK,目前最新版是6.0.5。而且爲了支持華爲EMUI低版本機型,還需要把target SDK version改成25.華爲的限制有很多,友盟文檔裏也寫了,符合華爲醜的有自己風格的特點。
  3. 在申請華爲app id的時候需要一個證書指紋,這個證書就是簽名apk的時候的證書。只有華爲廠商通道需要這個指紋,符合華爲醜的有自己風格的特點。
  4. 從上面幾點來看,華爲廠商通道侵入性很強,符合華爲醜的有自己風格的特點。
  5. 需要在AndroidManifest文件中添加app id,但是奇葩的是需要寫成如下形式。
    <meta-data
        android:name="com.huawei.hms.client.appid"
        android:value="appid=xxxxxx" />
    

    value中需要添加“appid=”這個前綴。只能說這種與衆不同的方式,符合華爲醜的有自己風格的特點。

魅族廠商通道

  1. 魅族註冊成功的日誌要過濾MzPushMessageReceiver,文檔中說在MeizuPushReceiver下面打印log。如果用MeizuPushReceiver在某些手機上是沒有日誌的。使用MzPushMessageReceiver會打印出日誌。成功日誌是這樣的:
    03-04 18:42:27.986 29690-30360/? I/MzPushMessageReceiver: onRegisterStatus BasicPushStatus{code='200', message='already register PushId,dont register frequently'}pushId='xxx', Become invalid after 421388 seconds }

     

  2. 魅族也存在服務端顯示下發成功,但是客戶端收不到的情況。官方文檔給出了一部分解釋,如下圖。
  3. 如果有類似這樣的日誌,可以忽略,並不是導致無法接受的問題原因。UmengPushAgent: startPush onFailure s: 503.2, s1=accs channel disabled!
  4. 友盟客服說魅族必須在application的onCreate中進行,並且不能延遲或異步初始化,不能做進程判斷。運行起來確實如此。其他廠商接入都沒問題了,偏偏魅族手機上無法獲取device token。打印日誌報錯如下:

 詳見問題鏈接 https://developer.umeng.com/docs/66632/detail/67140?um_channel=sdk 

後來發現我的接入的代碼中並沒有進程判斷,但是有多進程,所以會遇到上面那個錯誤。其實只要重啓幾次App就可以註冊成功了。

VIVO廠商通道

  1. vivo註冊成功的日誌是這樣的

    2020-03-04 18:27:46.411 28994-28994/? I/VivoPush.PushMessageReceiver: (xxx)PushMessageReceiver com.iqoo.secure ; type = 10 ; requestId = null

     

  2. 成功收到離線消息後,在我的vivo手機上該消息是摺疊的狀態

  3. 使用過程中發現vivo的廠商通道功能比較雞肋,支持機型少,支持的系統版本少。

  4. Vpush bind成功了,但是手機接收不到push?
    確認系統通知開關是否打開。部分系統版本限制,只能在進程存活下接收通知

  5. 推送成功後但是沒有收到消息的問題排查
    1)確認客戶端是否已經成功集成並turnOnPush獲取到regId,推送指定的regId是否是最新的regId;

    2) 確認手機是否已經打開通知欄開關權限;確認手機時間是否是獲取網絡時間,不要修改系統時間;

    3)檢查消息是否已經送達但是摺疊到了消息盒子裏面?目前的策略是應用存活時展示,不存活時摺疊;

    4)檢查單個客戶端每日可接收的消息數量是否超出了限制?目前正式應用是每天可接收5條羣推消息;

    5)檢查設備聯網是否有問題,如果連接的wifi設置了代理,一般需要重啓手機,可以切換手機網絡重試;

    6)如果上訴條件檢查了但還是沒有接收到消息,可以提供消息Id(taskId)和客戶端訂閱推送時返回的regId給企業QQ客服定位原因。

  6. 安裝測試包之後,vivo手機上該應用的通知權限詳情頁顯示如下。也就是默認是關閉了應用圖標標記(桌面角標)、頂部預覽、鎖屏顯示功能。這些都需要手動開啓。這些坑需要參考oppo的做法,需要應用程序主動監測是否有通知權限,並在沒有開啓權限的時候給與彈窗提示,讓用戶開啓彈窗。否則該廠商通道是無法發揮作用的。

  7. 用戶收到的推送消息是否有數量限制
    用戶可以收到的單推數量不受限制,公共類消息(全推,羣推,標籤推)一個用戶每天接收上限爲5條。

  8. vivo推送支持哪些機型和系統版本?
  9. 目前SDK僅支持下表中的機型和對應的系統及以上系統。
  10. image.png
  11. 手機晚上無法收到推送?在限制時間之外發送推送,是會延遲推送還是被直接拋棄?
    1)爲避免造成用戶打擾,目前vivo手機接收的消息爲7:00-23:00,服務器允許推送時間爲7:00-22:00,單推不受此時間限制。

    2)在允許時間之外發送的羣推或全推,會被拋棄,會計算在發送次數限制中,除非有做入口限制,纔會不計。

  12. 如何判斷系統是否支持Vpush?    
    可通過調用客戶端isSupport()返回的公共狀態碼判斷,狀態碼爲101則系統不支持。     

  13. Vpush目前支持deeplink嗎?    
    支持

  14. vivo收到的push內容是一堆加密的串,而不是像其他廠商那樣是已經解密之後的數據。如下圖所示。
  15. 解析這些數據的邏輯在'com.umeng.umsdk:agoo-accs:3.3.8.8-open-fix2'包裏面的AgooFactory類中,解析的方法叫做parseEncryptedMsg。從這個方法的實現可以看出。b對應的就是body數據。i對應的是id信息。此時拿到的body仍然是加密的數據。需要解密。
  16. 解密的邏輯仍然在'com.umeng.umsdk:agoo-accs:3.3.8.8-open-fix2'包裏。在agoo包下的b類。它是一個runnable,實現解密的具體是現在AgooFactory.parseEncryptedMsg方法中。從代碼可以看到它是HmacSHA1的加密方式。
  17. 至於爲什麼沒有解密成功呢?這個需要再次確認原因。
  18. b類的解密處理完之後,在finally塊裏會執行onMessage方法,進而把解密之後的數據以intent的形式往下傳,因而會進一步調用到MipushTestActivity的回調方法onMessage。
  19. 但是遇到的問題是app在線狀態推送消息時,onMeassge中的參數intent是null。
  20. 爲了方便排查問題,收到消息後SDK內部執行流程如下
UmengMessageHandler ->  
handleMessage ->  
dealWithNotificationMessage -> 
click -> 
NotificationProxyBroadcastReceiver ->  
onReceive -> 
getNotificationClickHandler.handleMessage -> 
openActivity(go_activity) -> 
startActivity -> 
MipushTestActivity -> 
BaseNotifyClickActivity.onNewIntent -> 
buildMessage -> 
把4中的b類加入線程池執行 -> 
見第5點 -> 
MipushTestActivity.onMessage方法被調用

 

OPPO廠商通道

  1. OPPO手機系統對開發者不友好,雙清之後安裝的debug包,會默認關閉通知欄的權限。需要重新打開。
  2. OPPO應用通知欄權限默認是關閉的,建議在APP內做彈框提示,調用requestNotificationPermission顯示通知權限彈窗,引導用戶一鍵開啓通知欄權限。接入OPUSH通知欄彈窗需要客戶端sdk1.1.0以上,建議接入最新版的客戶端sdk。
  3. 如何開啓“通知欄開關授權彈窗”功能?開發者可調用requestNotificationPermission顯示通知權限彈窗,用戶可通過彈窗自行選擇是/否打開應用的通知權限。建議在Activity的onResume方法中調用該接口以避免和其他彈窗重疊。重複調用該接口,彈窗也僅會顯示一次。
  4. 通知欄開關授權彈窗是否展示,有數據回調嗎,能統計開啓和沒開啓的人數嗎?目前通知欄開關授權彈窗是沒有數據回調的,不能統計開啓人數。
  5. 所有機型都能調用通知欄開關授權彈窗接口嗎?系統消息的版本已升級至1.1.0 版本的手機才能接收到通知欄彈窗。(查看方式:【應用管理→ 顯示系統進程→ 系統消息】)
  6. 推送成功後爲什麼收不到消息(或者未展示)?

  7. 目前支持ColorOS3.1及以上的系統。
  8. 目前只支持通知欄消息,透傳消息暫不支持。

  9. 沒啓動過的應用,無法收到消息。曾經啓動過的應用,如果30天內該設備有聯網行爲,後續無需啓動也可收到消息。

  10. Registrationid何時產生,何時失效?應用第一次啓動時註冊生效,後只有在刷機、還原手機(設置-其他設置-還原手機)、卸載應用時纔會失效。失效及變更情況參見下表:

支持桌面角標的廠商

  1. 測試發現小米所有機型都支持角標(紅點)
  2. 魅族、三星app在線時支持角標顯示
  3. 華爲app離線時支持角標顯示
  4. vivo、oppo均不支持

吐槽一下集成友盟廠商通道時發現的問題

  1. 找客服人員溝通技術問題時,對方一直無法理解,要求提供截圖,提供更多詳細信息。那如果他要是對友盟SDK內部原理有充分了解的話,是不存在這種問題的,無奈之後自己去debug SDK的執行流程,這被證明比問客服更有效
  2. 提供一個粗製濫造的demo。明明是集成廠商通道的demo卻沒有任何展示集成廠商通道的代碼,一個廠商的都沒有。只寫了註冊和初始化友盟基礎功能的示例。寫代碼只註冊,不解註冊嗎?
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章