鑑於項目apk瘦身的需求,通過調研,發現現有的推送集成方案能夠優化。現有的推送方案是華爲 + 小米 + 友盟推送,分別針對的是華爲(包括榮耀)手機、小米手機、其餘類型手機。這樣作的好處是,華爲、小米系列的手機均可以支持離線消息,推送消息送達率有保證。缺點是推送的SDK的包比較大,會浪費用戶流量。java
鑑於項目中已經集成了友盟統計相關sdk,這裏決定對友盟的集成推送方案進行調研,若是能夠知足現有需求,則徹底能夠替換現有推送方案。android
參考文檔:U-push集成文檔api
集成步驟主要包括普通集成和通道集成。bash
一、普通集成。app
這裏說的普通集成,是指在華爲、小米手機上不支持離線消息的狀況。集成完這個步驟以後,在小米、華爲手機上是收不到推送消息的。這個跟咱們的需求不符,須要進一步優化,具體請看第2步。異步
//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'
複製代碼
UMConfigure.init(context, UMConfigure.DEVICE_TYPE_PHONE, umengMessageSecret);
複製代碼
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);
複製代碼
二、小米、華爲Push通道集成。ide
華爲、小米對後臺進程作了諸多限制。若使用一鍵清理,應用的channel進程被清除,將接收不到推送。爲了增長推送的送達率,可選擇接入華爲、小米託管彈窗功能,通知將由華爲系統託管彈出。gradle
主要步驟以下:優化
//華爲Push通道
implementation 'com.umeng.sdk:push-huawei:1.0.0'
//小米Push通道
implementation 'com.umeng.sdk:push-xiaomi:1.0.0'
複製代碼
在Application類的onCreate方法中添加:ui
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",
}
}
複製代碼
最後對友盟統計集成方案作下總結: 一、在集成U-push的基礎上,還須要集成華爲、小米Push通道。它們暫時均不支持多包名。
二、華爲手機須要注意的問題: ①若使用華爲Push通道,則app的targetSdkVersion必須設置爲25或25如下,設置爲26及以上,會致使EMUI 8.0設備沒法彈出通知。 ②對於EMUI 4.1及如下版本系統,若要使用華爲彈窗功能,則需在華爲設備上的【手機管家】App中,開啓應用的「自啓動權限」。
三、小米手機須要注意的問題: ①若要使用小米系統通道下發通知,則通知的標題(title)不容許全是空白字符且長度小於50,通知的內容(text)不容許全是空白字符且長度小於128(通知的標題和內容必填,一箇中英文字符均計算爲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'
複製代碼