友盟推送(U-Push)集成、踩坑和解決與阿里雲系列產品的依賴衝突

上一篇博客講到接入阿里雲移動推送,這一篇一起來看一下友盟的推送。友盟作爲行業內較早做推送的第三方,在推送方面經驗還是比較雄厚的,並且友盟對外宣稱,友盟可以使用共享通道推送,也就是說,假如手機上裝了別的應用也使用了友盟推送,當自己的App後臺進程殺死的情況下,推送會利用別的app推送消息。我看了一下友盟的源碼,代碼裏做了判斷,當書籍上的app使用了淘寶的包名,或者淘寶和頭條的域名,就可以使用共享渠道,我自己也專門做了測試,確實可以收到,但是接受率不高。那麼接下來我們就來看一下友盟推送的接入,本篇博客集成友盟最新版6.0.1。

首先來說一下友盟推送和阿里系的依賴衝突吧!!!!由於他們都是用了阿里的基礎工具類依賴包,所以當項目中同時接入了友盟推送和阿里系的第三方,那麼及有可能會因爲  com.umeng.umsdk:utdid  這個依賴導致衝突,友盟官方給的解決方案是採用手動接入,替換掉依賴衝突的部分,但是我個人接入時還是有同樣的衝突,我這邊的解決方案是使用:

exclude(module: 'alicloud-android-ut')
exclude(module: 'alicloud-android-utdid')
exclude(module: 'alicloud-android-utils')

例如我這邊阿里雲熱修復和友盟推送有依賴衝突,解決辦法是(重點):

compile('com.aliyun.ams:alicloud-android-hotfix:3.2.8') {
        exclude(module: 'alicloud-android-ut')
        exclude(module: 'alicloud-android-utdid')
        exclude(module: 'alicloud-android-utils')
    }

這樣就可以過濾重複依賴,不會影響熱修復功能。具體有不明白的小夥伴可以評論留言向我詢問,接下來就講一下友盟Push的接入流程:

一. Appkey申請

請在U-Push官網爲您的應用申請Appkey(詳細操作路徑:U-Push官網->應用->新建應用->創建新應用)1-2-1

注:已經使用了【友盟+】統計的用戶,請從U-Push官網從已有應用中添加關聯。1-4

獲取應用對應的AppkeyUmeng Message Secret,這兩個值請務必留意,在後續SDK初始化中需要用到。1-5

二. 接入友盟Push SDK

在您的Android Studio工程的App模塊的build.gradle配置腳本中添加maven遠程依賴,導入最新版本PushSDK:

請查看您項目中com.android.tools.build:gradle配置,如果版本號<3.0.0,也就是Android Studio版本<3.0.0,請使用如下配置腳本添加遠程依賴:

//PushSDK必須依賴基礎組件庫,所以需要加入對應依賴
compile 'com.umeng.umsdk:common:1.5.4'
//PushSDK必須依賴utdid庫,所以需要加入對應依賴
compile 'com.umeng.umsdk:utdid:1.1.5.3'
//PushSDK
compile 'com.umeng.umsdk:push:6.0.1'

請查看您項目中com.android.tools.build:gradle配置,如果版本號>=3.0.0,也就是Android Studio版本>=3.0.0,請使用如下配置腳本添加遠程依賴:

//PushSDK必須依賴基礎組件庫,所以需要加入對應依賴
implementation 'com.umeng.umsdk:common:1.5.4'
//PushSDK必須依賴utdid庫,所以需要加入對應依賴
implementation 'com.umeng.umsdk:utdid:1.1.5.3'
//PushSDK
implementation 'com.umeng.umsdk:push:6.0.1'

在工程build.gradle配置腳本中buildscript和allprojects段中添加【友盟+】sdk 新maven倉庫地址

buildscript {
    repositories {
        google()
        jcenter()
        maven { url 'https://dl.bintray.com/umsdk/release' }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.4'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}
allprojects {
    repositories {
        google()
        jcenter()
        mavenCentral()
        maven { url 'https://dl.bintray.com/umsdk/release' }
    }
}

三. 基礎接口引入

1、務必在工程的自定義Application類的 onCreate() 方法中做SDK代碼初始化工作。

// 在此處調用基礎組件包提供的初始化函數 相應信息可在應用管理 -> 應用信息 中找到 http://message.umeng.com/list/apps
// 參數一:當前上下文context;
// 參數二:應用申請的Appkey(需替換);
// 參數三:渠道名稱;
// 參數四:設備類型,必須參數,傳參數爲UMConfigure.DEVICE_TYPE_PHONE則表示手機;傳參數爲UMConfigure.DEVICE_TYPE_BOX則表示盒子;默認爲手機;
// 參數五:Push推送業務的secret 填充Umeng Message Secret對應信息(需替換)
UMConfigure.init(this, "替換爲Appkey,服務後臺位置:應用管理 -> 應用信息 -> Appkey", "Umeng", UMConfigure.DEVICE_TYPE_PHONE, "替換爲祕鑰信息,服務後臺位置:應用管理 -> 應用信息 -> Umeng Message Secret");

1-7

 2、Push註冊在UMConfigure.init方法之後註冊,註冊成功後可獲取deviceToken,進行消息下發。調用代碼如下所示:


UMConfigure.init(this, "替換爲Appkey,服務後臺位置:應用管理 -> 應用信息 -> Appkey", "Umeng", UMConfigure.DEVICE_TYPE_PHONE, "替換爲祕鑰信息,服務後臺位置:應用管理 -> 應用信息 -> Umeng Message Secret");
//獲取消息推送代理示例
PushAgent mPushAgent = PushAgent.getInstance(this);
//註冊推送服務,每次調用register方法都會回調該接口
mPushAgent.register(new IUmengRegisterCallback() {

  @Override
  public void onSuccess(String deviceToken) {
    //註冊成功會返回deviceToken deviceToken是推送消息的唯一標誌
    Log.i(TAG,"註冊成功:deviceToken:-------->  " + deviceToken);
  }

  @Override
  public void onFailure(String s, String s1) {
    Log.e(TAG,"註冊失敗:-------->  " + "s:" + s + ",s1:" + s1);
  }
});

注意:deviceToken是【友盟+】消息推送生成的用於標識設備的id,長度爲44位,不能定製和修改。同一臺設備上不同應用對應的deviceToken不一樣。獲取deviceToken的值後,可進行消息推送測試!

四.應用數據統計接口

在所有的Activity 的onCreate 方法或在應用的BaseActivity的onCreate方法中添加:

PushAgent.getInstance(context).onAppStart();

特別注意:該方法是【友盟+】Push後臺進行日活統計及多維度推送的必調用方法,請務必調用!

接到這裏友盟推送就算初步完成了,那麼接下來就是在友盟的後臺測試消息推送了,獲取deviceToken!我們馬上可以向這臺設備推送消息了。

添加測試設備:

在【友盟+】消息推送服務Push後臺的“測試模式”中填寫獲取到的deviceToken,將該設備添加爲測試設備:1-15-11-15-2

在測試消息中新建消息,詳細過程如下所示,詳細過程如下所示:1-14

 和阿里雲推送相同,僅接入這些只能滿足一般的推送,當App的進程殺死後,手機就收不到推送了,那麼這時可以通過廠商渠道來補充,那麼下面我們就來看一看廠商渠道的接入,友盟現在支持華爲、小米、oppo、vivo和魅族的廠商渠道,不得不說友盟在推送方面走的還是比較靠前的。

華爲Push通道使用教程

創建應用

登錄【華爲開發者聯盟】https://developer.huawei.com/consumer/cn/1

進入管理中心,點擊PUSH1

申請PUSH服務1填寫相關信息1點擊提交,會顯示您已經開通Push服務1

點擊應用名稱,查看應用的app id和app secret。1-13

華爲廠商通道配置回執

集成華爲廠商通道SDK後,需要在華爲後臺配置消息回執纔可以正常取到通過華爲通道下發消息的收到數等數據,配置成功後,消息回執位置會顯示如下信息:1

操作方法:

  1. 進入華爲Push服務後臺,點擊“操作-修改”進入設置PUSH服務信息頁面
  2. 在“消息回執”區域中,選擇開通回執,並分別在“回調地址”和“HTTPS證書”裏輸入以下內容

回調地址:

https://agoo-ack.m.taobao.com/hw/

HTTPS證書:

-----BEGIN CERTIFICATE-----
MIIEaTCCA1GgAwIBAgILBAAAAAABRE7wQkcwDQYJKoZIhvcNAQELBQAwVzELMAkG
A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw0xNDAyMjAxMDAw
MDBaFw0yNDAyMjAxMDAwMDBaMGYxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i
YWxTaWduIG52LXNhMTwwOgYDVQQDEzNHbG9iYWxTaWduIE9yZ2FuaXphdGlvbiBW
YWxpZGF0aW9uIENBIC0gU0hBMjU2IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IB
DwAwggEKAoIBAQDHDmw/I5N/zHClnSDDDlM/fsBOwphJykfVI+8DNIV0yKMCLkZc
C33JiJ1Pi/D4nGyMVTXbv/Kz6vvjVudKRtkTIso21ZvBqOOWQ5PyDLzm+ebomchj
SHh/VzZpGhkdWtHUfcKc1H/hgBKueuqI6lfYygoKOhJJomIZeg0k9zfrtHOSewUj
mxK1zusp36QUArkBpdSmnENkiN74fv7j9R7l/tyjqORmMdlMJekYuYlZCa7pnRxt
Nw9KHjUgKOKv1CGLAcRFrW4rY6uSa2EKTSDtc7p8zv4WtdufgPDWi2zZCHlKT3hl
2pK8vjX5s8T5J4BO/5ZS5gIg4Qdz6V0rvbLxAgMBAAGjggElMIIBITAOBgNVHQ8B
Af8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUlt5h8b0cFilT
HMDMfTuDAEDmGnwwRwYDVR0gBEAwPjA8BgRVHSAAMDQwMgYIKwYBBQUHAgEWJmh0
dHBzOi8vd3d3Lmdsb2JhbHNpZ24uY29tL3JlcG9zaXRvcnkvMDMGA1UdHwQsMCow
KKAmoCSGImh0dHA6Ly9jcmwuZ2xvYmFsc2lnbi5uZXQvcm9vdC5jcmwwPQYIKwYB
BQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwOi8vb2NzcC5nbG9iYWxzaWduLmNv
bS9yb290cjEwHwYDVR0jBBgwFoAUYHtmGkUNl8qJUC99BM00qP/8/UswDQYJKoZI
hvcNAQELBQADggEBAEYq7l69rgFgNzERhnF0tkZJyBAW/i9iIxerH4f4gu3K3w4s
32R1juUYcqeMOovJrKV3UPfvnqTgoI8UV6MqX+x+bRDmuo2wCId2Dkyy2VG7EQLy
XN0cvfNVlg/UBsD84iOKJHDTu/B5GqdhcIOKrwbFINihY9Bsrk8y1658GEV1BSl3
30JAZGSGvip2CTFvHST0mdCF/vIhCPnG9vHQWe3WVjwIKANnuvD58ZAWR65n5ryA
SOlCdjSXVWkkDoPWoC209fN5ikkodBpBocLTJIg1MGCUF7ThBCIxPTsvFwayuJ2G
K1pp74P1S8SqtCr4fKGxhZSM9AyHDPSsQPhZSZg=
-----END CERTIFICATE-----

點擊“測試回執”,提示“測試成功”則表示配置成功1-16

特別強調:以上的回調地址和HTTPS證書一定要配置,而且要配置成功,否則,華爲廠商渠道的推送時收不到推送消息的。

配置華爲Push的AppID和Secret

在【友盟+】新版推送後臺http://message.umeng.com的【應用管理】【應用信息】裏的華爲AppID和華爲Secret處填上華爲Push的AppID和Secret。1-14

導入華爲Push通道SDK

通過在Android Studio工程的app模塊的build.gradle配置腳本中添加maven遠程依賴,導入華爲Push通道SDK。

//華爲Push通道
implementation 'com.umeng.umsdk:huawei-basetb:2.6.3.305'
implementation 'com.umeng.umsdk:huawei-pushtb:2.6.3.305'
implementation 'com.umeng.umsdk:huawei-umengaccs:1.2.1’

華爲Push初始化

在Application類的onCreate方法中添加:

HuaWeiRegister.register(final Context context);

註冊成功後會在tag:HuaWeiReceiver下面打印log: 獲取token成功,token= xxxxxxxxxxxxxxxxxxxxxxx接收到華爲消息則會打印log: HuaWeiReceiver,content= xxxxxxxxxxxxxxxxxxxxxxx

注意:

  • 僅在華爲EMUI設備上生效。
  • 集成華爲Push的版本暫不支持多包名。
  • 當EMUI版本爲8.0且App的targetSdkVersion爲26及以上時,設備會無法彈出通知。這種情況下,請升級EMUI的系統版本,或將App的targetSdkVersion設置爲25或25以下。

配置華爲AppID

需要在AndroidManifest.xml中配置AppID,其中xxxxxx爲華爲應用的AppID

<meta-data
    android:name="com.huawei.hms.client.appid"
    android:value="appid=xxxxxx" />

使用華爲彈窗功能

華爲對後臺進程做了諸多限制。若使用一鍵清理,應用的channel進程被清除,將接收不到推送。爲了增加推送的送達率,可選擇接入華爲託管彈窗功能。通知將由華爲系統託管彈出,點擊通知欄將跳轉到指定的Activity。該Activity需繼承自UmengNotifyClickActivity,同時實現父類的onMessage方法,對該方法的intent參數進一步解析即可,該方法異步調用,不阻塞主線程。示例如下:

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);  //此方法必須調用,否則無法統計打開數
        String body = intent.getStringExtra(AgooConstants.MESSAGE_BODY);
        Log.i(TAG, body);
    }
}

然後在AndroidManifest.xml中配置該Activity,並設置launchMode=”singleTask”和exported=”true”:

<activity
      android:name="com.umeng.message.example.MipushTestActivity"
      android:launchMode="singleTask"
      android:exported="true" />

在【友盟+】推送後臺發送通知時,勾選若設備離線轉爲系統通道下發,並填寫Activity的完整包路徑(該Activity需繼承自UmengNotifyClickActivity)。1-15

注意:

  • 對於EMUI 4.1及以下版本系統,若要使用華爲彈窗功能,則需在華爲設備上的【手機管家】App中,開啓應用的“自啓動權限”。
  • 使用華爲通道下發的通知,需要在華爲後臺配置消息回執纔可以正常統計到華爲通道下發消息的【收到數】。
  • 在調用API接口實現推送消息時,如果需要使用華爲彈窗,需添加(與小米彈窗字段相同):
"mipush":true
"mi_activity":"com.umeng.message.example.MipushTestActivity"        //此處請填寫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",
    }
}

接下來的就是小米、oppo、vivo和魅族的廠商渠道接入,基本上和華爲的接入是一致的,但是比華爲稍微簡單一些。各個廠商渠道接入具體可以參考:廠商通道集成文檔

以上是友盟推送和廠商渠道接入全部,那麼我們在項目中要實現定向推送到某一個客戶,使用deviceToken是根據設配來推送的,那麼在友盟推送的高級功能集成文檔 中提供了別名的綁定和設置Tag,這樣我們就可以將用戶的userId或者Token作爲別名和tag來進行綁定,這樣就可以給指定的用戶發送消息了,而不是通過設備號。

具體的步驟是:

  • 客戶端開發者在應用內調用 addTags 或者 addAlias來設置對應關係;
  • 【友盟+】消息後臺存儲相應的關係設置;
  • 在服務器端推送消息時,指定向之前設置過的別名或者標籤推送。

1、增加、刪除、查詢標籤;

//添加標籤 示例:將“標籤1”、“標籤2”綁定至該設備
mPushAgent.getTagManager().addTags(new TagManager.TCallBack() {

    @Override
    public void onMessage(final boolean isSuccess, final ITagManager.Result result) {

    }

},"標籤1",, "標籤2");
//刪除標籤,將之前添加的標籤中的一個或多個刪除
mPushAgent.getTagManager().deleteTags(new TagManager.TCallBack() {

    @Override
    public void onMessage(final boolean isSuccess, final ITagManager.Result result) {

    }

},"標籤1",, "標籤2");
//獲取服務器端的所有標籤
mPushAgent.getTagManager().getTags(new TagManager.TagListCallBack() {

    @Override
    public void onMessage(boolean isSuccess, List<String> result) {

    }

});

注意:

  • tag名稱請不要加入URL Encode等變換處理,請使用原生字符串。
  • 目前每個用戶tag限制在1024個, 每個tag 最大128字符。

2、增加、刪除、查詢別名:

//別名增加,將某一類型的別名ID綁定至某設備,老的綁定設備信息還在,別名ID和device_token是一對多的映射關係
mPushAgent.addAlias("別名ID", "自定義類型", new UTrack.ICallBack() {

    @Override
    public void onMessage(boolean isSuccess, String message) {

    }

});
//別名綁定,將某一類型的別名ID綁定至某設備,老的綁定設備信息被覆蓋,別名ID和deviceToken是一對一的映射關係
mPushAgent.setAlias("別名ID", "自定義類型", new UTrack.ICallBack() {

    @Override
    public void onMessage(boolean isSuccess, String message) {

    }

});
//移除別名ID
mPushAgent.deleteAlias("別名ID", "自定義類型", new UTrack.ICallBack() {

    @Override
    public void onMessage(boolean isSuccess, String message) {

    }

});

 

注意:

  • 若要使用新的alias,請先調用deleteAlias接口移除掉舊的alias,再調用addAlias添加新的alias;
  • 設置alias時需要指定該alias對應的類型(alias type),例如:自有id、新浪微博、騰訊微博、豆瓣等;
  • alias名稱請不要使用URLEncode等變換處理,請使用原生字符串;
  • alias的綁定是需要獲取到deviceToken爲前提的,最好是在註冊即enable的回調接口中進行alias的綁定,此時可以保證獲取到deviceToken;
  • alias原有的addExclusiveAlias和removeAlias接口均已廢棄,請使用新接口

收到推送後,都會有點擊事件,那麼友盟也給我們提供了推送點擊回調方法,請將此方法放在Application中:

UmengNotificationClickHandler notificationClickHandler = new UmengNotificationClickHandler() {
      //打開activity
      @Override
      public void openActivity(Context context, UMessage uMessage) {
      }

      //傳遞鏈接
      @Override
      public void openUrl(Context context, UMessage uMessage) {
        System.out.println("傳遞的url:" + uMessage.url);
        Intent intent = new Intent(context, WebViewMineActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.putExtra("url", uMessage.url);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
        context.startActivity(intent);
      }

      //打開App
      @Override
      public void launchApp(Context context, UMessage uMessage) {
        UMessage uMessage1 = uMessage;
        if (uMessage != null && uMessage.extra != null) {
          String jumpUrl = uMessage.extra.get("url");
          PushJumpUtils.pushJump(jumpUrl, context, isAppRunning());
        }else {
          if (!isAppRunning()){
            Intent intent = new Intent(context, AppStartActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
            context.startActivity(intent);
          }
        }
      }

      //自定義點擊事件
      @Override
      public void dealWithCustomAction(Context context, UMessage msg) {
      }
    };
    mPushAgent.setNotificationClickHandler(notificationClickHandler);
  }

點擊推送回調有四個方法,分別針對喚醒App、跳轉到相應的Activit、跳轉到網頁和自定義跳轉的方法。

以上就是友盟推送接入的所有內容和注意事項,其中別名的設置、推送點擊大家一定要注意。其中友盟的Maven依賴會和阿里雲熱修復、oss的依賴有衝突,這個我在文章的開篇有將,請大家查看。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章