一個融合多家推送sdk的庫:RePush

推送一直是拉活用戶的重要運營手段,相比IOS的系統推送通道,Android的推送實在讓開發者頭疼。各大廠商均定製本身的Rom,除了微信這種霸王級別的應用,其餘的應用想要保活推送通道可謂是難上加難。那對於推送的實時性要求較高的應用怎麼辦呢?OK,你們想到了如下幾種姿式: 1.本身作應用的保活,好比提升進程級別、開一個通知欄的Service等 2.找公司的BD與各大廠家合做,將本身的應用包名加入到廠家的白名單中,讓系統來提供保活 3.本身開發一波大的SDK,將市面上常見的設備廠商的推送SDK進行融合,根據不一樣的設備廠商選擇對應的廠商SDK,共享系統的推送通道。 4.待補充ing... 客觀的看待上述幾種姿式,仍是第三個最不容易翻車(固然若是大家家的BD足夠6,可讓各大廠商給大家作應用保活,就當我在說夢話)。So,這段時間研究了一波,本身擼了一個庫:RePush(沒錯,叫RePush是由於老婆大人的名字有個睿.恩,秀恩愛就是要這麼直接)。git

注:悅跑圈團隊開源了一個MixPush,架構挺不錯的,我也借鑑了一波github

開始預調研各大廠家的Push

小米

小米設備佔比仍是蠻大的,因此集成他們的SDK毋庸置疑。幸虧小米的推送SDK作的是很完善的,集成沒費多少功夫。 小米推送平臺地址 注:我的開發者須要提交身份證等證實文件作實名認證;企業的須要上傳一部分資質,小米審覈經過以後就能夠開心浪了。客觀講小米的推送作的很是良心,功能比較完善,你們能夠直接看個人代碼實現。bash

華爲

趁着個人良心還熱乎,我敢說華爲的推送是我見過最坑的,沒有之一。 華爲推送平臺微信

  • 不支持別名
  • 不支持標籤
  • 若是你想羣發消息,只能將客戶端的token上報給服務端,服務端遍歷token挨個推送
  • 若是用戶想關閉推送,你也只能將該用戶的token上報給服務端,服務端將該token從表中剔除
  • 在meta9等設備上,在咱們的app沒有得到自啓動權限的狀況下,當app被系統徹底幹掉時,收到推送後用戶點擊推送並不會觸發HuaweiPushRevicer中的onEvent方法。這就形成開發者沒法處理點擊後的跳轉事件。我電話諮詢了下華爲的開發人員,他們說建議咱們使用自定義事件(即Uri)來傳遞信息。這塊我已經處理好了,詳見代碼中的PushHandlerActivity。

友盟

所謂的推送N+1策略就是指N個廠家的推送加一個第三方的推送,相信你們的App裏面都有友盟統計吧,順手集成上他們的SDK也不是什麼難事。客觀講友盟的推送坑不是不少。你們看代碼吧。架構

RePush的使用

寫在前面:須要你們全局搜索"repush_custome",將涉及到的值改爲本身在第三方平臺上申請的值。

  1. import module(repush_master必須)
  2. 修改app下的build.gradle文件加入依賴
  3. 繼承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());
    }

}
複製代碼
  1. 自定義的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");app

6.服務端的同窗就不用管太多了,加入大家的客戶端中集成了華爲 小米 友盟三家的推送,那就分別調用這三家服務端的sdk進行推送就能夠了。ide

關於集成其餘第三方的SDK

因爲時間緣由,本項目並無集成市面上全部的push sdk,例如:極光、個推等。若是你的項目裏面用到了這些sdk,能夠實現RePushClient接口進行自定義。gradle

代碼傳送門(歡迎star,拍磚)

代碼地址ui

About Me

contact way value
mail weixinjie1993@gmail.com
wechat W2006292
github https://github.com/weixinjie
blog https://juejin.im/user/57673c83207703006bb92bf6
相關文章
相關標籤/搜索