MobPush Android常見問題

語言: CN / TW / HK

配置了預設點選跳轉介面,對所有通道都有效嗎

只對MobPush、魅族、小米、華為、OPPO、VIVO通道有效,對FCM通道無效。

如何獲取回撥引數

  • 程序存活的情況下,可在我們的回撥監聽中看到通知詳情,可以根據回撥引數進行處理。 詳情請檢視 API介面->推送監聽介面。
  • 程序被殺情況下,回撥監聽不可用,但點選通知後拉起應用的啟動頁面,會觸發啟動Activity的onCreate或onNewIntent,通過getIntent拿到回傳的Intent,可以拿到通知詳情。
  • 注:PushSDK提供瞭解析方法來獲取回撥引數,但廠商通知主要是獲取附加欄位,不會把所有資訊都解析出來。 跳轉首頁獲取引數

    JSONArray jsonArray = MobPushUtils.parseMainPluginPushIntent(getIntent()); System.out.println("-------------JsonPushData列印檢視:"+jsonArray);

返回說明

返回

欄位

說明

"id":"4bu9702gmq4mvl3myo"

id

通知任務id ,僅廠商通知有該欄位

{"key":"value"}

附加欄位

附件欄位需指定,不指定不會出現 ,僅廠商通知有該欄位

{"from_tcp":true}

from_tcp

訊息是否來自MobPushTCP通道,true:是

{"msg":"MobPushNotifyMessage{}"}

msg

訊息體,物件為MobPushNotifyMessage,僅MobPushTCP通道訊息有該欄位

{"channel":"mobpush"}

channel

渠道名

2.2 scheme跳轉獲取引數,詳情請檢視 API介面->scheme跳轉

JSONArray jsonArray = MobPushUtils.parseSchemePluginPushIntent(getIntent());
System.out.println("-------------JsonScheme列印檢視:"+jsonArray);

返回說明

返回

欄位

說明

{"from_tcp":true}

from_tcp

訊息是否來自MobPushTCP通道,true:是

{"msg":"MobPushNotifyMessage{}"}

msg

訊息體,物件為MobPushNotifyMessage,僅MobPushTCP通道訊息有該欄位

{"key":"value"}

附加欄位

附件欄位需指定,建議不要使用url做為key

{"mobpush_link_k":"mlink://com.mob.mobpush.link"}

scheme

scheme地址

{"mobpush_link_v":"schemeKey=schemeValue"}

scheme引數

scheme地址下攜帶的scheme引數

{"id":"4brfm8nti9aj1arf28"}

id

推送任務id

{"channel":"xiaomi"}

channel

渠道名

{"schemeLink":"mlink://com.mobpush.demo2"}

scheme

scheme地址

{"schemeKey":"schemeValue"}

scheme引數

scheme地址下攜帶的scheme引數(華為,VIVO,OPPO)

{"schemeKey":"schemeValue","schemeUrl":"mlink://com.mob.mobpush.link"}

schemeUrl

scheme地址下攜帶的scheme引數(flyme)

  1. 如不使用PushSDK提供的解析方法,可參考以下方法獲取回撥引數

    private void dealPushResponse(Intent intent) { Bundle bundle = null; if (intent != null) { bundle = intent.getExtras(); if (bundle == null) { Log.e("PushResponse","bundle的值為空"+bundle); return; } else { Set keySet = bundle.keySet(); if (keySet == null || keySet.isEmpty()) { return; } for (String key : keySet) { //通過key獲取bundle中的key對應的值。就是附加資料了 Log.e("PushResponse","bundlekey===========================點選資訊"+key); } Log.e("PushResponse","bundle===========================點選資訊"+bundle.toString()); } } }

OPPO推送時按全部人群進行推送,為什麼有的OPPO裝置接收不到

因為OPPO推送對應全部人群這種全量推送是有個時間限制規則的,當全量推送時當天新註冊的OPPO裝置是不生效的,第二天才生效,被全量推送計算在目標裝置組中,T+1規則。 而對應單一OPPO裝置推送時,沒有T+1規則限制,註冊成功即立即生效。

廠商推送開啟通知都會有回撥嗎

不是都有回撥,OPPO推送沒有接收通知和開啟通知的回撥;FCM推送在應用處於後臺時或者應用程序被殺掉時沒有接收通知和開啟通知的回撥。

應用在前臺時,MobPush通道推送接收不到

應用在前臺時,MobPush通道推送接收不到,請按照以下步驟檢查:

  1. 檢查手機網路是否正常
  2. 檢查手機通知許可權是否開啟
  3. 是否在通知欄不重要的通知裡
  4. 檢查應用配置是否正確

呼叫MobPush.setClickNotificationToLaunchMainActivity(),設定為false,點選通知不啟動主頁,為什麼設定後,沒有起作用

此方法不是對所有通道都起作用,目前只對MobPush通道、魅族通道、小米通道起作用,對於華為通道、OPPO通道、FCM通道來說,由於各個廠商不同實現的原因,是否呼叫此方式都不影響這三個通道,預設都是啟動主頁。

OPPO和VIVO裝置通知許可權開關問題

OPPO:

在未接入OPPO PUSH前,應用的通知欄許可權是預設關閉狀態; 接入OPPO PUSH後,ColorOS3.1至5.0版本的OPPO手機,使用者激活了相關應用後,通知欄許可權會預設開啟。特別說明,若使用者在使用舊版本應用(未整合OPPO PUSH),手動將應用的通知欄許可權進行了關閉,則只有使用者手動解除安裝舊版本應用,再安裝新版本(整合OPPO PUSH)並激活,通知欄才會預設開啟。採用覆蓋安裝的方式,通知欄許可權不會預設開啟; ColorOS5.1及以後的版本的手機,通知欄許可權由系統統一關閉,需使用者手動開啟。

VIVO: 整合VPUSH,通知許可權總開關基本預設開啟,但下方類別開關預設關閉,需要使用者手動開啟。

小米手機接收不到推送

如果未在小米商店釋出的移動應用(APP),小米推送團隊將有權不再提供推送服務。小米應用商店對開發者應用定期安全稽核的結果,調整該應用的推送許可權,如開發者應用未能通過小米應用商店定期安全稽核,小米有權單方解除協議,或立即關閉該應用的推送許可權,直至該應用通過小米應用商店的安全稽核並在小米應用商店釋出。詳情可參考:http://dev.mi.com/console/doc/detail?pId=2634

如果小米手機接收不到推送,請先檢查通知許可權是否開啟,同時小米裝置從MIUI9開始通知欄使用不重要通知過濾,檢查通知欄裡不重要通知裡是否有對應應用的通知。

應用通知許可權未開啟狀態,開啟後推送接收不到

一開始應用通知許可權未開啟,等進行通知許可權開啟時,請殺掉程序,重新啟動APP然後重新推送。

接收回調和點選通知回撥一定會被呼叫嗎

不一定。分推送通道,不同廠商,有不同的實現方式,導致有的都回調,有的只會回撥點選通知,有的都沒有回撥。

MobPush通道,接收回調和點選通知回撥都會被呼叫;

華為廠商通道,廠商推送只提供了點選通知回撥;

小米廠商通道,接收回調和點選通知回撥都會被呼叫;

魅族廠商通道,接收回調和點選通知回撥都會被呼叫;

OPPO廠商通道,兩種回撥都沒有;

FCM通道,應用在前臺時接收回調和點選通知回撥都會被呼叫,應用在後臺或者應用程序被殺掉未啟動時兩種回撥都沒有;

VIVO廠商通道,廠商推送只提供了點選通知回撥。

設定標籤成功後,進行通過標籤推送,接收不到推送

設定標籤成功後,個別廠商同步拉取資料需要時間,導致介面設定標籤成功,但是推送時裝置沒有同步,沒有目標裝置,故推送接收不到。建議裝置標籤成功後,等待幾分鐘之後再進行推送。

一臺裝置能設定幾個別名?不同的裝置能設定相同的別名嗎?

同一個APP,一臺裝置只能對應一個別名,新設定的會覆蓋掉之前設定的別名。不同的裝置不能同時設定相同的別名,最後設定的裝置生效,其他裝置的別名都將失效。

如果應用在Android 9的裝置上獲取不到註冊ID即(regId)

如果在其他版本的Android手機可以獲取到註冊ID,而在Android 9的裝置上獲取不到時,請確認下targetSdkVersion是大於27; 大於27時需在AndroidManifest.xml檔案的中application標籤中新增 android:usesCleartextTraffic="true"

如果推送配置了FCM廠商,同時需要使用Firebase 的其他產品(ads等產品)時,編譯時報錯了,怎麼辦

  1. 單獨配置ads和FCM時,他們所依賴的相同的庫版本是否一致,如果不一致,需要進行版本統一;
  2. 進行版本統一:在APPmodule的build.gradle中新增

    configurations.all { exclude group: 'com.google.firebase', module: 'firebase-messaging' } //在app module 的build.gradle檔案的dependencies裡新增 compile 'com.google. firebase:firebase-messaging:17.1.0'

配置vivo廠商推送的appId和AppKey時,需要把“-”去掉嗎

不需要

接入vivo廠商推送,傳送推送成功,vivo裝置未接收到推送

  1. 檢查配置是否正確,包名是否和申請vivo推送服務時的包名一致;
  2. 手機通知許可權是否開啟;
  3. 檢查訊息是否已經送達但是摺疊到了訊息盒子裡面?目前的策略是應用存活時展示,不存活時摺疊;
  4. 檢查裝置聯網是否有問題,如果連線的wifi設定了代理,一般需要重啟手機,可以切換手機網路重試;

如果配置了廠商推送的資訊,但是執行打包發現AppKey不完整,確實第一個數字時,怎麼辦

這是gradle版本太高導致的,請在配置有問題的地方加入一個空格。

配置了華為廠商推送,為什麼有的華為裝置無法接收離線訊息

首先,排查配置的華為廠商引數是否正確; 其次,檢查華為裝置EMUI版本,低於5.0可能不支援,如果低於5.0,可以嘗試升級裝置裡的‘華為移動服務’應用,升級‘華為移動服務’可能會支援華為廠商推送。

MobPush的廠商推送和應用使用的其他第三方產品中的廠商推送衝突了,如何解決

首頁,在build.gradle的MobPush{}配置中照常配置廠商資訊; 然後,在build.gradle檔案最後新增:

configurations.all {
    exclude group: 'com.mob.push.plugins', module: 'meizu'   //遮蔽MobPush提供的魅族廠商包
    exclude group: 'com.mob.push.plugins', module: 'xiaomi'  //遮蔽MobPush提供的小米廠商包
    exclude group: 'com.mob.push.plugins', module: 'vivo'    //遮蔽MobPush提供的vivo廠商包
    exclude group: 'com.mob.push.plugins', module: 'oppo'    //遮蔽MobPush提供的oppo廠商包
}

哪個廠商衝突,exclude哪個廠商就可以。

如果應用使用的其他第三方產品中的魅族廠商推送和MobPush的魅族廠商推送衝突了,推送時其中一個不起作用

由於魅族廠商推送對接收監聽回撥只取AndroidManifest.xml中配置的第一個Reciever,所以誰在前面配置哪個產品就生效,後面配置多少個魅族廠商推送回調監聽都無效。 解決方法: 自定義一個Receiver,繼承自MzPushMessageReceiver,重新裡面所有的方法,然後這個自定義的Receiver裡呼叫MobPush的魅族回撥和第三方產品的魅族回撥;然後再AndroidManifest.xml檔案中進行配置:

<receiver
                android:name="自定義Receiver">
                <intent-filter>
                        <action
                                android:name="com.meizu.flyme.push.intent.MESSAGE" />
                        <action
                              android:name="com.meizu.flyme.push.intent.REGISTER.FEEDBACK" />
                        <action
                                android:name="com.meizu.flyme.push.intent.UNREGISTER.FEEDBACK" />
                        <action
                                android:name="com.meizu.c2dm.intent.REGISTRATION" />
                        <action
                                android:name="com.meizu.c2dm.intent.RECEIVE" />
                        <category
                                android:name="包名" />
                </intent-filter>
        </receiver>

在自定義的Receiver裡實現示例:

public class MyReceiver extends MzPushMessageReceiver {
         private OtherReceiver otherReceiver;
         private PushMeiZuRevicer mobpushMeiZuReceiver;
         public MyReceiver() {
                otherReceiver = new OtherReceiver();
                mobpushMeiZuReceiver = new PushMeiZuRevicer();
         }
         @Override
         public void onPushStatus(Context context, PushSwitchStatus pushSwitchStatus) {
                otherReceiver.onPushStatus(context, pushSwitchStatus);
                mobpushMeiZuReceiver.onPushStatus(context, pushSwitchStatus);
         }
         @Override
         public void onRegisterStatus(Context context, RegisterStatus registerStatus) {
                otherReceiver.onRegisterStatus(context, registerStatus);
                mobpushMeiZuReceiver.onRegisterStatus(context, registerStatus);
         }
         @Override
         public void onRegister(Context context, String s) {
                otherReceiver.onRegister(context, s);
                mobpushMeiZuReceiver.onRegister(context, s);
         }
         @Override
         public void onUnRegister(Context context, boolean b) {
                otherReceiver.onUnRegister(context, b);
                mobpushMeiZuReceiver.onUnRegister(context, b);
         }
         @Override
         public void onUnRegisterStatus(Context context, UnRegisterStatus unRegisterStatus) {
                otherReceiver.onUnRegisterStatus(context, unRegisterStatus);
                mobpushMeiZuReceiver.onUnRegisterStatus(context, unRegisterStatus);
         }
         @Override
         public void onSubTagsStatus(Context context, SubTagsStatus subTagsStatus) {
                otherReceiver.onSubTagsStatus(context, subTagsStatus);
                mobpushMeiZuReceiver.onSubTagsStatus(context, subTagsStatus);
         }
         @Override
         public void onSubAliasStatus(Context context, SubAliasStatus subAliasStatus) {
                otherReceiver.onSubAliasStatus(context, subAliasStatus);
                mobpushMeiZuReceiver.onSubAliasStatus(context, subAliasStatus);
         }
         @Override
         public void onNotificationClicked(Context context, MzPushMessage mzPushMessage) {
                otherReceiver.onNotificationClicked(context, mzPushMessage);
                mobpushMeiZuReceiver.onNotificationClicked(context, mzPushMessage);
         }
         @Override
         public void onNotificationArrived(Context context, MzPushMessage mzPushMessage) {
                otherReceiver.onNotificationArrived(context, mzPushMessage);
                mobpushMeiZuReceiver.onNotificationArrived(context, mzPushMessage);
         }

         @Override
         public void onNotifyMessageArrived(Context context, String s) {
                otherReceiver.onNotifyMessageArrived(context, s);
                mobpushMeiZuReceiver.onNotifyMessageArrived(context, s);
         }
    }

配置了魅族廠商推送,客戶端debug log輸出註冊成功,推送時接收不到推送或者離線推送接收不到,如何解決

  1. 確認下魅族廠商推送接入的是flyme推送,而不是ups推送。
  2. 確認下魅族開發者平臺建立的應用是否配置了回執,如果沒有配置,請配置上哦~,這個會影響推送結果,導致推送不成功。
  3. 如果上面都確認正常,仍存在問題請聯絡MobTech技術支援進行排查解決。

同一個推送監聽回撥被呼叫了多次,為什麼

如果應用有多個子程序,同時推送監聽回撥是在Application的onCreate方法中新增,那麼存在幾個子程序Application的onCreate會呼叫幾次,監聽回撥也會被新增幾次,所以會出現同一個推送監聽回撥被呼叫多次的情況。 如果想要只監聽回撥主程序,那麼再新增時需判斷下當前程序,為主程序時再新增推送監聽回撥。

支援角標功能嗎

MobPush是支援角標功能的。需呼叫MobPush.setShowBadge(true);開啟角標功能,預設false,角標功能關閉。

對於廠商通道來說,小米系統本身就支援角標功能,不需要做任何處理;

魅族廠商不支援角標功能;

OPPO和VIVO廠商目前只對自家應用和微信QQ開放角標功能;

華為廠商對EMUI 8.0 及以上支援角標功能,如果需要對華為廠商開啟角標功能,在服務端推送時在extrasMapList引數裡面新增androidBadgeClass引數,其引數值是應用入口Activity 的全路徑,這樣EMUI8.0及以上走華為廠商推送的裝置就可以顯示角標了。

MobPush支援多包名嗎

支援。

一臺裝置應用能設定多個標籤嗎?相同應用不同的裝置能設定相同的標籤嗎

同一個APP,一臺裝置可以訂閱多個標籤,標籤請儘量使用英文避免使用中文或特殊字元,導致廠商訂閱標籤失敗而推送不成功;不同的裝置可以同時設定同一標籤。

MobPush的RegistrationId會發生變化嗎?如果傳送變化是在什麼時機下?RegistrationId是固定長度的嗎

註冊id一般情況下不會發送變化,但也會出現發現變化的情況,有時解除安裝重灌或者裝置恢復出廠裝置等情況下注冊id會發生變化,而註冊id的長度由於服務端內部優化後續會變化,不是固定長度的。

使用StopPush是否會關閉所有廠商渠道推送

除了FCM廠商無法關閉(沒有提供相關介面),TCP以及其他廠商都是正常關閉的。

開啟通知許可權後,還是無法收到

MobPush只會在初始化的時候更新記錄的通知許可權狀態。

如初始化的時候通知許可權是關閉的,需再次重啟APP,更新記錄的通知許可權狀態。 如需要實時更新,可呼叫該方法:

//開啟輪詢開關
MobPush.startNotificationMonitor();
//關閉輪詢開關
MobPush.stopNotificationMonitor();

無法統計到廠商點選

請在點選通知開啟的Activity的onCreate中加上該方法

MobPush.notificationClickAck(getIntent());

華為廠商長文字樣式無效

使用華為長文字樣式,標題(title)為必填項。

華為廠商解析intent為空

華為傳遞資料給應用僅在NC版本在在9.11及以上版本生效,NC版本檢視方式(設定-應用-應用管理-推送服務),老舊裝置存在無推送服務或版本較低問題,可嘗試升級版本解決,如無法升級,華為未給出老舊裝置相容方案。詳細說明可檢視:自定義點選訊息動作

整合華為廠商通道上架Google商店被拒,應該怎麼解決?

如上架google商店被拒文案中有“We found your app is using a non-compliant version of Huawei Mobile Services SDK which contains code to download or install applications from unknown sources outside of Google Play”字樣,原因是您當前使用的華為廠商SDK版本過低,華為在 6.3.0.304(2022-03-31)及以上的版本修復了該問題,您可在Gradle指令碼中主動宣告該版本,示例如下。

image.png