美文网首页
4-2.3 阿里云推送 AndroidSDK 3.0 快速集成

4-2.3 阿里云推送 AndroidSDK 3.0 快速集成

作者: Shimmer_ | 来源:发表于2020-01-07 11:09 被阅读0次

[TOC]

阿里云推送 AndroidSDK 3.0 快速集成

快速集成官方文档在这里,这里只关心在Android接入时的必要步骤与相关配置,满足快速接入并调试使用

阿里推送内容清单.png

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) 通知接收回调<br />context 上下文环境<br />title 通知标题<br />summary 通知内容<br /> extraMap 通知额外参数,包括部分系统自带参数: _ALIYUN_NOTIFICATION_ID_(V2.3.5及以上):创建通知对应id; _ALIYUN_NOTIFICATION_PRIORITY_(V2.3.5及以上):创建通知对应id。默认不带,需要通过OpenApi设置 客户端接收到通知后,回调该方法<br />可获取到并处理通知相关的参数
void onMessage(Context context, CPushMessage cPushMessage) 消息接收回调<br />context 上下文环境 <br />message CPushMessage类型,可以获取消息Id、消息标题和内容 用于接收服务端推送的消息 <br /> 消息不会弹窗,而是回调该方法
onNotificationOpened(Context context, String title, String summary, String extraMap) 通知打开回调<br />参数同通知接收回调 打开通知时会回调该方法,通知打开上报由SDK自动完成
onNotificationClickedWithNoAction(Context context, String title, String summary, String extraMap) 无跳转逻辑通知打开回调<br />参数同通知接收回调
onNotificationReceivedInApp(Context context, String title, String summary, Map<String, String> extraMap, int openType, String openActivity, String openUrl) 通知在应用内到达回调<br />参数同通知接收回调, openType 原本通知打开方式,1:打开APP;2:打开activity;3:打开URL;4:无跳转逻辑 当用户创建自定义通知样式,并且设置推送应用内到达不创建通知弹窗时调用该回调,且此时不调用onNotification回调(v2.3.3及以上版本支持)
onNotificationRemoved(Context context, String messageId) 通知删除回调<br />context 上下文环境<br />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)<br />startPush(String ails,SetListener listener) 启动/注册推送(绑定别名方式注册) listener设置时代表需要注册的结果
stopPush(String ails)<br />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

异常

相关文章

网友评论

      本文标题:4-2.3 阿里云推送 AndroidSDK 3.0 快速集成

      本文链接:https://www.haomeiwen.com/subject/ghrractx.html