文章目录
快速集成官方文档在 这里,这里只关心在Android接入时的必要步骤与相关配置,满足快速接入并调试使用
0.控制台中配置好产品应用
在此处注册登录,配置好产品,不用在乎配置文件,因为只需要接入移动推送,拿到appkey和appsecret即可
1. 基础接入配置使用
1.1配置根目录的 build.gradle文件
allprojects {
repositories {
jcenter()
maven {
url 'http://maven.aliyun.com/nexus/content/repositories/releases/'
}
}
}
1.2配置要接入module的build.gradle文件
dependencies {
...
...
//阿里推送
implementation 'com.aliyun.ams:alicloud-android-push:3.1.6'
}
官方提示的错误(我没遇到,倒是遇到包冲突,剔除了重复包):
NDK integration is deprecated in the current plugin. Consider trying the new experimental plugin.
在 Project 根目录的gradle.properties文件中添加:
android.useDeprecatedNdk=true
1.3配置清单文件
//必要权限 及其他组件配置在自动远程集成试均可跳过,因此这里只需要在application标签内配置appKey、appSecret
<application android:name="*****">
<meta-data android:name="com.alibaba.app.appkey" android:value="*****"/> <!-- 请填写你自己的- appKey -->
<meta-data android:name="com.alibaba.app.appsecret" android:value="****"/> <!-- 请填写你自己的appSecret -->
</application>
2. 接收消息配置–Receiver
2.1 Recevier方法简析
自定义Receiver通过继承MessageReceiver,可以拦截通知,接收消息,获取推送中的扩展字段。或者在通知打开或删除的时候,切入进行后续处理。其他详细API文档在这里
待实现方法 | 方法、参数说明 | 补充描述 |
---|---|---|
void onNotification(Context context, String title, String summary, Map<String, String> extraMap) | 通知接收回调 context 上下文环境 title 通知标题 summary 通知内容 extraMap 通知额外参数,包括部分系统自带参数: _ALIYUN_NOTIFICATION_ID_(V2.3.5及以上) :创建通知对应id; _ALIYUN_NOTIFICATION_PRIORITY_(V2.3.5及以上) :创建通知对应id。默认不带,需要通过OpenApi设置 | 客户端接收到通知后,回调该方法 可获取到并处理通知相关的参数 |
void onMessage(Context context, CPushMessage cPushMessage) | 消息接收回调 context 上下文环境 message CPushMessage 类型,可以获取消息Id、消息标题和内容 | 用于接收服务端推送的消息 消息不会弹窗,而是回调该方法 |
onNotificationOpened(Context context, String title, String summary, String extraMap) | 通知打开回调 参数同通知接收回调 | 打开通知时会回调该方法,通知打开上报由SDK自动完成 |
onNotificationClickedWithNoAction(Context context, String title, String summary, String extraMap) | 无跳转逻辑通知打开回调 参数同通知接收回调 | |
onNotificationReceivedInApp(Context context, String title, String summary, Map<String, String> extraMap, int openType, String openActivity, String openUrl) | 通知在应用内到达回调 参数同通知接收回调, openType 原本通知打开方式,1:打开APP;2:打开activity;3:打开URL;4:无跳转逻辑 | 当用户创建自定义通知样式,并且设置推送应用内到达不创建通知弹窗时调用该回调,且此时不调用onNotification 回调(v2.3.3及以上版本支持 ) |
onNotificationRemoved(Context context, String messageId) | 通知删除回调 context 上下文环境 messageId 删除通知的Id | 删除通知时回调该方法,通知删除上报由SDK自动完成 |
2.2 自定义Receiver接收推送消息
import android.content.Context;
import com.alibaba.sdk.android.push.MessageReceiver;
import com.alibaba.sdk.android.push.notification.CPushMessage;
import java.util.Map;
/**
* Created by SJ on 2020/1/3.
* 按需重写
*/
public class ALiMessageReceiver extends MessageReceiver {
// 消息接收部分的LOG_TAG
public static final String REC_TAG = "receiver";
@Override
public void onNotification(Context context, String title, String summary, Map<String, String> extraMap) {
}
@Override
public void onMessage(Context context, CPushMessage cPushMessage) {
}
@Override
public void onNotificationOpened(Context context, String title, String summary, String extraMap) {
}
@Override
protected void onNotificationClickedWithNoAction(Context context, String title, String summary, String extraMap) {
}
@Override
protected void onNotificationReceivedInApp(Context context, String title, String summary, Map<String, String> extraMap, int openType, String openActivity, String openUrl) {
}
@Override
protected void onNotificationRemoved(Context context, String messageId) {
}
}
清单文件中记得注册一下
<receiver android:name=".common.msgcenter.receiver.ALiMessageReceiver"
android:exported="false"> <!-- 为保证receiver安全,建议设置不可导出,如需对其他应用开放可通过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_REMOVED" />
</intent-filter>
<intent-filter>
<action android:name="com.alibaba.sdk.android.push.RECEIVE" />
</intent-filter>
</receiver>
3. 注册使用与调试
3.1 自行抽取配置使用
在Application的onCreate中初始化使用,为了方便管理使用我单独抽取出来
抽取方法 | 说明 | 补充 |
---|---|---|
void init(Context applicationContext) | 初始化 | 调用必须在application中, |
startPush(String ails) startPush(String ails,SetListener listener) | 启动/注册推送(绑定别名方式注册) | listener设置时代表需要注册的结果 |
stopPush(String ails) stopPush(String ails,SetListener listener) | 停止/反注册推送(解绑别名方式) | listener设置时代表需要反注册的结果 |
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;
/**
* Created by SJ on 2020/1/3.
*/
public class ALiMessageUtils {
private static final String TAG = "ALiMessageUtils";
private static ALiMessageUtils aLiMessageUtils;
public static void init(Context applicationContext){
if (aLiMessageUtils != null) {
return;
}
aLiMessageUtils = new ALiMessageUtils(applicationContext);
}
private ALiMessageUtils(Context applicationContext) {
initCloudChannel(applicationContext);
}
/**
* 初始化云推送通道
* @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);
}
});
}
public static void startPush(String ails){
startPush(ails,null);
}
public static void startPush(String ails,SetListener listener){
PushServiceFactory.getCloudPushService().addAlias(ails, new CommonCallback() {
@Override
public void onSuccess(String s) {
if (listener != null) {
listener.onResult(true);
}
}
@Override
public void onFailed(String s, String s1) {
if (listener != null) {
listener.onResult(false);
}
}
});
}
public static void stopPush(String ails){
stopPush(ails,null);
}
public static void stopPush(String ails,SetListener listener){
PushServiceFactory.getCloudPushService().removeAlias(ails, new CommonCallback() {
@Override
public void onSuccess(String s) {
if (listener != null) {
listener.onResult(true);
}
}
@Override
public void onFailed(String s, String s1) {
if (listener != null) {
listener.onResult(false);
}
}
});
}
public interface SetListener{
void onResult(boolean success);
}
}
3.2 官方使用
官方配置文档在这里,可以直接看详细,也可看下方接入
- 初始化
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);
}
});
}
}
3.3 使用辅助
我遇到的问题
- CrashUtils: load sdk file fail:java.io.FileNotFoundException:/data/user/0/xxx.xxx.xxx/files/com_alibaba_aliyun_crash_defend_sdk_info (No such file or directory)
不用处理可以忽略,官方解释在这里
官方警告
- 移动推送的初始化必须在Application中,不能放到Activity中执行。移动推送在初始化过程中将启动后台进程channel,必须保证应用进程和channel进程都执行到推送初始化代码。
- 如果设备成功注册,将回调callback.onSuccess()方法。
- 但如果注册服务器连接失败,则调用callback.onFailed方法,并且自动进行重新注册,直到onSuccess为止。(重试规则会由网络切换等时间自动触发。)
- 请在网络通畅的情况下进行相关的初始化调试,如果网络不通,或者App信息配置错误,在onFailed方法中,会有相应的错误码返回,可参考错误处理。
启动正常确认方法:
- 回调方法callback.onSuccess()被调用。以上文接入代码为例,logcat将会打印以下日志:
11-24 12:55:51.096 15235-15535/com.alibaba.xxxx D/YourApp﹕ init cloudchannel success
- 确认cloudchannel初始化正常,在logcat日志中:输入awcn关键字:
11-24 12:53:51.036 15235-15556/com.alibaba.xxxx E/awcn﹕ |[seq:AWCN1_1] AUTH httpStatusCode: 20011-24 12:53:51.036 15235-15556/com.alibaba.xxxx E/awcn﹕ |[seq:AWCN1_1] status:AUTH_SUCC
- 确认DeviceId获取正常:在初始化成功后使用
cloudPushService.getDeviceId()
获取deviceId,应该能够成功获取。 - 如果集成移动推送的过程中遇到了
utdid
冲突,可参考:阿里云-移动云产品SDK UTDID冲突解决方案
异常