閱讀811 返回首頁    go iPhone_iPad_Mac_手機_平板_蘋果apple


移動推送輔助通道配置__Android SDK手冊_App SDK 手冊_移動推送-阿裏雲

小米/華為係統推送支持


1.相關概念

  • 輔助通道:移動推送針對小米、華為設備管控較嚴的情況特意接入華為,小米推送輔助通道以提高在華為、小米設備上的到達率。移動推送優先選擇自有通道進行推送消息下發,隻有在自有通道斷連時選擇輔助通道下發消息。當前輔助通道通過華為、小米推送下發透傳消息,消息到達應用後經移動推送SDK處理後觸發onNotification,onMessage回調。小米、華為推送在下發透傳消息時並不保證會拉起被殺死進程(相關機製可參考小米、華為推送官網),所以輔助通道在進程被殺死情況下無法保證消息一定到達。
  • 小米彈窗:小米彈窗通過小米通道下發通知,可以在進程被殺死情況下推送成功。由於小米彈窗通過小米推送通知實現,因而通過小米彈窗下發的通知不會觸發onNotification回調。當前小米彈窗到達率統計隻覆蓋用戶點擊小米彈窗推送通知的場景,未點擊部分暫未覆蓋。

2. 配置應用

  • 小米開放平台 注冊你的App, 得到相應的小米AppID,小米AppKey,小米AppSecert。在控製台App詳情設置你的小米AppSecert。(注意:小米開發者平台的消息推送開關記得打開
  • 同理在 華為開發者聯盟 注冊App,應用審核通過後,能夠得到華為的AppID和AppSecert。在控製台App詳情中設置你的華為AppID和AppSecert。(注意,您的app不能是草稿狀態,必須是審核中,或者通過審核的狀態,不然通道不會生效。請確保您在華為控製台激活了推送通道功能)

3. 下載擴展包

將小米華為擴展包拷貝到你項目的Lib目錄下,下載地址

4. 配置Manifest

  • 為小米特別通道新增配置Permission
  1. <!--小米通道相關權限 -->
  2. <permission
  3. android:name="你的包名.permission.MIPUSH_RECEIVE"
  4. android:protectionLevel="signatureOrSystem"/>
  5. <uses-permission android:name="你的包名.permission.MIPUSH_RECEIVE"/>

【注意】: 請確保上述Permission配置是在manifest標簽域,而非application標簽域。關於AndroidManifest.xml應用清單文件的說明參考:https://developer.android.com/guide/topics/manifest/manifest-intro.html#filec

  • 為小米特別通道新增配置Manifest:
  1. <!-- 小米通道官方配置 -->
  2. <service android:name="com.xiaomi.mipush.sdk.PushMessageHandler" android:enabled="true" android:exported="true" />
  3. <service android:enabled="true" android:name="com.xiaomi.mipush.sdk.MessageHandleService" />
  4. <receiver android:name="com.alibaba.sdk.android.push.MiPushBroadcastReceiver" android:exported="true" >
  5. <intent-filter>
  6. <action android:name="com.xiaomi.mipush.RECEIVE_MESSAGE" />
  7. </intent-filter>
  8. <intent-filter>
  9. <action android:name="com.xiaomi.mipush.MESSAGE_ARRIVED" />
  10. </intent-filter>
  11. <intent-filter>
  12. <action android:name="com.xiaomi.mipush.ERROR" />
  13. </intent-filter>
  14. </receiver>
  15. <receiver android:name="com.xiaomi.push.service.receivers.NetworkStatusReceiver" android:exported="true" >
  16. <intent-filter>
  17. <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
  18. <category android:name="android.intent.category.DEFAULT" />
  19. </intent-filter>
  20. </receiver>

注意,com.xiaomi.push.service.XMPushService加入Manifest後,這個類名會在Android Studio中顯示成紅色,請忽略該錯誤,不要刪除這行配置。(該應用在小米機器上會找到對應的Service)

  • 為華為特別通道新增配置Manifest:
  1. <!-- 華為通道官方配置 -->
  2. <receiver android:name="com.alibaba.sdk.android.push.HuaWeiReceiver">
  3. <intent-filter>
  4. <action android:name="com.huawei.android.push.intent.REGISTRATION"/>
  5. <action android:name="com.huawei.android.push.intent.RECEIVE"/>
  6. <action android:name="com.huawei.intent.action.PUSH"/>
  7. <action android:name="com.huawei.intent.action.PUSH_STATE"/>
  8. </intent-filter>
  9. </receiver>

5. Proguard配置

  • 如果集成推送SDK的工程開啟代碼混淆,在Proguard配置的基礎上,需要添加以下輔助通道的Proguard配置。
  1. # 小米通道
  2. -keep class com.xiaomi.** {*;}
  3. -dontwarn com.xiaomi.**
  4. # 華為通道
  5. -keep class com.huawei.** {*;}
  6. -dontwarn com.huawei.**

6. 在應用中初始化小米華為通道

將以下代碼加入你application.onCreate()方法中初始通道:

  1. // 注冊方法會自動判斷是否支持小米係統推送,如不支持會跳過注冊。
  2. MiPushRegister.register(applicationContext, "小米AppID", "小米AppKey");
  3. // 注冊方法會自動判斷是否支持華為係統推送,如不支持會跳過注冊。
  4. HuaWeiRegister.register(applicationContext);

本方法會自動判斷是否支持小米係統推送,如不支持會跳過注冊。

7. 在日誌中查看初始化情況

華為通道初始化成功,可以看到以下日誌:

  1. 11-11 22:21:33.671 30248-30324/com.xxx E/MPS:HuaWeiRegister: HuaWeiRegister checkDevice flag=true //確認是華為的手機
  2. 11-11 22:21:33.674 30248-30324/com.xxx E/MPS:HuaWeiRegister﹕ Register huawei push............ //開始注冊華為手機
  3. 11-11 22:21:33.714 29643-30328/com.xxx E/MPS:HuaWeiReceiver﹕ huawei register success,token = 08657430243125472000000411000001
  4. 11-11 22:21:33.714 29643-30328/com.xxx E/MPS:HuaWeiReceiver﹕ report huaweiPushId intent... //完成華為注冊和信息上報

小米通道初始化成功,可以看到以下日誌:

  1. 12-09 22:20:39.710 19566-19566/com.xxx E/MPS:MiPushRegister: MiPushRegister checkDevice flag=true //確認是小米的手機
  2. 12-09 22:20:39.712 19566-19566/com.xxx E/MPS:MiPushRegister: Register mipush. //開始注冊小米
  3. 12-09 22:20:40.596 19566-19733/com.xxx E/MPS:MiPushReceiver: XiaoMi register success. //小米注冊成功 regid=d//igwEhgBGCI2TG6lWqlCesc0I6xE1wUhNCBXQ8uNOi/dDZioYXVysbrVrvRmyEVPn9nWz92D28IzYbA1RzoGDyTzYZwXKfBHEQkrey4G8=

收到小米通道下行的消息:(需要將sdk日誌等級設置到DEBUG)

  1. 12-09 22:24:34.065 19566-25042/com.xxx D/MPS:MiPushReceiver: onReceiveMessage,msg=[{"f":262,"b":"{"content" ... ... ,"i":"f__-rnje3_OH74gE|VG0g3kwMnGADAGrXZku1FFW5"}]

注:如果控製台配置了小米/華為的信息,app需要加對應的jar包依賴,不然會有crash的風險。

8. 小米係統輔助彈窗

小米設備管控嚴格,接入推送功能的App進程在後台被清理後,收不到推送通知;接入小米輔助彈窗後,可走MIUI係統的通道進行通知的推送,保證App後台被清理後,仍能收到推送通知(v2.3.0及以上支持)。

8.1 客戶端

  • 該功能的使用需要接入小米推送輔助通道,確保使用最新的小米華為擴展包,具體參考上文;
  • 小米輔助彈窗送達的通知展示效果,和普通通知相同;
  • 服務端指定小米輔助彈窗通道推送時,一定要指定通知點擊後要打開的Activity,該Activity需繼承自抽象類MiPushSystemNotificationActivity,否則無法獲取到通知的相關信息,並且會影響通知到達率的統計;
  • MiPushSystemNotificationActivity中提供抽象方法onMiPushSysNoticeOpened(),實現該方法後可獲取到小米輔助彈窗通知的標題內容額外參數,在通知點擊時觸發,原本的通知回調onNotification()onNotificationOpened()不適用於小米輔助彈窗;

  • 接入如下所示:

  1. import com.alibaba.sdk.android.push.MiPushSystemNotificationActivity;
  2. public class XiaoMiPushActivity extends MiPushSystemNotificationActivity {
  3. static final String TAG = "XiaoMiPushActivity";
  4. @Override
  5. protected void onCreate(Bundle savedInstanceState) {
  6. super.onCreate(savedInstanceState);
  7. }
  8. /**
  9. * 實現通知打開回調方法,獲取通知相關信息
  10. * @param title 標題
  11. * @param summary 內容
  12. * @param extMap 額外參數
  13. */
  14. @Override
  15. protected void onMiPushSysNoticeOpened(String title, String summary, Map<String, String> extMap) {
  16. Log.d("OnMiPushSysNoticeOpened, title: " + title + ", content: " + summary + ", extMap: " + extMap);
  17. }
  18. }

8.2 服務端

  • OpenAPI提供setXiaoMiActivity()接口,參數為小米輔助彈窗通知打開時跳轉的Activity,setStoreOffline為true時生效;
  • 配置setXiaoMiActivity()後,僅對後台進程被清理的小米設備生效,對非小米設備和在線小米設備不生效;
  • 推送通知標題內容額外參數的設置和普通推送接口相同,即setTitle()setBody()setAndroidActivity(),額外參數設置中的功能性設置如聲音、震動等對小米輔助彈窗通知不生效;
    1. PushRequest pushRequest = new PushRequest();
    2. // 其餘設置省略
    3. // ...
    4. // 0:表示消息(默認為0), 1:表示通知
    5. pushRequest.setType(1);
    6. // 標題
    7. pushRequest.setTitle(dateFormat.format(new Date()));
    8. // 內容
    9. pushRequest.setBody("PushRequest body");
    10. // 額外參數
    11. pushRequest.setAndroidExtParameters("{"k1":"android","k2":"v2"}");
    12. // 設置小米輔助彈窗打開Activity
    13. pushRequest.setXiaomiActivity("*****");

8.3 場景解析

以下幾種普通推送結合小米輔助彈窗推送的場景,幫助您快速理解小米輔助彈窗功能的配置。

客戶端配置

客戶端有Main、Second兩個Activity,MainActivity為App打開主頁麵,SecondActivity extends MiPushSystemNotificationActivity;

  • 普通通知回調配置:
  1. public class MyMessageReceiver extends MessageReceiver {
  2. /**
  3. * 推送通知的回調方法
  4. * @param context
  5. * @param title
  6. * @param summary
  7. * @param extraMap
  8. */
  9. @Override
  10. public void onNotification(Context context, String title, String summary, Map<String, String> extraMap) {
  11. Log.d(TAG, "Receive notification, title: " + title + ", content: " + summary + ", extraMap: " + extraMap);
  12. }
  13. }
  • MainActivity定義:
  1. package com.alibaba.push.testdemo;
  2. public class MainActivity extends Activity {
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. Log.d(TAG, "Main");
  6. }
  7. }
  • SecondActivity定義:
  1. package com.alibaba.push.testdemo;
  2. import com.alibaba.sdk.android.push.MiPushSystemNotificationActivity;
  3. public class SecondActivity extends MiPushSystemNotificationActivity {
  4. /**
  5. * 小米輔助彈窗指定打開Activity回調
  6. * @param title 標題
  7. * @param content 內容
  8. * @param extraMap 額外參數
  9. */
  10. @Override
  11. protected void onMiPushSysNoticeOpened(String title, String content, Map<String, String> extraMap) {
  12. Log.d(TAG, "Receive XiaoMi notification, title: " + title + ", content: " + content + ", extraMap: " + extraMap);
  13. }
  14. }

場景1:普通推送打開App + 小米輔助彈窗

服務端配置如下:

  1. PushRequest pushRequest = new PushRequest();
  2. // 其餘設置省略
  3. // ...
  4. // 0:表示消息(默認為0), 1:表示通知
  5. pushRequest.setType(1);
  6. // 標題
  7. pushRequest.setTitle("hello");
  8. // 內容
  9. pushRequest.setBody("PushRequest body");
  10. // 點擊通知後動作,1:打開應用 2: 打開應用Activity 3:打開 url
  11. pushRequest.setAndroidOpenType("1");
  12. // 設置小米輔助彈窗打開Activity
  13. pushRequest.setXiaomiActivity("com.alibaba.push.testdemo.SecondActivity");
  14. // 設定android類型設備通知的擴展屬性
  15. pushRequest.setAndroidExtParameters("{"k1":"android","k2":"v2"}");;

推送結果:

  • 非小米設備和在線小米設備

    • 收到普通推送通道彈出的通知,點擊後打開App,進入首頁MainActivity,如果設備在前台,保持當前界麵不變;
    • onNotification()回調輸出Receive notification, title: hello, content: PushRequest body, extraMap: {k1=android, k2=v2}
  • 清理進程後的小米設備

    • 小米輔助彈窗通道彈出通知,點擊後跳轉到SecondActivity
    • onMiPushSysNoticeOpened()回調輸出Receive XiaoMi notification, title: hello, content: PushRequest body, extraMap: {k1=android, k2=v2}

場景2:普通推送打開Activity + 小米輔助彈窗

服務端配置如下:

  1. PushRequest pushRequest = new PushRequest();
  2. // 其餘設置省略
  3. // ...
  4. // 0:表示消息(默認為0), 1:表示通知
  5. pushRequest.setType(1);
  6. // 標題
  7. pushRequest.setTitle("hello");
  8. // 內容
  9. pushRequest.setBody("PushRequest body");
  10. // 點擊通知後動作,1:打開應用 2: 打開應用Activity 3:打開 url
  11. pushRequest.setAndroidOpenType("2");
  12. // 指定普通推送要打開的Activity
  13. pushRequest.setAndroidActivity("com.alibaba.push.testdemo.SecondActivity");
  14. // 設置小米輔助彈窗打開Activity
  15. pushRequest.setXiaomiActivity("com.alibaba.push.testdemo.SecondActivity");
  16. // 設定android類型設備通知的擴展屬性
  17. pushRequest.setAndroidExtParameters("{"k1":"android","k2":"v2"}");

推送結果:

  • 非小米設備和在線小米設備

    • 收到普通推送通道彈出的通知,點擊後跳轉到SecondActivity
    • onNotification()回調輸出Receive notification, title: hello, content: PushRequest body, extraMap: {k1=android, k2=v2}
  • 清理進程後的小米設備

    • 小米輔助彈窗通道彈出通知,點擊後跳轉到SecondActivity
    • onMiPushSysNoticeOpened()回調輸出Receive XiaoMi notification, title: hello, content: PushRequest body, extraMap: {k1=android, k2=v2}

最後更新:2016-12-20 16:09:47

  上一篇:go SDK API介紹__Android SDK手冊_App SDK 手冊_移動推送-阿裏雲
  下一篇:go iOS推送證書設置__iOS SDK手冊_App SDK 手冊_移動推送-阿裏雲