Android集成友盟集成推送方案調(diào)研
鑒于項(xiàng)目apk瘦身的需求,經(jīng)過(guò)調(diào)研奕枝,發(fā)現(xiàn)現(xiàn)有的推送集成方案可以?xún)?yōu)化∑友兀現(xiàn)有的推送方案是華為 + 小米 + 友盟推送,分別針對(duì)的是華為(包括榮耀)手機(jī)授艰、小米手機(jī)辨嗽、其他類(lèi)型手機(jī)。這樣做的好處是淮腾,華為糟需、小米系列的手機(jī)都可以支持離線消息,推送消息送達(dá)率有保證谷朝。缺點(diǎn)是推送的SDK的包比較大洲押,會(huì)浪費(fèi)用戶(hù)流量。
鑒于項(xiàng)目中已經(jīng)集成了友盟統(tǒng)計(jì)相關(guān)sdk圆凰,這里決定對(duì)友盟的集成推送方案進(jìn)行調(diào)研杈帐,如果可以滿(mǎn)足現(xiàn)有需求,則完全可以替換現(xiàn)有推送方案专钉。
U-push方案集成步驟
參考文檔:U-push集成文檔
集成步驟主要包括普通集成和通道集成挑童。
1、普通集成驶沼。
這里說(shuō)的普通集成炮沐,是指在華為、小米手機(jī)上不支持離線消息的情況回怜。集成完這個(gè)步驟之后大年,在小米、華為手機(jī)上是收不到推送消息的玉雾。這個(gè)跟我們的需求不符翔试,需要進(jìn)一步優(yōu)化,具體請(qǐng)看第2步复旬。
- 友盟官網(wǎng)上獲取AppKey和Umeng Message Secret垦缅,配置進(jìn)AndroidManifest.xml
- 導(dǎo)入PushSDK
//PushSDK必須依賴(lài)基礎(chǔ)組件庫(kù),所以需要加入對(duì)應(yīng)依賴(lài)
implementation 'com.umeng.sdk:common:1.5.3'
//PushSDK必須依賴(lài)utdid庫(kù)驹碍,所以需要加入對(duì)應(yīng)依賴(lài)
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);
- 注冊(cè)推送服務(wù)壁涎,注冊(cè)成功之后可以獲取到token。
PushAgent mPushAgent = PushAgent.getInstance(this);
//注冊(cè)推送服務(wù)志秃,每次調(diào)用register方法都會(huì)回調(diào)該接口
mPushAgent.register(new IUmengRegisterCallback() {
@Override
public void onSuccess(String deviceToken) {
//注冊(cè)成功會(huì)返回device token
}
@Override
public void onFailure(String s, String s1) {
}
});
- 自定義通知打開(kāi)動(dòng)作怔球。這個(gè)動(dòng)作在通知欄消息被點(diǎn)擊時(shí)觸發(fā)。
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通道集成。
華為担汤、小米對(duì)后臺(tái)進(jìn)程做了諸多限制涎跨。若使用一鍵清理,應(yīng)用的channel進(jìn)程被清除崭歧,將接收不到推送隅很。為了增加推送的送達(dá)率,可選擇接入華為驾荣、小米托管彈窗功能外构,通知將由華為系統(tǒng)托管彈出。
主要步驟如下:
- 登錄華為播掷、小米開(kāi)發(fā)平臺(tái)审编,創(chuàng)建對(duì)應(yīng)的應(yīng)用,啟用推送服務(wù)歧匈,獲取相應(yīng)的應(yīng)用信息垒酬。
- 導(dǎo)入華為、小米Push通道SDK
//華為Push通道
implementation 'com.umeng.sdk:push-huawei:1.0.0'
//小米Push通道
implementation 'com.umeng.sdk:push-xiaomi:1.0.0'
- 華為件炉、小米Push初始化
在Application類(lèi)的onCreate方法中添加:
HuaWeiRegister.register(final Context context);
MiPushRegistar.register(final Context context, final String XIAOMI_ID, final String XIAOMI_KEY);
注意:
華為Push通道:
①僅在華為EMUI設(shè)備上生效勘究。
②集成華為Push的版本暫不支持多包名。
③若使用華為Push通道斟冕,則app的targetSdkVersion必須設(shè)置為25或25以下口糕,設(shè)置為26及以上,會(huì)導(dǎo)致EMUI 8.0設(shè)備無(wú)法彈出通知磕蛇。
小米Push通道:
①僅在小米MIUI設(shè)備上生效景描。
②集成小米push的版本暫不支持多包名。
- 使用華為秀撇、小米彈窗功能超棺。
通知將由華為、小米系統(tǒng)托管彈出呵燕,點(diǎn)擊通知欄將跳轉(zhuǎn)到指定的Activity棠绘。該Activity需繼承自UmengNotifyClickActivity,同時(shí)實(shí)現(xiàn)父類(lèi)的onMessage方法再扭,對(duì)該方法的intent參數(shù)進(jìn)一步解析即可氧苍,該方法異步調(diào)用,不阻塞主線程泛范。示例如下:
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); //此方法必須調(diào)用候引,否則無(wú)法統(tǒng)計(jì)打開(kāi)數(shù)
String body = intent.getStringExtra(AgooConstants.MESSAGE_BODY);
Log.i(TAG, body);
}
}
別忘了注冊(cè)該Activity:
<activity
android:name="com.umeng.message.example.MipushTestActivity"
android:launchMode="singleTask"
android:exported="true" />
在【友盟+】推送后臺(tái)發(fā)送通知時(shí),勾選若設(shè)備離線轉(zhuǎn)為系統(tǒng)通道下發(fā)敦跌,并填寫(xiě)Activity的完整包路徑(該Activity需繼承自UmengNotifyClickActivity)。
[圖片上傳失敗...(image-336591-1563100816012)]
注意:
華為:
對(duì)于EMUI 4.1及以下版本系統(tǒng),若要使用華為彈窗功能柠傍,則需在華為設(shè)備上的【手機(jī)管家】App中麸俘,開(kāi)啟應(yīng)用的“自啟動(dòng)權(quán)限”。
使用華為彈窗下發(fā)的通知惧笛,將只能被統(tǒng)計(jì)到通知的【打開(kāi)數(shù)】从媚,而該條通知的【收到數(shù)】、【忽略數(shù)】將無(wú)法被統(tǒng)計(jì)到患整。
小米:
使用小米系統(tǒng)通道下發(fā)的消息拜效,將只能被統(tǒng)計(jì)到消息的【打開(kāi)數(shù)】,而該條消息的【收到數(shù)】各谚、【忽略數(shù)】將無(wú)法被統(tǒng)計(jì)到紧憾。
若要使用小米系統(tǒng)通道下發(fā)通知,則通知的標(biāo)題(title)不允許全是空白字符且長(zhǎng)度小于50昌渤,通知的內(nèi)容(text)不允許全是空白字符且長(zhǎng)度小于128(通知的標(biāo)題和內(nèi)容必填赴穗,一個(gè)中英文字符均計(jì)算為1)。
在調(diào)用API接口實(shí)現(xiàn)推送消息時(shí)膀息,如果需要使用華為般眉、小米彈窗,需添加:
"mipush":true
"mi_activity":"com.umeng.message.example.MipushTestActivity" //此處請(qǐng)?zhí)顚?xiě)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",
}
}
最后對(duì)友盟統(tǒng)計(jì)集成方案做下總結(jié):
1潜支、在集成U-push的基礎(chǔ)上甸赃,還需要集成華為、小米Push通道冗酿。它們暫時(shí)均不支持多包名埠对。
2、華為手機(jī)需要注意的問(wèn)題:
①若使用華為Push通道已烤,則app的targetSdkVersion必須設(shè)置為25或25以下鸠窗,設(shè)置為26及以上,會(huì)導(dǎo)致EMUI 8.0設(shè)備無(wú)法彈出通知胯究。
②對(duì)于EMUI 4.1及以下版本系統(tǒng)稍计,若要使用華為彈窗功能,則需在華為設(shè)備上的【手機(jī)管家】App中裕循,開(kāi)啟應(yīng)用的“自啟動(dòng)權(quán)限”臣嚣。
3、小米手機(jī)需要注意的問(wèn)題:
①若要使用小米系統(tǒng)通道下發(fā)通知剥哑,則通知的標(biāo)題(title)不允許全是空白字符且長(zhǎng)度小于50硅则,通知的內(nèi)容(text)不允許全是空白字符且長(zhǎng)度小于128(通知的標(biāo)題和內(nèi)容必填,一個(gè)中英文字符均計(jì)算為1)株婴。
4怎虫、華為暑认、小米通道的統(tǒng)計(jì)問(wèn)題:
使用華為彈窗下發(fā)的通知,將只能被統(tǒng)計(jì)到通知的【打開(kāi)數(shù)】大审,而該條通知的【收到數(shù)】蘸际、【忽略數(shù)】將無(wú)法被統(tǒng)計(jì)到取刃。
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依賴(lài)。
//PushSDK必須依賴(lài)基礎(chǔ)組件庫(kù)醇蝴,所以需要加入對(duì)應(yīng)依賴(lài)
implementation 'com.umeng.sdk:common:1.5.3'
//PushSDK必須依賴(lài)utdid庫(kù)姜骡,所以需要加入對(duì)應(yīng)依賴(lài)
// implementation 'com.umeng.sdk:utdid:1.1.5.3'
//PushSDK
implementation 'com.umeng.sdk:push:4.2.0'