記錄一下阿里推送接入的流程:
我采用的是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的錯誤
點擊應(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-----
在阿里云推送的控制臺里添加華為APP的信息
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()方法中初始通道弛槐。
// 注冊方法會自動判斷是否支持華為系統(tǒng)推送依啰,如不支持會跳過注冊乎串。
HuaWeiRegister.register(application);
6. 在日志中查看初始化情況
華為通道初始化成功,可以看到以下日志:(如不成功速警,檢查是否在華為控制臺配置SHA256指紋證書叹誉,目前華為需要配置)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需繼承自抽象類
AndroidPopupActivity
(MiPushSystemNotificationActivity
已廢棄镀裤,小米、華為缴饭、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è)置或者怎么回事掸掸,麻煩告訴我一下氯庆,先謝謝了!