友盟推送集成小米華爲魅族系統通道

前言

大家做過安卓推送服務的都知道,如果安卓設備想要收到推送,就要與服務器建立一個長連接通道(莫非你想輪詢??)。一旦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更加清晰,歡迎參考。

下載PushDemo

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章