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

上一篇博客講到接入阿里云移動推送,這一篇一起來看一下友盟的推送。友盟作為行業(yè)內較早做推送的第三方,在推送方面經驗還是比較雄厚的,并且友盟對外宣稱,友盟可以使用共享通道推送,也就是說,假如手機上裝了別的應用也使用了友盟推送,當自己的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官網->應用->新建應用->創(chuàng)建新應用)

注:已經使用了【友盟+】統(tǒng)計的用戶,請從U-Push官網從已有應用中添加關聯(lián)。

獲取應用對應的AppkeyUmeng Message Secret,這兩個值請務必留意,在后續(xù)SDK初始化中需要用到。

二. 接入友盟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代碼初始化工作。

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

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


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的值后,可進行消息推送測試!

四.應用數(shù)據(jù)統(tǒng)計接口

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

PushAgent.getInstance(context).onAppStart();

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

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

添加測試設備:

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

?

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


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

華為Push通道使用教程

創(chuàng)建應用

登錄【華為開發(fā)者聯(lián)盟】https://developer.huawei.com/consumer/cn/

進入管理中心,點擊PUSH

申請PUSH服務

?填寫相關信息

?點擊提交,會顯示您已經開通Push服務

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

華為廠商通道配置回執(zhí)

集成華為廠商通道SDK后,需要在華為后臺配置消息回執(zhí)才可以正常取到通過華為通道下發(fā)消息的收到數(shù)等數(shù)據(jù),配置成功后,消息回執(zhí)位置會顯示如下信息:

操作方法:

  1. 進入華為Push服務后臺,點擊“操作-修改”進入設置PUSH服務信息頁面
  2. 在“消息回執(zhí)”區(qū)域中,選擇開通回執(zhí),并分別在“回調地址”和“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-----

點擊“測試回執(zhí)”,提示“測試成功”則表示配置成功

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

配置華為Push的AppID和Secret

在【友盟+】新版推送后臺http://message.umeng.com的【應用管理】【應用信息】里的華為AppID和華為Secret處填上華為Push的AppID和Secret。

導入華為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的系統(tǒng)版本,或將App的targetSdkVersion設置為25或25以下。

配置華為AppID

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

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

使用華為彈窗功能

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

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);  //此方法必須調用,否則無法統(tǒng)計打開數(shù)
        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" />

在【友盟+】推送后臺發(fā)送通知時,勾選若設備離線轉為系統(tǒng)通道下發(fā),并填寫Activity的完整包路徑(該Activity需繼承自UmengNotifyClickActivity)。

注意:

  • 對于EMUI 4.1及以下版本系統(tǒng),若要使用華為彈窗功能,則需在華為設備上的【手機管家】App中,開啟應用的“自啟動權限”。
  • 使用華為通道下發(fā)的通知,需要在華為后臺配置消息回執(zhí)才可以正常統(tǒng)計到華為通道下發(fā)消息的【收到數(shù)】。
  • 在調用API接口實現(xiàn)推送消息時,如果需要使用華為彈窗,需添加(與小米彈窗字段相同):
"mipush":true
"mi_activity":"com.umeng.message.example.MipushTestActivity"        //此處請?zhí)顚慉ctivity完整包路徑

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和魅族的廠商渠道接入,基本上和華為的接入是一致的,但是比華為稍微簡單一些。各個廠商渠道接入具體可以參考:廠商通道集成文檔

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

具體的步驟是:

  • 客戶端開發(fā)者在應用內調用 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的依賴有沖突,這個我在文章的開篇有將,請大家查看。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容