最近因为公司后台服务器买的是阿里云的服务,所以把友盟的推送换成了阿里云推送,首先不得不说,文档写得很差,兼容性和适配做得也不是很好,加了技术支持群,但是里面的同学问一个问题半天才有回复,好了,不扯谈,直接上代码。1.添加依赖:由于公司项目是组件化开发,所以我把推送也单独做成了一个组件,可以独立运行.在项目的统一依赖管理config.gradle添加阿里云推送的依赖和各第三方渠道的依赖,如下图所示:    如有疑问和版本更新,可以去阿里云官网查看,这里就不说这些了![在这里插入图片描述](https://img-blog.csdnimg.cn/84834625b98d42198f68649debefc0f3.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5reh5reh55qE6aaZ54Of,size_20,color_FFFFFF,t_70,g_se,x_16)// 主通道依赖"ali_push"                   : 'com.aliyun.ams:alicloud-android-push:3.4.0',// 辅助通道基础依赖"third_push"                 : 'com.aliyun.ams:alicloud-android-third-push:3.4.0',// 华为依赖"push-huawei"                : 'com.aliyun.ams:alicloud-android-third-push-huawei:3.4.0',// 小米依赖"push-xiaomi"                : 'com.aliyun.ams:alicloud-android-third-push-xiaomi:3.4.0',// OPPO依赖"push-oppo"                  : 'com.aliyun.ams:alicloud-android-third-push-oppo:3.4.0',// vivo依赖"push-vivo"                  : 'com.aliyun.ams:alicloud-android-third-push-vivo:3.4.0',// 魅族依赖"push-meizu"                 : 'com.aliyun.ams:alicloud-android-third-push-meizu:3.4.0',// 谷歌依赖"push-fcm"                   : 'com.aliyun.ams:alicloud-android-third-push-fcm:3.4.0',// 公共依赖库"alicloud-utdid"             : 'com.aliyun.ams:alicloud-android-utdid:2.5.1-proguard',"alicloud-utils"             : 'com.aliyun.ams:alicloud-android-utils:1.1.6.4',"alicloud-ut"                : 'com.aliyun.ams:alicloud-android-ut:5.4.4',"alicloud-beacon"            : 'com.aliyun.ams:alicloud-android-beacon:1.0.5',2.Manifast配置如下:这里的appid和key填上你自己项目的即可.




        3.初始化:推送组件我做成了接口的形式,外部不用相互依赖即可直接调用,调用很方便,代码耦合行也不高,现在的组件化开发就得这样,不用每个模块相互依赖或引用,代码如下:推送基础的接口管理类:IPushActions接口管理类封装了以下方法:初始化、推送开关是否开启、设置别名、设置tag、绑定账号、移除别名、解绑tag、开启推送、关闭推送、解绑账号、查询所有别名、查询所有tag这些主要的方法


public interface IPushActions {

//初始化
void setDebugMode(boolean isDebugMode);//初始化
void initPush(Application application);//推送是否关闭
boolean isPushStopped(Context context);//setAlias 阿里
void setAlias(Context context,String psnCode);//解绑标签
void unBindTag(Context context, int target, String[] tags);//setTags 阿里
void setTags(Context context, String[] tags);//移除别名
void removeAlias(Context context, String alias);void openPush();void closePush();boolean isStopPush(Context context);void stopJPush(Context context);void resumeJPush(Context context);//绑定账号
void bindAccount(Context context,String userId);//解绑账号
void unbindAccount(Context context,String userId);//查询所有tag
void listTags(Context context,int target);//查询所有别名
void listAliases(Context context);

}
4.初始化的代码在Mainapplication中也就一句话,如下图:

5.同学们有没有觉得很方便,因为我基于推送接口类写了一个推送的管理类,在上面设置tag和别名的基础方法之上写了具体初始化和各种绑定解绑逻辑,截图如下:


6.这里的代码只是参考,同志们根据自己的逻辑进行调整,完整代码如下:
package com.powervision.lib_ali_push.manager;

import android.app.Application;
import android.content.Context;

import com.alibaba.sdk.android.push.CloudPushService;
import com.alibaba.sdk.android.push.CommonCallback;
import com.alibaba.sdk.android.push.huawei.HuaWeiRegister;
import com.alibaba.sdk.android.push.noonesdk.PushServiceFactory;
import com.alibaba.sdk.android.push.register.GcmRegister;
import com.alibaba.sdk.android.push.register.MeizuRegister;
import com.alibaba.sdk.android.push.register.MiPushRegister;
import com.alibaba.sdk.android.push.register.OppoRegister;
import com.alibaba.sdk.android.push.register.VivoRegister;
import com.blankj.utilcode.util.AppUtils;
import com.google.firebase.FirebaseApp;
import com.google.firebase.FirebaseOptions;
import com.powervision.lib_ali_push.component.MyMessageIntentService;
import com.powervision.lib_common.contants.AppUseConstant;
import com.powervision.lib_common.utils.LogUtils;
import com.powervision.lib_push.IPushActions;
import com.powervision.pvcamera.lib_alipush.BuildConfig;

import java.util.Arrays;
import java.util.List;

/**

  • @auth: njb

  • @date: 2021/8/6 9:57

  • @desc: 描述
    */
    public class AliPushManager implements IPushActions {

    private static AliPushManager mPushManager;
    private String TAG = “AliPushManager”;
    CloudPushService pushService;
    private FirebaseApp firebaseApp;

    private AliPushManager() {

    }

    public static AliPushManager getInstance() {
    if (mPushManager == null) {
    mPushManager = new AliPushManager();
    }
    return mPushManager;
    }

    @Override
    public void setDebugMode(boolean isDebugMode) {
    if (pushService != null) {
    //调试是否打开
    pushService.setDebug(isDebugMode);
    //设置日志级别
    pushService.setLogLevel(CloudPushService.LOG_DEBUG);
    }
    }

    @Override
    public void initPush(final Application application) {
    pushService = PushServiceFactory.getCloudPushService();
    pushService.setPushIntentService(MyMessageIntentService.class);
    pushService.register(application, new CommonCallback() {
    @Override
    public void onSuccess(String response) {
    LogUtils.d(TAG, “init cloudchannel success”);
    AliPushManager.getInstance().setAlias(application, PushTagUtils.getDeviceId());
    AliPushManager.getInstance().setTags(application, PushTagUtils.getTag());
    }

         @Overridepublic void onFailed(String errorCode, String errorMessage) {LogUtils.d(TAG, "init cloudchannel failed -- errorcode:" + errorCode + " -- errorMessage:" + errorMessage);}});//初始化辅助渠道推送initThirdPush(application);AliPushManager.getInstance().setDebugMode(BuildConfig.DEBUG);setPushService(pushService);
    

    }

    private void initThirdPush(Application application) {
    // 初始化小米辅助推送
    MiPushRegister.register(application, AppUseConstant.XIAOMI_APP_ID, AppUseConstant.XIAOMI_APP_KEY);
    // 接入华为辅助推送
    HuaWeiRegister.register(application);
    // 接入ViVo初始化推送
    VivoRegister.register(application);
    // 接入Opp)初始化推送
    OppoRegister.register(application, AppUseConstant.OPPO_APP_KEY, AppUseConstant.OPPO_APP_Secret);
    // 接入MeiZu初始化推送
    MeizuRegister.register(application, “MEIZU_ID”, “MEIZU_KEY”);
    // 接入FCM/GCM初始化推送
    GcmRegister.register(application, AppUseConstant.GCM_SEND_ID, AppUseConstant.GOOGLE_APP_ID);
    //注册FireBase
    initFireBaseApp(application);

    }

    private void initFireBaseApp(Application application) {
    FirebaseOptions options = new FirebaseOptions.Builder()
    .setApplicationId(AppUseConstant.GOOGLE_APP_ID)
    .setGcmSenderId(AppUseConstant.GCM_SEND_ID)
    .setApiKey(AppUseConstant.GOOGLE_API_KEY).build();
    boolean hasBeenInitialized = false;
    List firebaseApps = FirebaseApp.getApps(application);
    for (FirebaseApp app : firebaseApps) {
    if (app.getName().equals(FirebaseApp.DEFAULT_APP_NAME)) {
    hasBeenInitialized = true;
    firebaseApp = app;
    }
    }
    //判断是否注册
    if (!hasBeenInitialized) {
    firebaseApp = FirebaseApp.initializeApp(application, options, AppUtils.getAppName());
    }
    }

    public void setPushService(CloudPushService pushService) {
    this.pushService = pushService;
    }

    public CloudPushService getPushService() {
    return pushService;
    }

    @Override
    public boolean isPushStopped(Context context) {
    return false;
    }

    @Override
    public void setAlias(final Context context, final String alias) {
    if (pushService != null) {
    pushService.addAlias(alias, new CommonCallback() {
    @Override
    public void onSuccess(String s) {
    LogUtils.d(TAG, alias + " success 别名绑定成功");
    }

             @Overridepublic void onFailed(String errorCode, String errorMsg) {LogUtils.d(TAG, alias + " failed." + "errorCode: " + errorCode + ", errorMsg:" + errorMsg + "\n");}});}
    

    }

    @Override
    public void unBindTag(final Context context, final int target, final String[] tags) {
    if (pushService != null) {
    pushService.unbindTag(target, tags, null, new CommonCallback() {
    @Override
    public void onSuccess(String response) {
    LogUtils.d(TAG, “success tag解绑成功” + tags);
    AliPushManager.getInstance().setTags(context, PushTagUtils.getTag());
    }

             @Overridepublic void onFailed(String errorCode, String errorMsg) {LogUtils.d(TAG, " failed." + "errorCode: " + errorCode + ", errorMsg:" + errorMsg + "\n");}});}
    

    }

    @Override
    public void setTags(Context context, final String[] tags) {
    if (pushService != null) {
    pushService.bindTag(CloudPushService.DEVICE_TARGET, tags, “”, new CommonCallback() {
    @Override
    public void onSuccess(String s) {
    LogUtils.d(TAG, " success 标签绑定成功" + Arrays.toString(tags));

             }@Overridepublic void onFailed(String errorCode, String errorMsg) {LogUtils.d(TAG, tags + " failed." + "errorCode: " + errorCode + ", errorMsg:" + errorMsg + "\n");}});}
    

    }

    @Override
    public void removeAlias(final Context context, final String alias) {
    if (pushService != null) {
    pushService.removeAlias(alias, new CommonCallback() {
    @Override
    public void onSuccess(String response) {
    LogUtils.d(TAG, alias + " success 别名解绑成功");
    LogUtils.d(TAG, AppUseConstant.ALIAS + " --解绑前的别名—");
    if (!AppUseConstant.isUnBind) {
    AppUseConstant.ALIAS = PushTagUtils.getDeviceId();
    LogUtils.d(TAG, AppUseConstant.ALIAS + " --解绑后的别名—");
    AliPushManager.getInstance().setAlias(context, AppUseConstant.ALIAS);
    }
    }

             @Overridepublic void onFailed(String errorCode, String errorMsg) {LogUtils.d(TAG, " failed." + "errorCode: " + errorCode + ", errorMsg:" + errorMsg);}});}
    

    }

    @Override
    public void openPush() {
    if (pushService != null) {
    pushService.turnOnPushChannel(new CommonCallback() {
    @Override
    public void onSuccess(String s) {
    com.blankj.utilcode.util.LogUtils.d(“turn on push channel success”);
    }

             @Overridepublic void onFailed(String errorCode, String errorMsg) {com.blankj.utilcode.util.LogUtils.d("turn on push channel failed." + "errorCode: " + errorCode + ", errorMsg:" + errorMsg + "\n");}});}
    

    }

    @Override
    public void closePush() {
    if (pushService != null) {
    pushService.turnOffPushChannel(new CommonCallback() {
    @Override
    public void onSuccess(String s) {
    com.blankj.utilcode.util.LogUtils.d(“turn off push channel success”);
    }

             @Overridepublic void onFailed(String errorCode, String errorMsg) {com.blankj.utilcode.util.LogUtils.d("turn off push channel failed." + "errorCode: " + errorCode + ", errorMsg:" + errorMsg + "\n");}});}
    

    }

    @Override
    public boolean isStopPush(Context context) {
    return false;
    }

    @Override
    public void stopJPush(Context context) {

    }

    @Override
    public void resumeJPush(Context context) {

    }

    @Override
    public void bindAccount(Context context, String userId) {
    final String account = userId;
    if (pushService != null) {
    pushService.bindAccount(account, new CommonCallback() {
    @Override
    public void onSuccess(String s) {
    LogUtils.d(TAG, account + " 账号绑定成功 success\n");
    }

             @Overridepublic void onFailed(String errorCode, String errorMsg) {LogUtils.d(TAG, account + " failed." + "errorCode: " + errorCode + ", errorMsg:" + errorMsg);}});}
    

    }

    @Override
    public void unbindAccount(Context context, final String account) {
    if (pushService != null) {
    pushService.bindAccount(account, new CommonCallback() {
    @Override
    public void onSuccess(String s) {
    LogUtils.d(TAG, s + “unbind account success 解绑账号成功”);
    }

             @Overridepublic void onFailed(String errorCode, String errorMsg) {LogUtils.d(TAG, "bind account failed." + "errorCode: " + errorCode + ", errorMsg:" + errorMsg + "\n");}});}
    

    }

    @Override
    public void listTags(final Context context, final int target) {
    if (pushService != null) {
    pushService.listTags(target, new CommonCallback() {
    @Override
    public void onSuccess(String response) {
    LogUtils.d(TAG, response + " success 查询标签成功");
    if (response.contains(Arrays.toString(PushTagUtils.getTag()))) {
    AliPushManager.getInstance().unBindTag(context, CloudPushService.DEVICE_TARGET, PushTagUtils.getTag());
    } else {
    bindTag(context, PushTagUtils.getTag());
    }
    }

             @Overridepublic void onFailed(String errorCode, String errorMsg) {LogUtils.d(TAG, " failed." + "errorCode: " + errorCode + ", errorMsg:" + errorMsg);}});}
    

    }

    private void bindAlias(Context context, String alias) {
    LogUtils.d(TAG, alias);
    if (alias.isEmpty()) {
    return;
    }
    AliPushManager.getInstance().setAlias(context, alias);
    }

    private void bindTag(Context context, String[] tags) {
    AliPushManager.getInstance().setTags(context, tags);
    //LogUtils.d(TAG, String.valueOf(tags));
    }

    @Override
    public void listAliases(final Context context) {
    if (pushService != null) {
    pushService.listAliases(new CommonCallback() {
    @Override
    public void onSuccess(String response) {
    LogUtils.d(TAG, response + " success 别名查询成功");
    }

             @Overridepublic void onFailed(String errorCode, String errorMsg) {LogUtils.d(TAG, " failed." + "errorCode: " + errorCode + ", errorMsg:" + errorMsg);}});}
    

    }
    }

7.遇到的问题:
a.初始化的时候一定要在隐私协议同意之后进行,相信集成友盟和sharesdk等第三方的同学一定会遇到这个问题,这里分两步,1是与初始化,这个方法不会获取设备信息,不用请求权限,2是需要在用户同意隐私协议之后初始化的方法,当然阿里云官网也给出了说明,说明如下:

b.阿里云推送和第三方辅助渠道在初始化时一定要在主线程中进行,不然会出现App在后台或者被杀死收到通知,但是进程没有拉起来的情况,代码如下:

判断是否为主进程的方法如下:

/**
* 当前进程是否为主进程
*
* @return True-是 False-否
*/
private boolean isMainProcess() {
// 获取当前包名
String packageName = this.getPackageName();
// 获取当前进程名
String processName = getProcessName(android.os.Process.myPid());
return processName == null || processName.equals(packageName);
}
c.在初始化第三方辅助渠道的时候,一定要仔细看文档,检查各个应用市场的key,因为这些配置关系到App退到后台和被杀死的情况下推送问题。这里特别说明一下!!!Oppo辅助渠道初始化的时候第三个参数不是appkey,也不是appid,而是appsecret,这里本同学刚开始也是填写错误,导致oppo手机一直注册失败,找了半天文档和资料才发现问题,所以接第三方一定要仔细,把文档和步骤看懂在开始写代码,要不然上来咔咔一顿操作猛于虎,但是发现出问题就蒙蔽了,完全找不到原因.


d.google的fcm推送国内由于用不了的原因,测试的时候一定要开启vpn,要不然会导致开启google服务失败而收不到离线通知。fcm初始化也要注意重复初始化的问题,如下图:

e.各大第三方辅助通道初始化成功的截图如下:
google gcm:

huawei:

xiaomi:

Oppo:

Vivo:

如果没有获取到上面的token,请仔细检查各种配置:
1.阿里云的推送后台:这里需要注意的是Oppo填写的第2个可以是MasterSecret,而不是appsecret,很多同学不注意也会填错,这个去oppo开放平台获取你本应用的就好.
2.华为的配置:
https://help.aliyun.com/document_detail/190012.html
!!! 这里需要注意的是华为需要开通消息回执和配置SHA256证书指纹,要不然会一直提示初始化失败,本同学刚开始没有配置指纹证书,导致注册时一直获取不到华为推送渠道注册成功的token.

今天由于时间原因先到这里,后面会给出小米、oppo、vivo、gcm的具体配置和问题,目前各大平台的离线推送都很及时,当然,这里和我们公司付费有一定关系,还有提示用户打开各种通知权限,后面也会讲解.

Android阿里云推送离线通知集成踩坑之路相关推荐

  1. Android 阿里云推送,针对安卓8.0、9.0以上系统收不到推送 的补丁文档

    官方的文档地址: Android 8.0以上: https://help.aliyun.com/knowledge_detail/67398.html Android 9.0以上: https://h ...

  2. Android集成阿里云推送功能

    官方集成参考网址:https://help.aliyun.com/document_detail/51056.html?spm=a2c4g.11186623.6.587.64ed7fa8NY9DN8 ...

  3. ionic集成阿里云推送

    阿里云推送是比较廉价,快速的推送管理平台,目前在ionic上有一个插件可以直接使用它,不需要官网介绍的那些复杂步骤.插件地址:https://github.com/llwwbb/cordova-plu ...

  4. 阿里云服务器 搭建单体redis 以及踩坑

    在搭建阿里云服务器的过程中,踩坑很多,特写此文: 简介 Redis是一个开源(BSD许可),内存数据结构存储,用作数据库,缓存和消息代理.它支持数据结构,如字符串,散列,列表,集合,带有范围查询的排序 ...

  5. 阿里云天池【Docker练习场】踩坑指南

    阿里云天池[Docker练习场]踩坑指南 题目直达 提交环境搭建(基于macOS) Docker的安装与基本功能使用 Docker安装过程遇到的小问题 提交结果注意事项 提交时的镜像配置 项目结构规范 ...

  6. 阿里云推送 AndroidSDK 3.0 快速集成

    文章目录 0.控制台中配置好产品应用 1. 基础接入配置使用 1.1配置根目录的 build.gradle文件 1.2配置要接入module的build.gradle文件 1.3配置清单文件 2. 接 ...

  7. 百度云推送自定义通知行为

    百度云推送自定义行为(Android) 最近用公司的项目用到了百度云推送,总的来说百度云推送还是蛮好用的. 官方的文档地址:http://push.baidu.com/doc/guide/faq_an ...

  8. Android百度云推送接入,附完整代码

    1.创建应用获取api_key 百度云推送:http://push.baidu.com/ SDK下载:http://push.baidu.com/sdk/push_client_sdk_for_and ...

  9. Android开发之推送服务(二) 集成小米推送

    小米推送主要是用来适配小米手机的.所以,在做的时候,一般会判断当前手机是否是小米手机,如果是小米手机,则去使用小米推送,注册小米推送,如果不是,则默认使用Umeng推送. 在集成小米推送之前,需要先注 ...

  10. Android开发之推送服务(三) 集成Oppo和vivo推送

    Oppo推送服务,也是在Oppo手机中使用的比较多.而且现在Oppo和Vivo两款手机最早提出美颜功能,所以这两款手机在市场上的占有率还是比较高的. Oppo推送目前已经开发注册,Vivo目前只对部分 ...

最新文章

  1. python文件读写_python文件操作-读写删除复制总结
  2. buu password
  3. gettype拿不到值_被玩家强行改位置的5个英雄,他上单无解,杀吕布灭铠爹,这都拿去辅助?...
  4. 12_Android中HttpClient的应用,doGet,doPost,doHttpClientGet,doHttpClient请求,另外借助第三方框架实现网络连接的应用,
  5. install pyinstaller
  6. java显示时间_Java如何显示日期和时间?
  7. 疯狂java的第四章答案_疯狂java讲义第四章第一题
  8. java密码模块怎么做_密码模块设计
  9. 玩转Web之servlet(一)---怎样创建一个servlet
  10. Python快速构建神经网络
  11. 方言 —— 各地方言
  12. Oracle提供的自治事务记录日志的方法
  13. 看了这份《算法中文手册》笔记,就再也不怕字节了~
  14. iPhone UI 元素大小
  15. Keras搭建M2Det目标检测平台(转载)
  16. SPSS数据处理-数据整理
  17. PHP集成开发环境介绍
  18. 触发onblur事件alert死循环问题
  19. 鬼迷心窍 歌词翻译 中译日
  20. 蓝宝石(Al2O3)晶体基片

热门文章

  1. 联创宽带上网助手协议的简单分析(三):密码包的构造过程
  2. 如何在IBM SPSS Statistics中进行K均值聚类分析
  3. 急救护理虚拟仿真实验室
  4. html中有序列表的css样式,CSS 列表样式(ul)
  5. 基于SSH的客户关系管理系统
  6. Python 3 网络爬虫 个人笔记 (未完待续)
  7. matlab计算abc三相短路电流_电工都知道三相电动机按一千瓦两个电流计算 却不会计算公式...
  8. 移动周刊第 176 期:Android 知识梳理
  9. NABCD模型--软件工程
  10. MUI框架学习——了解MUI