消息推送是App運(yùn)營(yíng)的重要一環(huán),為了優(yōu)化消息推送成功率桩警,降低電量和流量消耗可训,系統(tǒng)級(jí)的推送服務(wù)顯得尤為重要。小米和魅族由此推出了自家的推送平臺(tái)捶枢,在MIUI和Flyme上共享系統(tǒng)級(jí)推送服務(wù)握截,讓APP在被殺死的情況下也能正常收到推送消息。以后也會(huì)有越來(lái)越多的手機(jī)廠(chǎng)商會(huì)推出自己的推送平臺(tái)烂叔,MixPush由此而生谨胞,降低開(kāi)發(fā)者集成多家推送的開(kāi)發(fā)成本,提高推送的到達(dá)率蒜鸡。
項(xiàng)目開(kāi)源Github
https://github.com/joyrun/MixPush
推薦推送平臺(tái)
小米推送
支持所有的Android平臺(tái)胯努,特點(diǎn)是在MIUI系統(tǒng)上共享系統(tǒng)級(jí)推送牢裳,APP被殺死也可以收到通知欄推送。
https://dev.mi.com/console/appservice/push.html
魅族推送
僅僅支持Flyme系統(tǒng)叶沛,不能在非Flyme系統(tǒng)上使用蒲讯,特點(diǎn)是在Flyme系統(tǒng)共享系統(tǒng)級(jí)推送,APP被殺死也可以收到通知欄推送灰署。
https://open.flyme.cn/open-web/views/push.html
個(gè)推推送
Android平臺(tái)上最大的第三方推送平臺(tái)判帮,推送消息穩(wěn)定。
http://www.getui.com/cn/index.html
原理圖
原理分析
MixPush只是一個(gè)降低集成多家推送服務(wù)的框架溉箕,自身不擁有推送功能晦墙,所有的推送功能都是依靠各個(gè)推送平臺(tái)來(lái)實(shí)現(xiàn)。從原理圖可以看到肴茄,客戶(hù)端APP會(huì)根據(jù)不同的手機(jī)注冊(cè)不同的推送平臺(tái)晌畅,不能同時(shí)注冊(cè)兩個(gè)推送服務(wù),避免重復(fù)收到推送独郎。而服務(wù)端不用考慮需要推送消息的用戶(hù)手機(jī)屬于何種平臺(tái)踩麦,一律向各個(gè)平臺(tái)發(fā)起推送枚赡,而客戶(hù)端會(huì)根據(jù)注冊(cè)的平臺(tái)只會(huì)收到單一平臺(tái)的推送消息氓癌。
Android客戶(hù)端配置
添加倉(cāng)庫(kù)地址,修改根目錄的build.gradle文件:
allprojects {
repositories {
...
maven {url "http://mvn.gt.igexin.com/nexus/content/repositories/releases/"}
maven { url 'https://jitpack.io' }
}
}
選擇推送平臺(tái)贫橙,如果沒(méi)有可以參考源碼自行實(shí)現(xiàn)贪婉,添加依賴(lài):
dependencies {
compile 'com.github.joyrun.MixPush:client-core:1.0.0' //必填
compile 'com.github.joyrun.MixPush:client-mipush:1.0.0' // 小米推送
compile 'com.github.joyrun.MixPush:client-getui:1.0.0' // 個(gè)推
compile 'com.github.joyrun.MixPush:client-meizu:1.0.0' // 魅族推送,魅族推送只支持Flyme系統(tǒng)卢肃,務(wù)必需要注意
}
創(chuàng)建一個(gè)繼承MixPushIntentService的服務(wù)類(lèi)疲迂,用于接收事件:
public class PushIntentService extends MixPushIntentService {
@Override
public void onReceivePassThroughMessage(MixPushMessage message) {
Log.e(TAG, "收到透?jìng)飨?-> " + message.getContent());
}
@Override
public void onNotificationMessageClicked(MixPushMessage message) {
Log.e(TAG, "通知欄消息點(diǎn)擊 -> " + message.getContent());
}
}
配置AndroidManifest.xml,注冊(cè)服務(wù)類(lèi)
<manifest>
<application ...>
...
<service android:name=".PushIntentService"/>
</application>
</manifest>
在A(yíng)pplication類(lèi)進(jìn)行初始化莫湘,如果沒(méi)有請(qǐng)自行創(chuàng)建:
public class DemoApplication extends Application {
public static final String MEIZU_APP_ID = "<MEIZU_APP_ID>";
public static final String MEIZU_APP_KEY = "<MEIZU_APP_KEY>";
public static final String MIPUSH_APP_ID = "<MIPUSH_APP_ID>";
public static final String MIPUSH_APP_KEY = "<MIPUSH_APP_KEY>";
@Override
public void onCreate() {
super.onCreate();
initPush();
}
private void initPush() {
MixPushClient.addPushManager(new MeizuPushManager(MEIZU_APP_KEY, MEIZU_APP_ID));
MixPushClient.addPushManager(new MiPushManager(MIPUSH_APP_ID, MIPUSH_APP_KEY));
MixPushClient.addPushManager(new GeTuiManager());
MixPushClient.setPushIntentService(PushIntentService.class);
MixPushClient.setSelector(new MixPushClient.Selector() {
@Override
public String select(Map<String, MixPushManager> pushAdapterMap, String brand) {
// return GeTuiManager.NAME;
//底層已經(jīng)做了小米推送尤蒿、魅族推送、個(gè)推判斷幅垮,也可以按照自己的需求來(lái)選擇推送
return super.select(pushAdapterMap, brand);
}
});
// 配置接收推送消息的服務(wù)類(lèi)
MixPushClient.setPushIntentService(PushIntentService.class);
// 注冊(cè)推送
MixPushClient.registerPush(this);
// 綁定別名腰池,一般是填寫(xiě)用戶(hù)的ID,便于定向推送
MixPushClient.setAlias(this, getUserId());
// 設(shè)置標(biāo)簽忙芒,用于對(duì)用戶(hù)進(jìn)行劃分
MixPushClient.setTags(this,"廣東");
}
private String getUserId(){
return "103";
}
}
修改APP的build.gradle文件示弓,配置個(gè)推的APP ID等信息
android {
defaultConfig {
...
manifestPlaceholders = [
GETUI_APP_ID : "<GETUI_APP_ID>",
GETUI_APP_KEY : "<GETUI_APP_KEY>",
GETUI_APP_SECRET : "<GETUI_APP_SECRET>",
PACKAGE_NAME: "<APP的包名>"
]
}
}
定制通知欄通知的圖標(biāo)
小米推送
目前通知類(lèi)的消息, 通知的圖標(biāo)展示規(guī)則如下:
- 如果app中同時(shí)存在名為mipush_notification和mipush_small_notification的drawable文件呵萨,則使用mipush_notification的drawable作為通知的大圖標(biāo)奏属,mipush_small_notification的drawable作為通知的小圖標(biāo)。
- 如果app中只存在其中一個(gè)drawable文件潮峦,則使用該drawable作為通知的圖標(biāo)囱皿。
- 如果app中不存在這兩個(gè)drawable文件勇婴,則使用app的icon作為通知的圖標(biāo)。在MIUI中嘱腥,通知欄圖標(biāo)統(tǒng)一顯示為app的icon咆耿,不可以定制。
個(gè)推推送
為了修改默認(rèn)的通知欄頂部提示小圖標(biāo)爹橱,請(qǐng)?jiān)谫Y源目錄的res/drawable-ldpi/萨螺、res/drawable-mdpi/、res/drawable-hdpi/愧驱、res/drawable-xhdpi/慰技、res/drawable-xxhdpi/等各分辨率目錄下,放置相應(yīng)尺寸的文件名為push.png
圖片组砚。
ldpi: 48*48
mdpi: 64*64
hdpi: 96*96
xhdpi: 128*128
xxhdpi: 192*192
魅族推送
和小米推送的一樣吻商。
注意
- 魅族推送只支持Flyme系統(tǒng),務(wù)必需要注意糟红。
服務(wù)端配置測(cè)試
目前只有Java的服務(wù)端代碼艾帐,如果服務(wù)端使用其它語(yǔ)言,請(qǐng)參考設(shè)計(jì)思路自己開(kāi)發(fā)盆偿。
復(fù)制代碼和jar包到項(xiàng)目柒爸。
服務(wù)端推送測(cè)試
public class MixPushServerTest {
public static final String APP_PACKAGE_NAME = "<APP的包名>";
public static final String MIPUSH_APP_SECRET_KEY = "<MIPUSH_APP_SECRET_KEY>";
public static final Long MEIZU_APP_ID = <MEIZU_APP_ID>;
public static final String MEIZU_APP_SECRET_KEY = "<MEIZU_APP_SECRET_KEY>";
public static final String GETUI_APP_ID = "<GETUI_APP_ID>";
public static final String GETUI_APP_KEY = "<GETUI_APP_KEY>";
public static final String GETUI_MASTER_SECRET = "<GETUI_MASTER_SECRET>";
public static final String GETUI_URL = "http://sdk.open.api.igexin.com/apiex.htm";
static {
MixPushServer.addPushServerManager(new MiPushServerManager(APP_PACKAGE_NAME, MIPUSH_APP_SECRET_KEY));
MixPushServer.addPushServerManager(new MeizuPushServerManager(MEIZU_APP_ID, MEIZU_APP_SECRET_KEY));
MixPushServer.addPushServerManager(new GeTuiPushServerManager(GETUI_APP_ID, GETUI_APP_KEY, GETUI_MASTER_SECRET, GETUI_URL));
}
String title = "title";
String description = "description";
String json = "{\"name\":\"Wiki\",\"age\":24}";
@Test
public void sendNotifyToAll() throws Exception {
MixPushServer.sendNotifyToAll(title, description, json);
}
@Test
public void sendMessageToAll() throws Exception {
MixPushServer.sendMessageToAll(json);
}
@Test
public void sendMessageToAlias() throws Exception {
MixPushServer.sendMessageToAlias("100", json);
}
@Test
public void sendMessageToTags() throws Exception {
MixPushServer.sendMessageToTags("廣東", json);
}
@Test
public void sendNotifyToAlias() throws Exception {
MixPushServer.sendNotifyToAlias("100", title, description, json);
}
@Test
public void sendNotifyToTags() throws Exception {
MixPushServer.sendNotifyToTags("廣東", title, description, json);
}
}
如果你不是使用以上三個(gè)推送,也可以根據(jù)接口自己來(lái)實(shí)現(xiàn)事扭。