1. 程式人生 > >友盟推送整合小米華為魅族系統通道

友盟推送整合小米華為魅族系統通道

前言

大家做過安卓推送服務的都知道,如果安卓裝置想要收到推送,就要與伺服器建立一個長連線通道(莫非你想輪詢??)。一旦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>

測試驗證

  1. 檢查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
  2. 檢查裝置是否斷開友盟推送長連線
    這個可以在【友盟推送後臺-工具-Device查詢】中查到。

  3. 在友盟管理後臺發訊息
    新建訊息,勾選MIUI、EMUI、Flyme系統裝置離線轉為系統下發,頁面填寫點選通知欄要開啟的activity完整包路徑(此activity必須繼承UmengMeizuPushReceiver),我們這裡填剛才新建的類com.soecode.lyf.pushdemo.MipushTestActivity
    經測試,如果填一個不存在的activity,訊息依然會下發成功,但點通知欄會預設開啟app啟動頁。

  4. 觀察裝置是否收到系統通道推送
    有兩種途徑:第一種是看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更加清晰,歡迎參考。