1. 程式人生 > >Android整合友盟整合推送方案調研

Android整合友盟整合推送方案調研

Android整合友盟整合推送方案調研

鑑於專案apk瘦身的需求,經過調研,發現現有的推送整合方案可以優化。現有的推送方案是華為 + 小米 + 友盟推送,分別針對的是華為(包括榮耀)手機、小米手機、其他型別手機。這樣做的好處是,華為、小米系列的手機都可以支援離線訊息,推送訊息送達率有保證。缺點是推送的SDK的包比較大,會浪費使用者流量。

鑑於專案中已經集成了友盟統計相關sdk,這裡決定對友盟的整合推送方案進行調研,如果可以滿足現有需求,則完全可以替換現有推送方案。

U-push方案整合步驟

參考文件:U-push整合文件

整合步驟主要包括普通整合和通道整合。
1、普通整合。


這裡說的普通整合,是指在華為、小米手機上不支援離線訊息的情況。整合完這個步驟之後,在小米、華為手機上是收不到推送訊息的。這個跟我們的需求不符,需要進一步優化,具體請看第2步。

  • 友盟官網上獲取AppKey和Umeng Message Secret,配置進AndroidManifest.xml
  • 匯入PushSDK
//PushSDK必須依賴基礎元件庫,所以需要加入對應依賴
implementation 'com.umeng.sdk:common:1.5.3'
//PushSDK必須依賴utdid庫,所以需要加入對應依賴
implementation 'com.umeng.sdk:utdid:1.1.5.3'
//PushSDK
implementation 'com.umeng.sdk:push:4.2.0'
  • 初始化PushSDK
UMConfigure.init(context, UMConfigure.DEVICE_TYPE_PHONE, umengMessageSecret);
  • 註冊推送服務,註冊成功之後可以獲取到token。
PushAgent mPushAgent = PushAgent.getInstance(this);
//註冊推送服務,每次呼叫register方法都會回撥該介面
mPushAgent.register(new IUmengRegisterCallback() {

    @Override
    public void onSuccess(String deviceToken) {
        //註冊成功會返回device token
    }

    @Override
    public void onFailure(String s, String s1) {

    }
});
  • 自定義通知開啟動作。這個動作在通知欄訊息被點選時觸發。
UmengNotificationClickHandler notificationClickHandler = new UmengNotificationClickHandler() {

    @Override
    public void dealWithCustomAction(Context context, UMessage msg) {
        Toast.makeText(context, msg.custom, Toast.LENGTH_LONG).show();
    }
};
mPushAgent.setNotificationClickHandler(notificationClickHandler);
  • 混淆配置。

2、小米、華為Push通道整合。
華為、小米對後臺程序做了諸多限制。若使用一鍵清理,應用的channel程序被清除,將接收不到推送。為了增加推送的送達率,可選擇接入華為、小米託管彈窗功能,通知將由華為系統託管彈出。

主要步驟如下:

  • 登入華為、小米開發平臺,建立對應的應用,啟用推送服務,獲取相應的應用資訊。
  • 匯入華為、小米Push通道SDK
//華為Push通道
implementation 'com.umeng.sdk:push-huawei:1.0.0'
//小米Push通道
implementation 'com.umeng.sdk:push-xiaomi:1.0.0'
  • 華為、小米Push初始化
    在Application類的onCreate方法中新增:
HuaWeiRegister.register(final Context context);
MiPushRegistar.register(final Context context, final String XIAOMI_ID, final String XIAOMI_KEY);

注意:
華為Push通道:
①僅在華為EMUI裝置上生效。
②整合華為Push的版本暫不支援多包名。
③若使用華為Push通道,則app的targetSdkVersion必須設定為25或25以下,設定為26及以上,會導致EMUI 8.0裝置無法彈出通知。

小米Push通道:
①僅在小米MIUI裝置上生效。
②整合小米push的版本暫不支援多包名。

  • 使用華為、小米彈窗功能。
    通知將由華為、小米系統託管彈出,點選通知欄將跳轉到指定的Activity。該Activity需繼承自UmengNotifyClickActivity,同時實現父類的onMessage方法,對該方法的intent引數進一步解析即可,該方法非同步呼叫,不阻塞主執行緒。示例如下:
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);
    }
}

別忘了註冊該Activity:

<activity
      android:name="com.umeng.message.example.MipushTestActivity"
      android:launchMode="singleTask"
      android:exported="true" />

在【友盟+】推送後臺傳送通知時,勾選若裝置離線轉為系統通道下發,並填寫Activity的完整包路徑(該Activity需繼承自UmengNotifyClickActivity)。

注意:
華為:
對於EMUI 4.1及以下版本系統,若要使用華為彈窗功能,則需在華為裝置上的【手機管家】App中,開啟應用的“自啟動許可權”。
使用華為彈窗下發的通知,將只能被統計到通知的【開啟數】,而該條通知的【收到數】、【忽略數】將無法被統計到。

小米:
使用小米系統通道下發的訊息,將只能被統計到訊息的【開啟數】,而該條訊息的【收到數】、【忽略數】將無法被統計到。
若要使用小米系統通道下發通知,則通知的標題(title)不允許全是空白字元且長度小於50,通知的內容(text)不允許全是空白字元且長度小於128(通知的標題和內容必填,一箇中英文字元均計算為1)。

在呼叫API介面實現推送訊息時,如果需要使用華為、小米彈窗,需新增:

"mipush":true
"mi_activity":"com.umeng.message.example.MipushTestActivity"        //此處請填寫Activity完整包路徑

API介面新增位置參考:

{
"appkey": "", 
"mi_activity": "com.umeng.message.example.MipushTestActivity"
"mipush": true,
"timestamp": 1473225266373,
"production_mode": "true",
"type": "unicast", 
"device_tokens": "", 
"payload":
    {"body": 
       {"text": "from pa36a", 
        "after_open": "go_app", 
        "ticker": "Hello World", 
        "title": "listcastpa43"
       }, 
     "display_type": "notification", 
    }
}

最後對友盟統計整合方案做下總結:
1、在整合U-push的基礎上,還需要整合華為、小米Push通道。它們暫時均不支援多包名。

2、華為手機需要注意的問題:
①若使用華為Push通道,則app的targetSdkVersion必須設定為25或25以下,設定為26及以上,會導致EMUI 8.0裝置無法彈出通知。
②對於EMUI 4.1及以下版本系統,若要使用華為彈窗功能,則需在華為裝置上的【手機管家】App中,開啟應用的“自啟動許可權”。

3、小米手機需要注意的問題:
①若要使用小米系統通道下發通知,則通知的標題(title)不允許全是空白字元且長度小於50,通知的內容(text)不允許全是空白字元且長度小於128(通知的標題和內容必填,一箇中英文字元均計算為1)。

4、華為、小米通道的統計問題:
使用華為彈窗下發的通知,將只能被統計到通知的【開啟數】,而該條通知的【收到數】、【忽略數】將無法被統計到。

bug解決:

1、utdid衝突:

Warning: Exception while processing task java.io.IOException: Can't write [/Users/xxx/ABC/app/build/intermediates/transforms/proguard/api_15_/release/0.jar] (Can't read [/Users/xxx/.gradle/caches/modules-2/files-2.1/com.umeng.sdk/utdid/1.1.5.3/989c3bb13060da1e3154bfe00236f76453a2725f/utdid-1.1.5.3.jar(;;;;;;**.class)] (Duplicate zip entry [utdid-1.1.5.3.jar:com/ta/utdid2/device/UTDevice.class]))

解決方式:註釋掉這裡的utdid依賴。

    //PushSDK必須依賴基礎元件庫,所以需要加入對應依賴
    implementation 'com.umeng.sdk:common:1.5.3'
    //PushSDK必須依賴utdid庫,所以需要加入對應依賴
//    implementation 'com.umeng.sdk:utdid:1.1.5.3'
    //PushSDK
    implementation 'com.umeng.sdk:push:4.2.0'

參考

https://developer.umeng.com/docs/66632/detail/66744