4-2.3 阿里云推送 AndroidSDK 3.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

异常

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容