文章目录
- 0.控制台中配置好产品应用
- 1.1配置根目录的 build.gradle文件
- 1.2配置要接入module的build.gradle文件
- 1.3配置清单文件
- 2. 接收消息配置--Receiver
- 2.1 Recevier方法简析
- 3. 注册使用与调试
- 3.1 自行抽取配置使用
- 3.2 官方使用
- 3.3 使用辅助
快速集成官方文档在这里,这里只关心在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设置 |
客户端接收到通知后,回调该方法 可获取到并处理通知相关的参数 |
_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_TAGpublic static final String REC_TAG = "receiver";@Overridepublic void onNotification(Context context, String title, String summary, Map<String, String> extraMap) {}@Overridepublic void onMessage(Context context, CPushMessage cPushMessage) {}@Overridepublic void onNotificationOpened(Context context, String title, String summary, String extraMap) {}@Overrideprotected void onNotificationClickedWithNoAction(Context context, String title, String summary, String extraMap) {}@Overrideprotected void onNotificationReceivedInApp(Context context, String title, String summary, Map<String, String> extraMap, int openType, String openActivity, String openUrl) {}@Overrideprotected 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() {@Overridepublic void onSuccess(String response) {Log.d(TAG, "init cloudchannel success");}@Overridepublic 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() {@Overridepublic void onSuccess(String s) {if (listener != null) {listener.onResult(true);}}@Overridepublic 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() {@Overridepublic void onSuccess(String s) {if (listener != null) {listener.onResult(true);}}@Overridepublic 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";@Overridepublic 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() {@Overridepublic void onSuccess(String response) {Log.d(TAG, "init cloudchannel success");}@Overridepublic 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冲突解决方案
异常
- 移动推送 Android : Android 8.0 以上设备通知接收不到?
- 移动推送 Android : 只在 Android 9+ 系统报错 errorCode:10109