友盟推送整合小米華為魅族系統通道
前言
大家做過安卓推送服務的都知道,如果安卓裝置想要收到推送,就要與伺服器建立一個長連線通道(莫非你想輪詢??)。一旦app被殺掉,維持長連線通道的pushservice服務也會被幹掉,所以裝置就處於離線狀態,也就收不到任何推送。
說到安卓,不得不提蘋果,為什麼蘋果推送沒有這個煩惱呢?原因是蘋果推送走的是系統推送,由系統去維持長連線通道,所以app殺掉也能收到推送。由於國內能買到的手機都沒安裝谷歌服務框架,所以造成了如今國內手機無論使用哪種第三方平臺推送服務,都無法實現百分百的安卓裝置離線(殺掉app)收到推送。
既然國內手機沒有使用谷歌原生系統,那我們可以通過國內手機廠商定製系統提供的推送服務,來實現跟蘋果一樣的系統級別推送。蛋疼的是,國內那麼多定製系統,我們要一個一個的做接入。到目前為止,小米、華為和魅族提供了推送服務,而vivo和oppo還沒有看到,特別是接入了小米和華為後,我們已經能把推送到達率提高很多很多了。
我們專案組使用了友盟推送,為了提高安卓裝置送達率,我們打算接入系統推送通道。我跟著官方文件,參考官方Demo,一步一步做整合。在此過程中發現一些容易踩的坑,希望這篇文章能幫助到你們,快速接入系統推送通道。另外,官方Demo把推送、分享、統計等等功能都集於一身,但缺少了系統推送通道整合的必要程式碼,所以本文最後有完整的PushDemo專案程式碼供大家參考。
整合流程
建議先過一遍官方文件,本教程只對關鍵要點和注意事項進行說明。請先實現正常的友盟推送流程,本教程是基於正常推送流程之上做整合。建議友盟推送SDK使用最新版本,提高推送穩定性的同時也解決各種水土不服。
本教程的APP包名為com.soecode.lyf.pushdemo
配置引數
先到對應平臺註冊帳號,提交資料認證個人開發者。我上次三家同時申請,華為和魅族最快只要一天,小米花了三天時間。
建立應用,包名一定要填寫正確,如果遇到包名被佔用,請根據提示找回應用。
獲取三大平臺引數,配到友盟後臺,這裡沒有什麼難度。
注意:魅族開放平臺包含了flyme推送平臺和整合推送平臺,前者才是我們想要的,不要搞混了,這是第一個坑。
新增依賴,匯入SDK
//小米Push通道
compile 'com.umeng.sdk:push-xiaomi:1.0.0'
//華為Push通道
compile 'com.umeng.sdk:push-huawei:1.0.0'
//魅族Push通道
compile 'com.umeng.sdk:push-meizu:1.0.0'
客戶端程式碼
在Application
類的onCreate
方法添加註冊程式碼
小米和魅族的引數是剛才申請到的應用引數,華為不需要。
//小米通道
MiPushRegistar.register(this, XIAOMI_ID, XIAOMI_KEY);
//華為通道
HuaWeiRegister.register(this);
//魅族通道
MeizuRegister.register(this, MEIZU_APPID, MEIZU_APPKEY);
建立一個Activity,繼承於UmengNotifyClickActivity
官方文件這裡叫”使用通道彈窗功能”,剛開始看這個小標題沒看懂,它其實就是實現點選通知欄跳轉到指定Activity的效果。如果沒有,點選通知欄會預設啟動app,不能跳到指定頁面。
雖然這裡是叫MipushTestActivity,但三個通道只要建立這一個activity即可。
public class MipushTestActivity extends UmengNotifyClickActivity {
private static String TAG = MipushTestActivity.class.getName();
@Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.activity_mipush); //這裡設定不同的頁面,為了區分是友盟推送進來的,還是通道推送進來的
}
@Override
public void onMessage(Intent intent) {
super.onMessage(intent); //此方法必須呼叫,否則無法統計開啟數
String body = intent.getStringExtra(AgooConstants.MESSAGE_BODY);
Log.i(TAG, body);
}
}
在manifest
中配置該Activity
<activity
android:name=".MipushTestActivity"
android:exported="true"
android:launchMode="singleTask" />
魅族需要多配置一個Receiver,繼承於UmengMeizuPushReceiver
public class MeizuTestReceiver extends UmengMeizuPushReceiver {
}
在manifest
中配置該Receiver
特別提醒:這裡的receiver標籤要包在application標籤裡面,否則魅族通道無法註冊成功,第二個坑。
<!--魅族push應用定義訊息receiver宣告 -->
<receiver android:name=".MeizuTestReceiver">
<intent-filter>
<!-- 接收push訊息 -->
<action android:name="com.meizu.flyme.push.intent.MESSAGE" />
<!-- 接收register訊息 -->
<action android:name="com.meizu.flyme.push.intent.REGISTER.FEEDBACK" />
<!-- 接收unregister訊息-->
<action android:name="com.meizu.flyme.push.intent.UNREGISTER.FEEDBACK" />
<!-- 相容低版本Flyme3推送服務配置 -->
<action android:name="com.meizu.c2dm.intent.REGISTRATION" />
<action android:name="com.meizu.c2dm.intent.RECEIVE" />
<category android:name="${applicationId}"></category>
</intent-filter>
</receiver>
測試驗證
檢查app是否已註冊到系統通道
除錯裝置,看logcat日誌,在搜尋框填入以下命令device token|MiPushBroadcastReceiver|HuaWeiReceiver|MeizuPushReceiver
,勾選Regex
,篩選出關鍵的列印資訊。
如果沒有註冊成功,根據控制檯輸出提示排查,並確保引數是否填對。- 小米註冊成功後會在tag:MiPushBroadcastReceiver下面列印log:onCommandResult is called. regid= xxxxxxxxxxxxxxxxxxxxxxx,接收到小米訊息則會列印log: onReceiveMessage,msg= xxxxxxxxxxxxxxxxxxxxxxx
- 華為註冊成功後會在tag:HuaWeiReceiver下面列印log: 獲取token成功,token= xxxxxxxxxxxxxxxxxxxxxxx,接收到華為訊息則會列印log: HuaWeiReceiver,content= xxxxxxxxxxxxxxxxxxxxxxx
- 魅族註冊成功後會在tag:MeizuPushReceiver下面列印log: onRegister, pushId=xxxxxxxxxxxxxxxxxxxxxxx
檢查裝置是否斷開友盟推送長連線
這個可以在【友盟推送後臺-工具-Device查詢】中查到。在友盟管理後臺發訊息
新建訊息,勾選MIUI、EMUI、Flyme系統裝置離線轉為系統下發,頁面填寫點選通知欄要開啟的activity完整包路徑(此activity必須繼承UmengMeizuPushReceiver),我們這裡填剛才新建的類com.soecode.lyf.pushdemo.MipushTestActivity
。
經測試,如果填一個不存在的activity,訊息依然會下發成功,但點通知欄會預設開啟app啟動頁。
觀察裝置是否收到系統通道推送
有兩種途徑:第一種是看logcat輸出,第二種是點通知欄看跳轉的頁面(如果是系統下發會跳到MipushTestActivity繫結的mipush頁面)。
如果收不到,用regid、token或pushId到對應系統平臺排查問題。
服務端API變化
新增兩個欄位,如果沒用到服務端API請忽略。
"mipush":true
"mi_activity":"com.soecode.lyf.pushdemo.MipushTestActivity"
- mi_activity填寫Activity完整包路徑。
- 雖然這裡叫mipush和mi_activity,但是華為和魅族都只要填這兩個欄位即可。
注意事項
小米
- 通知的標題(title)不允許全是空白字元且長度小於50,通知的內容(text)不允許全是空白字元且長度小於128(通知的標題和內容必填,一箇中英文字元均計算為1)。
華為
- app的targetSdkVersion必須設定為25或25以下,設定為26及以上,會導致EMUI 8.0裝置無法彈出通知。
魅族
- 請在drawable目錄下新增一個圖示,命名為stat_sys_third_app_notify.png,建議尺寸64px * 64px,圖示四周留有透明。若不新增此圖示,可能在部分魅族手機上無法彈出通知。
- 通知標題(title)限制長度1~32個字,推送內容(text)限制長度1~100個字。
整理
友盟論壇上有很多關於推送教程的帖子,但下面這兩篇更值得閱讀
各大平臺推送後臺入口
GitHub
我把完整的推送Demo放到github上,比官方Demo更加清晰,歡迎參考。