推送一直是拉活使用者的重要運營手段,相比IOS的系統推送通道,Android的推送實在讓開發者頭疼。各大廠商均定製自己的Rom,除了微信這種霸王級別的應用,其他的應用想要保活推送通道可謂是難上加難。那對於推送的實時性要求較高的應用怎麼辦呢?OK,大家想到了以下幾種姿勢: 1.自己做應用的保活,比如提高程式級別、開一個通知欄的Service等 2.找公司的BD與各大廠家合作,將自己的應用包名加入到廠家的白名單中,讓系統來提供保活 3.自己開發一波大的SDK,將市面上常見的裝置廠商的推送SDK進行融合,根據不同的裝置廠商選擇對應的廠商SDK,共享系統的推送通道。 4.待補充ing... 客觀的看待上述幾種姿勢,還是第三個最不容易翻車(當然如果你們家的BD足夠6,可以讓各大廠商給你們做應用保活,就當我在說夢話)。So,這段時間研究了一波,自己擼了一個庫:RePush(沒錯,叫RePush是因為老婆大人的名字有個睿.恩,秀恩愛就是要這麼直接)。
注:悅跑圈團隊開源了一個MixPush,架構挺不錯的,我也借鑑了一波
開始預調研各大廠家的Push
小米
小米裝置佔比還是蠻大的,所以整合他們的SDK毋庸置疑。幸好小米的推送SDK做的是很完善的,整合沒費多少功夫。 小米推送平臺地址 注:個人開發者需要提交身份證等證明檔案做實名認證;企業的需要上傳一部分資質,小米稽核通過之後就可以開心浪了。客觀講小米的推送做的非常良心,功能比較完善,大家可以直接看我的程式碼實現。
華為
趁著我的良心還熱乎,我敢說華為的推送是我見過最坑的,沒有之一。 華為推送平臺
- 不支援別名
- 不支援標籤
- 如果你想群發訊息,只能將客戶端的token上報給服務端,服務端遍歷token挨個推送
- 如果使用者想關閉推送,你也只能將該使用者的token上報給服務端,服務端將該token從表中剔除
- 在meta9等裝置上,在我們的app沒有獲得自啟動許可權的情況下,當app被系統完全乾掉時,收到推送後使用者點選推送並不會觸發HuaweiPushRevicer中的onEvent方法。這就造成開發者無法處理點選後的跳轉事件。我電話諮詢了下華為的開發人員,他們說建議我們使用自定義事件(即Uri)來傳遞資訊。這塊我已經處理好了,詳見程式碼中的PushHandlerActivity。
友盟
所謂的推送N+1策略就是指N個廠家的推送加一個第三方的推送,相信大家的App裡面都有友盟統計吧,順手整合上他們的SDK也不是什麼難事。客觀講友盟的推送坑不是很多。大家看程式碼吧。
RePush的使用
寫在前面:需要大家全域性搜尋"repush_custome",將涉及到的值改成自己在第三方平臺上申請的值。
- import module(repush_master必須)
- 修改app下的build.gradle檔案加入依賴
- 繼承RePushIntentService實現自己的點選邏輯。例如
public class PushHandlerService extends RePushIntentService {
@Override
public void onReceivePassThroughMessage(RePushMessage message) {
Toast.makeText(getApplicationContext(), "客戶端收到了透傳訊息" + message.getContent(), Toast.LENGTH_SHORT).show();
Logger.e("收到透傳訊息 -> " + message.getPlatform());
Logger.e("收到透傳訊息 -> " + message.getContent());
}
@Override
public void onNotificationMessageClicked(RePushMessage message) {
Logger.e("通知欄訊息點選 -> " + message.getPlatform());
Logger.e("通知欄訊息點選 -> " + message.toString());
}
@Override
public void onToken(RePushMessage token) {
SharePrefUtil.saveString("token", token.getToken());
Log.e(TAG, "接收到了token -> " + token.getToken() + " " + RePushMaster.getCurrentPlatForm());
}
}
複製程式碼
- 自定義的Application中的onCreate中加入初始化程式碼。注意:第三方推送的SDK是可插拔的,需要哪家的sdk直接addPushClient就好了.
private void initPush() {
//輸入你在小米申請的appid & appkey
RePushMaster.addPushClient(new MiPushClient("repush_costom", "repush_custom"));
RePushMaster.addPushClient(new HuaWeiClient());
RePushMaster.addPushClient(new UMengClient());
RePushMaster.setSelector(new RePushMaster.ReSelector() {
@Override
public String select(Map<String, RePushClient> pushAdapterMap, String brand) {
//已完成根據裝置選擇sdk的邏輯,可以替換成自己的選擇邏輯
return super.select(pushAdapterMap, brand);
}
});
// 配置接收推送訊息的服務類
RePushMaster.setPushIntentService(PushHandlerService.class);
// 註冊推送
RePushMaster.registerPush(this);
}
複製程式碼
5.在Activity中開始使用: 開啟推送: RePushMaster.enable(this); 關閉推送: RePushMaster.disable(this); 設定別名: RePushMaster.setAlias(this, "alias"); 設定標籤: RePushMaster.setTags(this, "tag"); 獲取token: SharePrefUtil.getString("token", "token is null");
6.服務端的同學就不用管太多了,加入你們的客戶端中整合了華為 小米 友盟三家的推送,那就分別呼叫這三家服務端的sdk進行推送就可以了。
關於整合其他第三方的SDK
由於時間原因,本專案並沒有整合市面上所有的push sdk,例如:極光、個推等。如果你的專案裡面用到了這些sdk,可以實現RePushClient介面進行自定義。
程式碼傳送門(歡迎star,拍磚)
About Me
contact way | value |
---|---|
weixinjie1993@gmail.com | |
W2006292 | |
github | https://github.com/weixinjie |
blog | https://juejin.im/user/57673c83207703006bb92bf6 |