811
windows
移動推送輔助通道配置__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
:
<!--小米通道相關權限 -->
<permission
android:name="你的包名.permission.MIPUSH_RECEIVE"
android:protectionLevel="signatureOrSystem"/>
<uses-permission android:name="你的包名.permission.MIPUSH_RECEIVE"/>
【注意】: 請確保上述Permission
配置是在manifest
標簽域,而非application
標簽域。關於AndroidManifest.xml應用清單文件的說明參考:https://developer.android.com/guide/topics/manifest/manifest-intro.html#filec
- 為小米特別通道新增配置Manifest:
<!-- 小米通道官方配置 -->
<service android:name="com.xiaomi.mipush.sdk.PushMessageHandler" android:enabled="true" android:exported="true" />
<service android:enabled="true" android:name="com.xiaomi.mipush.sdk.MessageHandleService" />
<receiver android:name="com.alibaba.sdk.android.push.MiPushBroadcastReceiver" android:exported="true" >
<intent-filter>
<action android:name="com.xiaomi.mipush.RECEIVE_MESSAGE" />
</intent-filter>
<intent-filter>
<action android:name="com.xiaomi.mipush.MESSAGE_ARRIVED" />
</intent-filter>
<intent-filter>
<action android:name="com.xiaomi.mipush.ERROR" />
</intent-filter>
</receiver>
<receiver android:name="com.xiaomi.push.service.receivers.NetworkStatusReceiver" android:exported="true" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
注意,com.xiaomi.push.service.XMPushService
加入Manifest後,這個類名會在Android Studio
中顯示成紅色,請忽略該錯誤,不要刪除這行配置。(該應用在小米機器上會找到對應的Service)
- 為華為特別通道新增配置Manifest:
<!-- 華為通道官方配置 -->
<receiver android:name="com.alibaba.sdk.android.push.HuaWeiReceiver">
<intent-filter>
<action android:name="com.huawei.android.push.intent.REGISTRATION"/>
<action android:name="com.huawei.android.push.intent.RECEIVE"/>
<action android:name="com.huawei.intent.action.PUSH"/>
<action android:name="com.huawei.intent.action.PUSH_STATE"/>
</intent-filter>
</receiver>
5. Proguard配置
- 如果集成推送SDK的工程開啟代碼混淆,在Proguard配置的基礎上,需要添加以下輔助通道的Proguard配置。
# 小米通道
-keep class com.xiaomi.** {*;}
-dontwarn com.xiaomi.**
# 華為通道
-keep class com.huawei.** {*;}
-dontwarn com.huawei.**
6. 在應用中初始化小米華為通道
將以下代碼加入你application.onCreate()方法中初始通道:
// 注冊方法會自動判斷是否支持小米係統推送,如不支持會跳過注冊。
MiPushRegister.register(applicationContext, "小米AppID", "小米AppKey");
// 注冊方法會自動判斷是否支持華為係統推送,如不支持會跳過注冊。
HuaWeiRegister.register(applicationContext);
本方法會自動判斷是否支持小米係統推送,如不支持會跳過注冊。
7. 在日誌中查看初始化情況
華為通道初始化成功,可以看到以下日誌:
11-11 22:21:33.671 30248-30324/com.xxx E/MPS:HuaWeiRegister: HuaWeiRegister checkDevice flag=true //確認是華為的手機
11-11 22:21:33.674 30248-30324/com.xxx E/MPS:HuaWeiRegister﹕ Register huawei push............ //開始注冊華為手機
11-11 22:21:33.714 29643-30328/com.xxx E/MPS:HuaWeiReceiver﹕ huawei register success,token = 08657430243125472000000411000001
11-11 22:21:33.714 29643-30328/com.xxx E/MPS:HuaWeiReceiver﹕ report huaweiPushId intent... //完成華為注冊和信息上報
小米通道初始化成功,可以看到以下日誌:
12-09 22:20:39.710 19566-19566/com.xxx E/MPS:MiPushRegister: MiPushRegister checkDevice flag=true //確認是小米的手機
12-09 22:20:39.712 19566-19566/com.xxx E/MPS:MiPushRegister: Register mipush. //開始注冊小米
12-09 22:20:40.596 19566-19733/com.xxx E/MPS:MiPushReceiver: XiaoMi register success. //小米注冊成功 regid=d//igwEhgBGCI2TG6lWqlCesc0I6xE1wUhNCBXQ8uNOi/dDZioYXVysbrVrvRmyEVPn9nWz92D28IzYbA1RzoGDyTzYZwXKfBHEQkrey4G8=
收到小米通道下行的消息:(需要將sdk日誌等級設置到DEBUG)
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()
不適用於小米輔助彈窗;接入如下所示:
import com.alibaba.sdk.android.push.MiPushSystemNotificationActivity;
public class XiaoMiPushActivity extends MiPushSystemNotificationActivity {
static final String TAG = "XiaoMiPushActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
/**
* 實現通知打開回調方法,獲取通知相關信息
* @param title 標題
* @param summary 內容
* @param extMap 額外參數
*/
@Override
protected void onMiPushSysNoticeOpened(String title, String summary, Map<String, String> extMap) {
Log.d("OnMiPushSysNoticeOpened, title: " + title + ", content: " + summary + ", extMap: " + extMap);
}
}
8.2 服務端
- OpenAPI提供
setXiaoMiActivity()
接口,參數為小米輔助彈窗通知打開時跳轉的Activity,setStoreOffline
為true時生效; - 配置
setXiaoMiActivity()
後,僅對後台進程被清理的小米設備生效,對非小米設備和在線小米設備不生效; - 推送通知
標題
、內容
和額外參數
的設置和普通推送接口相同,即setTitle()
、setBody()
和setAndroidActivity()
,額外參數設置中的功能性設置如聲音、震動等對小米輔助彈窗通知不生效;PushRequest pushRequest = new PushRequest();
// 其餘設置省略
// ...
// 0:表示消息(默認為0), 1:表示通知
pushRequest.setType(1);
// 標題
pushRequest.setTitle(dateFormat.format(new Date()));
// 內容
pushRequest.setBody("PushRequest body");
// 額外參數
pushRequest.setAndroidExtParameters("{"k1":"android","k2":"v2"}");
// 設置小米輔助彈窗打開Activity
pushRequest.setXiaomiActivity("*****");
8.3 場景解析
以下幾種普通推送結合小米輔助彈窗推送的場景,幫助您快速理解小米輔助彈窗功能的配置。
客戶端配置
客戶端有Main、Second兩個Activity,MainActivity為App打開主頁麵,SecondActivity extends MiPushSystemNotificationActivity;
- 普通通知回調配置:
public class MyMessageReceiver extends MessageReceiver {
/**
* 推送通知的回調方法
* @param context
* @param title
* @param summary
* @param extraMap
*/
@Override
public void onNotification(Context context, String title, String summary, Map<String, String> extraMap) {
Log.d(TAG, "Receive notification, title: " + title + ", content: " + summary + ", extraMap: " + extraMap);
}
}
- MainActivity定義:
package com.alibaba.push.testdemo;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.d(TAG, "Main");
}
}
- SecondActivity定義:
package com.alibaba.push.testdemo;
import com.alibaba.sdk.android.push.MiPushSystemNotificationActivity;
public class SecondActivity extends MiPushSystemNotificationActivity {
/**
* 小米輔助彈窗指定打開Activity回調
* @param title 標題
* @param content 內容
* @param extraMap 額外參數
*/
@Override
protected void onMiPushSysNoticeOpened(String title, String content, Map<String, String> extraMap) {
Log.d(TAG, "Receive XiaoMi notification, title: " + title + ", content: " + content + ", extraMap: " + extraMap);
}
}
場景1:普通推送打開App + 小米輔助彈窗
服務端配置如下:
PushRequest pushRequest = new PushRequest();
// 其餘設置省略
// ...
// 0:表示消息(默認為0), 1:表示通知
pushRequest.setType(1);
// 標題
pushRequest.setTitle("hello");
// 內容
pushRequest.setBody("PushRequest body");
// 點擊通知後動作,1:打開應用 2: 打開應用Activity 3:打開 url
pushRequest.setAndroidOpenType("1");
// 設置小米輔助彈窗打開Activity
pushRequest.setXiaomiActivity("com.alibaba.push.testdemo.SecondActivity");
// 設定android類型設備通知的擴展屬性
pushRequest.setAndroidExtParameters("{"k1":"android","k2":"v2"}");;
推送結果:
非小米設備和在線小米設備
- 收到普通推送通道彈出的通知,點擊後打開App,進入首頁
MainActivity
,如果設備在前台,保持當前界麵不變; - onNotification()回調輸出
Receive notification, title: hello, content: PushRequest body, extraMap: {k1=android, k2=v2}
;
- 收到普通推送通道彈出的通知,點擊後打開App,進入首頁
清理進程後的小米設備
- 小米輔助彈窗通道彈出通知,點擊後跳轉到
SecondActivity
; - onMiPushSysNoticeOpened()回調輸出
Receive XiaoMi notification, title: hello, content: PushRequest body, extraMap: {k1=android, k2=v2}
;
- 小米輔助彈窗通道彈出通知,點擊後跳轉到
場景2:普通推送打開Activity + 小米輔助彈窗
服務端配置如下:
PushRequest pushRequest = new PushRequest();
// 其餘設置省略
// ...
// 0:表示消息(默認為0), 1:表示通知
pushRequest.setType(1);
// 標題
pushRequest.setTitle("hello");
// 內容
pushRequest.setBody("PushRequest body");
// 點擊通知後動作,1:打開應用 2: 打開應用Activity 3:打開 url
pushRequest.setAndroidOpenType("2");
// 指定普通推送要打開的Activity
pushRequest.setAndroidActivity("com.alibaba.push.testdemo.SecondActivity");
// 設置小米輔助彈窗打開Activity
pushRequest.setXiaomiActivity("com.alibaba.push.testdemo.SecondActivity");
// 設定android類型設備通知的擴展屬性
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
上一篇:
SDK API介紹__Android SDK手冊_App SDK 手冊_移動推送-阿裏雲
下一篇:
iOS推送證書設置__iOS SDK手冊_App SDK 手冊_移動推送-阿裏雲
作業日期設置__作業_用戶指南_E-MapReduce-阿裏雲
EDAS 商業化服務條款__服務條款和價格說明_企業級分布式應用服務 EDAS-阿裏雲
刪除媒體__媒體接口_API使用手冊_視頻點播-阿裏雲
CC防護規則-正常與緊急__功能說明_Web 應用防火牆-阿裏雲
LogSearch-報警__Getting-Started_日誌服務-阿裏雲
任務監控報警配置__SchedulerX for EDAS_二方服務_企業級分布式應用服務 EDAS-阿裏雲
查詢快照__快照相關接口_API 參考_雲服務器 ECS-阿裏雲
廣播拉取消息模型__最佳實踐_消息服務-阿裏雲
CreateConfig__Logtail配置相關接口_API-Reference_日誌服務-阿裏雲
雲服務器 ECS 重啟
相關內容
常見錯誤說明__附錄_大數據計算服務-阿裏雲
發送短信接口__API使用手冊_短信服務-阿裏雲
接口文檔__Android_安全組件教程_移動安全-阿裏雲
運營商錯誤碼(聯通)__常見問題_短信服務-阿裏雲
設置短信模板__使用手冊_短信服務-阿裏雲
OSS 權限問題及排查__常見錯誤及排除_最佳實踐_對象存儲 OSS-阿裏雲
消息通知__操作指南_批量計算-阿裏雲
設備端快速接入(MQTT)__快速開始_阿裏雲物聯網套件-阿裏雲
查詢API調用流量數據__API管理相關接口_API_API 網關-阿裏雲
使用STS訪問__JavaScript-SDK_SDK 參考_對象存儲 OSS-阿裏雲