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

weixinjie發表於2017-08-13

推送一直是拉活使用者的重要運營手段,相比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",將涉及到的值改成自己在第三方平臺上申請的值。

  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");

6.服務端的同學就不用管太多了,加入你們的客戶端中整合了華為 小米 友盟三家的推送,那就分別呼叫這三家服務端的sdk進行推送就可以了。

關於整合其他第三方的SDK

由於時間原因,本專案並沒有整合市面上所有的push sdk,例如:極光、個推等。如果你的專案裡面用到了這些sdk,可以實現RePushClient介面進行自定義。

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

程式碼地址

About Me

contact way value
mail weixinjie1993@gmail.com
wechat W2006292
github https://github.com/weixinjie
blog https://juejin.im/user/57673c83207703006bb92bf6

相關文章