阿里云推送接入

記錄一下阿里推送接入的流程:

我采用的是Maven庫快速集成

1:閱讀阿里云推送的開發(fā)文檔嚼黔,

文檔地址:https://help.aliyun.com/document_detail/51056.html?spm=a2c4g.11186623.6.555.28935d9bPyAAdI

2:在Project的build.gradle文件中配置maven庫的URL:

allprojects {
    repositories {
        google()
        jcenter()
        maven {
            url 'http://maven.aliyun.com/nexus/content/repositories/releases/'
        }
    }
}

3.在對應(yīng)的module下的build.gradle文件中添加對應(yīng)依賴:

android {
    ......
    defaultConfig {
        applicationId "xx.xxx.xxx"http://包名
       ......

        ndk{
            //選擇要添加的對應(yīng)cpu類型的.so庫
            abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a'
        }
      .......
    }
    ......
}

dependencies {
     ......
    //阿里推送
    implementation 'com.aliyun.ams:alicloud-android-push:3.1.9.1'
    //或
    compile 'com.aliyun.ams:alicloud-android-push:3.1.9.1@aar'
    compile 'com.aliyun.ams:alicloud-android-utils:1.1.3'
    compile 'com.aliyun.ams:alicloud-android-beacon:1.0.2'
    compile 'com.aliyun.ams:alicloud-android-ut:5.4.3'
    compile 'com.aliyun.ams:alicloud-android-utdid:1.5.2'
    ......
}

注:如果在添加以上abiFilter配置之后Android Studio出現(xiàn)一下提示:

NDK integration is deprecated in the current plugin. Consider trying the new experimental plugin.

則在Project根目錄的Gradle.properties文件中添加:

    android.userDeprecatedNdk=true

3.AndroidManifest配置:

在AndroidManifest文件中配置appKey佳晶,appSecret

<application android:name="xxxx">
     <meta-data
        android:name="com.alibaba.app.appkey"
        android:value="xxxxxx" />//填入你自己的appKey
    <meta-data
        android:name="com.alibaba.app.appsecret"
        android:value="xxxxxx" />//填入你自己的appSecret
</application>

com.alibaba.app.appkey和com.alibaba.app.appsecret是App對應(yīng)的信息挤巡,在推送控制臺APP列表頁的應(yīng)用證書中獲取。appKey和appSecret必須寫賊application標簽里面二庵,否則會報找不到appkey的錯誤


1
2

點擊應(yīng)用管理就能看到app的信息袄简。如果沒有app則需要先創(chuàng)建。

4.消息接收Receiver配置

創(chuàng)建消息接收receiver比藻,繼承自com.alibaba.sdk.android.push.MessageReceiver,并在對應(yīng)回調(diào)中添加業(yè)務(wù)處理邏輯铝量,可參考如下:

import com.alibaba.sdk.android.push.MessageReceiver;
import com.alibaba.sdk.android.push.notification.CPushMessage;

import java.util.Map;

public class AliMessageReceiver extends MessageReceiver {
    //消息接收部分的   LOG_TAG
    public static final String REC_TAG = "receiver";

    @Override
    protected void onNotificationOpened(Context context, String title, String summary, String extraMap) {
        Log.e("AliMessageReceiver", "Receive notification, title: " + title + ", summary: " + summary + ", extraMap: " + extraMap);
    }

    @Override
    protected void onNotificationRemoved(Context context, String messageId) {
        Log.e("AliMessageReceiver", "onNotificationRemoved" );
    }

    @Override
    protected void onMessage(Context context, CPushMessage cPushMessage) {
        Log.e("AliMessageReceiver", "onMessage, messageId: " + cPushMessage.getMessageId());
    }

    @Override
    protected void onNotification(Context context, String title, String summary, Map<String, String> extraMap) {
        Log.e("AliMessageReceiver", "Receiver notification, title: " + title + ", summary: " + summary + ",extraMap: " + extraMap);
    }

    @Override
    protected void onNotificationReceivedInApp(Context context, String title, String summary, Map<String, String> extraMap, int openType, String openActivity, String openUrl) {
        Log.e("AliMessageReceiver", "onNotificationReceivedInApp, title: " + title + ", summary: " + summary + ", extraMap: " + extraMap);
    }

    @Override
    protected void onNotificationClickedWithNoAction(Context context, String title, String summary, String extraMap) {
        Log.e("AliMessageReceiver", "onNotificationClickedWithNoAction, title: " + title + ", summary: " + summary + ", extraMap: " + extraMap);
    }
}

將receiver添加到AndroidManifest文件中

<!-- 消息接收監(jiān)聽器-->
<receiver
    android:name=".receiver.AliMessageReceiver"
    android:exported="false"> <!-- 為保證receiver安全倘屹, 建議設(shè)置不可導(dǎo)出,如需對其他應(yīng)用開放可通過 android:permission進行限制 -->
    <intent-filter>
        <action android:name="com.alibaba.push2.action.NOTIFICATION_OPENED" />
    </intent-filter>
    <intent-filter>
        <action android:name="com.alibaba.push2.action.NOTIFICATION_REMOED" />
    </intent-filter>
    <intent-filter>
        <action android:name="com.alibaba.sdk.android.push.RECEIVE" />
    </intent-filter>
</receiver> 

5.Proguard配置

-keepclasseswithmembernames class ** {
    native <methods>;
}
-keepattributes Signature
-keep class sun.misc.Unsafe { *; }
-keep class com.taobao.** {*;}
-keep class com.alibaba.** {*;}
-keep class com.alipay.** {*;}
-keep class com.ut.** {*;}
-keep class com.ta.** {*;}
-keep class anet.**{*;}
-keep class anetwork.**{*;}
-keep class org.android.spdy.**{*;}
-keep class org.android.agoo.**{*;}
-keep class android.os.**{*;}
-keep class org.json.**{*;}
-dontwarn com.taobao.**
-dontwarn com.alibaba.**
-dontwarn com.alipay.**
-dontwarn anet.**
-dontwarn org.android.spdy.**
-dontwarn org.android.agoo.**
-dontwarn anetwork.**
-dontwarn com.ut.**
-dontwarn com.ta.**

6.在應(yīng)用中注冊和啟動移動推送

首先通過PushServiceFactory獲取到CloudPushService慢叨,然后調(diào)用register()初始化并注冊云推送通道纽匙,并確保Application上下文中進行初始化工作。
請參照以下代碼段進行初始化:

import android.app.Application;
import android.content.Context;
import android.util.Log;
import com.alibaba.sdk.android.push.CloudPushService;
import com.alibaba.sdk.android.push.CommonCallback;
import com.alibaba.sdk.android.push.noonesdk.PushServiceFactory;
public class MainApplication extends Application {
    private static final String TAG = "Init";
    @Override
    public void onCreate() {
        super.onCreate();
        initCloudChannel(this);
    }
    /**
     * 初始化云推送通道
     * @param applicationContext
     */
    private void initCloudChannel(Context applicationContext) {
        PushServiceFactory.init(applicationContext);
        CloudPushService pushService = PushServiceFactory.getCloudPushService();
        pushService.register(applicationContext, new CommonCallback() {
            @Override
            public void onSuccess(String response) {
                Log.d(TAG, "init cloudchannel success");
            }
            @Override
            public void onFailed(String errorCode, String errorMessage) {
                Log.d(TAG, "init cloudchannel failed -- errorcode:" + errorCode + " -- errorMessage:" + errorMessage);
            }
        });
    }
}

【注意】:

  • 移動推送的初始化必須在Application中拍谐,不能放到Activity中執(zhí)行烛缔。移動推送在初始化過程中將啟動后臺進程channel,必須保證應(yīng)用進程和channel進程都執(zhí)行到推送初始化代碼轩拨。
  • 如果設(shè)備成功注冊践瓷,將回調(diào)callback.onSuccess()方法。
  • 但如果注冊服務(wù)器連接失敗亡蓉,則調(diào)用callback.onFailed方法晕翠,并且自動進行重新注冊,直到onSuccess為止。(重試規(guī)則會由網(wǎng)絡(luò)切換等時間自動觸發(fā)淋肾。)
  • 請在網(wǎng)絡(luò)通暢的情況下進行相關(guān)的初始化調(diào)試硫麻,如果網(wǎng)絡(luò)不通,或者App信息配置錯誤樊卓,在onFailed方法中拿愧,會有相應(yīng)的錯誤碼返回,可參考錯誤處理碌尔。

啟動正常確認方法:
回調(diào)方法callback.onSuccess()被調(diào)用浇辜。以上文接入代碼為例,logcat將會打印以下日志:

11-24 12:55:51.096  15235-15535/com.alibaba.xxxx D/YourApp﹕ init cloudchannel success

確認cloudchannel初始化正常唾戚,在logcat日志中:輸入awcn關(guān)鍵字:

11-24 12:53:51.036  15235-15556/com.alibaba.xxxx E/awcn﹕ |[seq:AWCN1_1] AUTH httpStatusCode: 200
11-24 12:53:51.036  15235-15556/com.alibaba.xxxx E/awcn﹕ |[seq:AWCN1_1] status:AUTH_SUCC

7.其他問題

Android 8.0 及以上 NotificationChannel 機制
請參照 移動推送Android SDK: Android 8.0 以上設(shè)備通知接收不到 奢赂。
android9.0以上需要設(shè)置允許 http 請求
請參照 移動推送 Android : 只在Android 9+系統(tǒng)報錯 errorCode:10109

到這里阿里云推送就算接入完成了颈走。
但是手機息屏后cpu進入休眠狀態(tài)膳灶,常規(guī)的服務(wù)和長連接都會被系統(tǒng)停掉,亮屏后恢復(fù)立由。廠商深度定制的系統(tǒng)轧钓,支持廠商通道的,才可以收到锐膜,比如華為小米等輔助通道

下面是接入華為輔助通道的記錄:

文檔查看:移動推送輔助通道配置

1.配置應(yīng)用

華為開發(fā)者聯(lián)盟 注冊 App毕箍,應(yīng)用審核通過后,能夠得到華為的AppID和AppSecert道盏。在控制臺應(yīng)用配置中設(shè)置你的應(yīng)用 AppID 和 AppSecert而柑。(注意:最新的華為開放平臺是分開push功能的,需要在push功能區(qū) 開通/啟用 推送功能)荷逞,媒咳,華為后臺添加消息回執(zhí)回調(diào)地址,https://agoo-ack.m.taobao.com/hw/

https 證書填入以下內(nèi)容:

-----BEGIN CERTIFICATE-----
MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG
A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw
MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i
YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT
aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ
jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp
xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp
1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG
snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ
U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8
9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E
BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B
AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz
yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE
38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP
AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad
DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME
HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
-----END CERTIFICATE-----
開通推送
回執(zhí)狀態(tài)配置

在阿里云推送的控制臺里添加華為APP的信息


輔助通道2.png

2.在Project的build.gradle文件中配置maven庫的URL:

和上面阿里云推送的maven庫的URL是一樣的种远,上面配置了這里可以不用配置涩澡。

allprojects {
    repositories {
        maven {
            url 'http://maven.aliyun.com/nexus/content/repositories/releases/'
        }
    }
}

gradle添加依賴:

dependencies {
    compile 'com.aliyun.ams:alicloud-android-third-push:3.1.0@aar'
}

注意:如果只添加alicloud-android-third-push,而不添加華為通道依賴時坠敷,會報錯找不到一些文件和值妙同,比如@string/error_over_original_size @string/error_over_original_count @style/upsdkDlDialog,如要使用華為通道膝迎,請看下文華為依賴粥帚,添加上即可,如不使用通道限次,您自行寫上這些值即可芒涡。

3.Huawei依賴

添加華為推送SDK依賴:

dependencies {
    ......
    compile 'com.aliyun.ams:huawei-push:2.6.3.305'
    compile 'com.aliyun.ams:huawei-push-base:2.6.3.305'
}

同時在AndroidManifest文件中添加如下配置:

<meta-data
            android:name="com.huawei.hms.client.appid"
            android:value="appid=華為開放平臺申請的ID信息" />

4. Proguard配置

如果集成推送SDK的工程開啟代碼混淆,在Proguard配置的基礎(chǔ)上,需要添加以下輔助通道的Proguard配置拖陆。

# 華為通道
-keep class com.huawei.** {*;}
-dontwarn com.huawei.**

5. 在應(yīng)用中初始化輔助通道

將以下代碼加入你application.onCreate()方法中初始通道弛槐。\color{#FF0000}{注意:輔助通道注冊務(wù)必在Application中執(zhí)行且放在推送SDK初始化代碼之后,否則可能導(dǎo)致輔助通道注冊失敗}

// 注冊方法會自動判斷是否支持華為系統(tǒng)推送依啰,如不支持會跳過注冊乎串。
HuaWeiRegister.register(application);

6. 在日志中查看初始化情況

華為通道初始化成功,可以看到以下日志:(如不成功速警,檢查是否在華為控制臺配置SHA256指紋證書叹誉,目前華為需要配置)
華為.jpg

7. 輔助彈窗

  • 當(dāng)前部分國產(chǎn)品牌設(shè)備管控嚴格,接入推送功能的App進程在后臺被清理后闷旧,收不到推送通知长豁;接入輔助彈窗后,可以借助對應(yīng)品牌的系統(tǒng)通道忙灼,保證App后臺被清理后匠襟,仍能收到推送通知;
  • 當(dāng)前輔助彈窗已接入小米该园、華為酸舍、OPPO、VIVO里初、魅族(小米輔助彈窗:v2.3.0及以上支持啃勉;華為輔助彈窗:v3.0.8及以上支持;OPPO輔助彈窗:v3.1.4及以上支持)双妨;
  • 當(dāng)前華為輔助彈窗僅支持Emotion UI(華為定制ROM)4.1級以上版本的設(shè)備淮阐;

7.1 客戶端

  • 該功能的使用需要接入推送輔助通道,確保使用最新的輔助通道擴展包刁品,具體參考上文泣特;

  • 輔助彈窗送達的通知展示效果,和普通通知相同哑诊;

  • 服務(wù)端指定輔助彈窗通道推送時群扶,一定要指定通知點擊后要打開的Activity及刻,該Activity需繼承自抽象類AndroidPopupActivityMiPushSystemNotificationActivity已廢棄镀裤,小米、華為缴饭、OPPO等廠商通道彈窗統(tǒng)一繼承AndroidPopupActivity)暑劝,否則無法獲取到通知的相關(guān)信息,并且會影響通知到達率的統(tǒng)計颗搂;

  • AndroidPopupActivity中提供抽象方法onSysNoticeOpened()担猛,實現(xiàn)該方法后可獲取到輔助彈窗通知的標題內(nèi)容額外參數(shù),在通知點擊時觸發(fā)傅联,原本的通知回調(diào)onNotification()onNotificationOpened()不適用于輔助彈窗先改;

  • 指定打開的托管彈窗Activity在AndroidManifest.xml中注冊時需要聲明屬性:android:exported=true

  • 接入如下所示:

import com.alibaba.sdk.android.push.AndroidPopupActivity;
public class PopupPushActivity extends AndroidPopupActivity {
    static final String TAG = "PopupPushActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
    /**
     * 實現(xiàn)通知打開回調(diào)方法,獲取通知相關(guān)信息
     * @param title     標題
     * @param summary   內(nèi)容
     * @param extMap    額外參數(shù)
     */
    @Override
    protected void onSysNoticeOpened(String title, String summary, Map<String, String> extMap) {
        Log.d("OnMiPushSysNoticeOpened, title: " + title + ", content: " + summary + ", extMap: " + extMap);
    }
}

到這里基本就是完成了蒸走。
可以在控制臺或者服務(wù)器進行測試
在控制臺測試要注意一下:


注意

activity仇奶,title, body的參數(shù)需要填寫比驻,不然收不到推送该溯。
通知通道我說在使用華為推送事不用寫是因為,我收到推送的時候不在我設(shè)置的推送通道里别惦。是一個叫“營銷通知”的一個推送通道狈茉。而且默認是靜默的,有人知道怎么設(shè)置或者怎么回事掸掸,麻煩告訴我一下氯庆,先謝謝了!


營銷通知
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末扰付,一起剝皮案震驚了整個濱河市点晴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌悯周,老刑警劉巖粒督,帶你破解...
    沈念sama閱讀 212,080評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異禽翼,居然都是意外死亡屠橄,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評論 3 385
  • 文/潘曉璐 我一進店門闰挡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锐墙,“玉大人,你說我怎么就攤上這事长酗∠保” “怎么了?”我有些...
    開封第一講書人閱讀 157,630評論 0 348
  • 文/不壞的土叔 我叫張陵夺脾,是天一觀的道長之拨。 經(jīng)常有香客問我,道長咧叭,這世上最難降的妖魔是什么蚀乔? 我笑而不...
    開封第一講書人閱讀 56,554評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮菲茬,結(jié)果婚禮上吉挣,老公的妹妹穿的比我還像新娘派撕。我一直安慰自己,他們只是感情好睬魂,可當(dāng)我...
    茶點故事閱讀 65,662評論 6 386
  • 文/花漫 我一把揭開白布终吼。 她就那樣靜靜地躺著,像睡著了一般氯哮。 火紅的嫁衣襯著肌膚如雪衔峰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,856評論 1 290
  • 那天蛙粘,我揣著相機與錄音垫卤,去河邊找鬼。 笑死出牧,一個胖子當(dāng)著我的面吹牛穴肘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播舔痕,決...
    沈念sama閱讀 39,014評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼评抚,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了伯复?” 一聲冷哼從身側(cè)響起慨代,我...
    開封第一講書人閱讀 37,752評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎啸如,沒想到半個月后侍匙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,212評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡叮雳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,541評論 2 327
  • 正文 我和宋清朗相戀三年想暗,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片帘不。...
    茶點故事閱讀 38,687評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡说莫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出寞焙,到底是詐尸還是另有隱情储狭,我是刑警寧澤,帶...
    沈念sama閱讀 34,347評論 4 331
  • 正文 年R本政府宣布捣郊,位于F島的核電站辽狈,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏模她。R本人自食惡果不足惜稻艰,卻給世界環(huán)境...
    茶點故事閱讀 39,973評論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望侈净。 院中可真熱鬧尊勿,春花似錦、人聲如沸畜侦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽旋膳。三九已至澎语,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間验懊,已是汗流浹背擅羞。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留义图,地道東北人减俏。 一個月前我還...
    沈念sama閱讀 46,406評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像碱工,于是被迫代替她去往敵國和親娃承。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,576評論 2 349