当前位置: 代码迷 >> 综合 >> 阿里云推送 AndroidSDK 3.0 快速集成
  详细解决方案

阿里云推送 AndroidSDK 3.0 快速集成

热度:17   发布时间:2024-01-24 17:50:31.0

文章目录

        • 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