极光推送集成华为遇到的坑?

一、前言:

首先极光推送对各个厂商通道对接是没有在开发者平台提供文档的,需要申请VIP资格后,极光才会提供对应对接文档。

1、极光普通集成

1、步骤1


图片.png

2、步骤2


图片.png

3、步骤3


图片.png

4、步骤4
图片.png

5、步骤5

图片.png

注意:下载集成的SDK,导入到项目中。
6、权限

 
    

    
    
    
    
    
    
    
    
    
    

    
    
     
    
    
    
    
    
    
    




        

        
        
        
        
        
        
        
            
                
            
        
        
        
        
        
        
            
                
                
            
        

7、PushService

public class PushService extends JCommonService {

}

8、PushMessageReceiver

public class PushMessageReceiver extends JPushMessageReceiver {
    private static final String TAG = "PushMessageReceiver";

    @Override
    public void onMessage(Context context, CustomMessage customMessage) {
        Log.e(TAG, "[onMessage] " + customMessage);
        Intent intent = new Intent("com.jiguang.demo.message");
        intent.putExtra("msg", customMessage.message);
        context.sendBroadcast(intent);
    }

    @Override
    public void onNotifyMessageOpened(Context context, NotificationMessage message) {
        Log.e(TAG, "[onNotifyMessageOpened] " + message);
        try{
                //打开自定义的Activity
                Intent intent = new Intent(context, StartActivity.class);
                Bundle bundle = new Bundle();
                bundle.putString(JPushInterface.EXTRA_NOTIFICATION_TITLE,message.notificationTitle);
                bundle.putString(JPushInterface.EXTRA_ALERT,message.notificationContent);
                intent.putExtras(bundle);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP );
                context.startActivity(intent);
        
        }catch (Throwable throwable){
             throwable.fillInStackTrace();
        }
    }

    @Override
    public void onMultiActionClicked(Context context, Intent intent) {
        Log.e(TAG, "[onMultiActionClicked] 用户点击了通知栏按钮");
        String nActionExtra = intent.getExtras().getString(JPushInterface.EXTRA_NOTIFICATION_ACTION_EXTRA);

        //开发者根据不同 Action 携带的 extra 字段来分配不同的动作。
        if (nActionExtra == null) {
            Log.d(TAG, "ACTION_NOTIFICATION_CLICK_ACTION nActionExtra is null");
            return;
        }
        if (nActionExtra.equals("my_extra1")) {
            Log.e(TAG, "[onMultiActionClicked] 用户点击通知栏按钮一");
        } else if (nActionExtra.equals("my_extra2")) {
            Log.e(TAG, "[onMultiActionClicked] 用户点击通知栏按钮二");
        } else if (nActionExtra.equals("my_extra3")) {
            Log.e(TAG, "[onMultiActionClicked] 用户点击通知栏按钮三");
        } else {
            Log.e(TAG, "[onMultiActionClicked] 用户点击通知栏按钮未定义");
        }
    }

    @Override
    public void onNotifyMessageArrived(Context context, NotificationMessage message) {
        //1、不用点击,直接收到
        Log.e(TAG, "[onNotifyMessageArrived] " + message);
    }

    @Override
    public void onNotifyMessageDismiss(Context context, NotificationMessage message) {
        Log.e(TAG, "[onNotifyMessageDismiss] " + message);
    }

    @Override
    public void onRegister(Context context, String registrationId) {
        Log.e(TAG, "[onRegister] " + registrationId);
        Intent intent = new Intent("com.jiguang.demo.register");
        context.sendBroadcast(intent);
    }

    @Override
    public void onConnected(Context context, boolean isConnected) {
        Log.e(TAG, "[onConnected] " + isConnected);
    }

    @Override
    public void onCommandResult(Context context, CmdMessage cmdMessage) {
        Log.e(TAG, "[onCommandResult] " + cmdMessage);
    }

    @Override
    public void onTagOperatorResult(Context context, JPushMessage jPushMessage) {
        //TagAliasOperatorHelper.getInstance().onTagOperatorResult(context,jPushMessage);
        super.onTagOperatorResult(context, jPushMessage);
    }

    @Override
    public void onCheckTagOperatorResult(Context context, JPushMessage jPushMessage) {
       // TagAliasOperatorHelper.getInstance().onCheckTagOperatorResult(context,jPushMessage);
        super.onCheckTagOperatorResult(context, jPushMessage);
    }

    @Override
    public void onAliasOperatorResult(Context context, JPushMessage jPushMessage) {
        //TagAliasOperatorHelper.getInstance().onAliasOperatorResult(context,jPushMessage);
        super.onAliasOperatorResult(context, jPushMessage);
    }

    @Override
    public void onMobileNumberOperatorResult(Context context, JPushMessage jPushMessage) {
        //TagAliasOperatorHelper.getInstance().onMobileNumberOperatorResult(context,jPushMessage);
        super.onMobileNumberOperatorResult(context, jPushMessage);
    }

    @Override
    public void onNotificationSettingsCheck(Context context, boolean isOn, int source) {
        super.onNotificationSettingsCheck(context, isOn, source);
        Log.e(TAG, "[onNotificationSettingsCheck] isOn:" + isOn + ",source:" + source);
    }

}

二、其它厂商集成:

1、小米通道对接:

1.在小米开发者平台申请对应推送账号 appId key 等

2 增加小米插件包及小米推送包

3 配置小米推送sdk所需要的权限

4 配置小米必须的组件

5 配置JPush接受的小米sdk的消息接受类

6 将XIAOMI_APPKEY与XIAOMI_APPID替换为在小米后台注册对应该应用的AppKey/AppID

2、华为通道对接:

1添加 Huawei SDK 到项目中
2 配置接收 HMS 消息的广播接收器
3 在build.gradle中配置在华为后台添加的指纹证书对应的签名

三、华为厂商集成:

1、添加 Huawei SDK 到项目中

  • 拷贝third-push/huawei/libs中的插件包(jpush-android-plugin-huawei-v3.x.x.jar)到工程libs目录下

    • 注意:也可使用jcenter集成方式,无需拷贝jpush-android-plugin-huawei-v3.x.x.jar文件,也无需配置cn.jpush.android.service.PluginHuaweiPlatformsService组件

    • 示例:implementation 'cn.jiguang.sdk.plugin:huawei:3.x.x'

      • 在 Huawei 上创建和 JPush 上同包名的待发布应用,创建完成后下载该应用的 agconnect-services.json 配置文件并添加到应用的 module 目录下。
    • 1、在根级 build.gradle 中添加规则,以纳入 HMS 服务插件 和 华为 的 Maven 代码库,可根据华为开发者联盟发布的版本更新选择最新版本:

 buildscript{
        repositories {
            google()
            jcenter()
           // hms
           maven { url 'http://developer.huawei.com/repo/'}
        }
    }
   buildscript {
       dependencies {
         // hms
        classpath 'com.huawei.agconnect:agcp:1.4.1.300'
       }
   }
  
    allprojects {
        repositories {
            google()
            jcenter()
           // hms
           maven { url 'http://developer.huawei.com/repo/'}
        }
    }
  • 2、在应用 module 的 build.gradle 文件底部添加 apply plugin 代码行,以启用 gradle 插件:
   apply plugin: 'com.huawei.agconnect'
  • 3、在应用 module 的 gradle 中 dependencies 节点添加如下代码,可根据 华为 发布的版本更新选择最新版本:
 dependencies {
       implementation 'com.huawei.hms:push:4.0.2.300'
       //引入极光-华为插件,如果采用此配置,无需拷贝jpush-android-plugin-huawei-v3.x.x.jar文件,也无需配置cn.jpush.android.service.PluginHuaweiPlatformsService组件
      //引入SDK重复了,可以注释调
     implementation 'cn.jiguang.sdk.plugin:huawei:4.0.0' 
        
    }

1.下面注意:签名的SHA256的内容配置到华为应用市场的app项目中

注:指纹证书是在终端采用keytool -list -v -keystore keystorefileName 获取偶对应的指纹证书.获取结果如下:

图片.png

这是华为应用市场的页面

图片.png

2.记得必须要签名后的包

 signingConfigs {
        release {
            storeFile file("release.keystore")//签名文件的path
            storePassword "123456"
            keyAlias "android.keystore"
            keyPassword "123456"
        }
    }

    buildTypes {
        release {
            minifyEnabled true
            proguardFiles 'proguard-rules.pro'
            signingConfig signingConfigs.release
        }
        debug{
            minifyEnabled false
            signingConfig signingConfigs.release
        }
    }

3.下面是在华为推送平台去创建账号 信息以及config文件,华为开发者地址
https://developer.huawei.com/consumer/cn/service/josp/agc/index.html?cid=1&tid=13&id=9249519184595935890#/myApp/103194983/9249519184596012000

4.在我的项目中获取当前需要添加配置的参数

图片.png

5.添加刚刚生成的sha256

图片.png

6.注意:拷贝你获取的参数 ,下载 agconnect-services.json

讲下载的agconnect-services.json 放在主项目目录下:


图片.png

7.根据配置运行查看log 是否配置成功

图片.png

注意:发现自己的log跟别人不一样

8.打开华为开发者平台,开通推送服务

图片.png
图片.png

可以测试推送了,查看日志:

图片.png

3、此时如果像上图那样 就表示成功了,但应该不会成功,嘿嘿,接下来 有两个坑点:

1、极光推送平台需要配置你各推送平台申请的key ,但文档并没有说明:
图片.png
2、对上面添加的agconnect-services.json 虽然放在主工程目录下了,并不一定能读取成功,这时候你还需要添加配置防止解析不到agconnect-services.json 导致初始化失败:
       
       

其他通道类似小米一样根据VIP文档依次复制就行了,最终厂商通道点击通知activity 跳转都会进入:OpenClickActivity

---------------------------------------是极光推送生成的文档--------------------------------

三、极光选择小米和华为厂商生成的文档:

一、添加工程配置

1、Project 根目录的主 gradle

确认 android studio 的 Project 根目录的主 gradle 中配置了 mavenCentral 支持(新建 project 默认配置就支持),配置华为和 FCM Maven 代码库,,可根据华为和 FCM 发布的版本更新选择最新版本:

    buildscript {
            repositories {
                google()
                jcenter()
                mavenCentral()
                // hms
                maven { url 'http://developer.huawei.com/repo/'}
                // fcm
                maven { url "https://maven.google.com" }
              }

             dependencies {
                // fcm
                classpath 'com.google.gms:google-services:4.3.4'
                // hms
                classpath 'com.huawei.agconnect:agcp:1.4.1.300'
             }
         }

        allprojects {
              repositories {
                google()
                jcenter()
                mavenCentral()
                //hms
                maven {url 'http://developer.huawei.com/repo/'}
                //fcm
                maven { url "https://maven.google.com" }
              }
          }

2、module 的 gradle配置

在 module 的 gradle 中添加依赖和 AndroidManifest 的替换变量,集成极光推送SDK和厂商通道SDK,其中厂商组合选择所需的通道即可。

        android {
                ......
                defaultConfig {
                    applicationId "com.xxx.xxx" //JPush 上注册的包名.
                    ......

                    ndk {
                        //选择要添加的对应 cpu 类型的 .so 库。
                        abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a'
                        // 还可以添加 'x86', 'x86_64', 'mips', 'mips64'
                    }

                    manifestPlaceholders = [
                        JPUSH_PKGNAME : applicationId,
                        JPUSH_APPKEY : "你的 Appkey ", //JPush 上注册的包名对应的 Appkey.
                        JPUSH_CHANNEL : "developer-default", //暂时填写默认值即可.
                        MEIZU_APPKEY : "MZ-魅族的APPKEY",
                        MEIZU_APPID : "MZ-魅族的APPID",
                        XIAOMI_APPID : "MI-小米的APPID",
                        XIAOMI_APPKEY : "MI-小米的APPKEY",
                        OPPO_APPKEY : "OP-oppo的APPKEY",
                        OPPO_APPID : "OP-oppo的APPID",
                        OPPO_APPSECRET : "OP-oppo的APPSECRET",
                        VIVO_APPKEY : "vivo的APPKEY",
                        VIVO_APPID : "vivo的APPID"
                    ]
                    ......
                }
                ......
            }

            dependencies {
                ......

                implementation 'cn.jiguang.sdk:jcore:2.7.2'  // 此处以JCore 2.7.2 版本为例。
                implementation 'cn.jiguang.sdk:jpush:4.0.0'  // 此处以JPush 4.0.0 版本为例
                // 接入华为厂商
                implementation 'com.huawei.hms:push:4.0.2.300'
                implementation 'cn.jiguang.sdk.plugin:huawei:4.0.0'// 极光厂商插件版本与接入 JPush 版本保持一致,下同
                // 接入 FCM 厂商
                implementation 'com.google.firebase:firebase-messaging:21.0.1'
                implementation 'cn.jiguang.sdk.plugin:fcm:4.0.0'
                // 接入魅族厂商
                implementation 'cn.jiguang.sdk.plugin:meizu:4.0.0'
                // 接入 VIVO 厂商
                implementation 'cn.jiguang.sdk.plugin:vivo:4.0.0' 
                // 接入 OPPO 厂商
                implementation 'cn.jiguang.sdk.plugin:oppo:4.0.0' 
                // 接入小米厂商
                implementation 'cn.jiguang.sdk.plugin:xiaomi:4.0.0' 
                ......
            }

            apply plugin: 'com.google.gms.google-services'
            apply plugin: 'com.huawei.agconnect'

3、应用 Module 配置

如果选择的厂商通道包含了HUAWEI厂商通道和FCM厂商通道,则需要额外执行以下操作,若未选择可忽略本步骤。

FCM:在 Firebase 上创建和 JPush 上同包名的待发布应用,创建完成后下载该应用的 google-services.json 配置文件并添加到应用的 module 目录下。

HUAWEI:在 Huawei 上创建和 JPush 上同包名的待发布应用,创建完成后下载该应用的 agconnect-services.json 配置文件并添加到应用的 module 目录下。

二 、配置推送必须组件

在 AndroidManifest 中配置一个Service,以在更多手机平台上获得更稳定的支持,示例如下:

     
        
        
        
                
                    
                
            
//PushService 类
public class PushService extends JCommonService {

}

从JPush3.0.7开始,需要配置继承JPushMessageReceiver的广播,原来如果配了MyReceiver现在可以弃用。示例如下。

     
        
        
        
        
            
                    
                    
            
        
// PushMessageReceiver类
public class PushMessageReceiver extends JPushMessageReceiver {
    private static final String TAG = "PushMessageReceiver";

    @Override
    public void onMessage(Context context, CustomMessage customMessage) {
        Log.e(TAG, "[onMessage] " + customMessage);
        Intent intent = new Intent("com.jiguang.demo.message");
        intent.putExtra("msg", customMessage.message);
        context.sendBroadcast(intent);
    }

    @Override
    public void onNotifyMessageOpened(Context context, NotificationMessage message) {
        Log.e(TAG, "[onNotifyMessageOpened] " + message);
        try{
            //打开自定义的Activity
            Intent i = new Intent(context, StartActivity.class);
            Bundle bundle = new Bundle();
            bundle.putString(JPushInterface.EXTRA_NOTIFICATION_TITLE,message.notificationTitle);
            bundle.putString(JPushInterface.EXTRA_ALERT,message.notificationContent);
            i.putExtras(bundle);
            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP );
            context.startActivity(i);
        }catch (Throwable throwable){

        }
    }

    @Override
    public void onMultiActionClicked(Context context, Intent intent) {
        Log.e(TAG, "[onMultiActionClicked] 用户点击了通知栏按钮");
        String nActionExtra = intent.getExtras().getString(JPushInterface.EXTRA_NOTIFICATION_ACTION_EXTRA);

        //开发者根据不同 Action 携带的 extra 字段来分配不同的动作。
        if (nActionExtra == null) {
            Log.d(TAG, "ACTION_NOTIFICATION_CLICK_ACTION nActionExtra is null");
            return;
        }
        if (nActionExtra.equals("my_extra1")) {
            Log.e(TAG, "[onMultiActionClicked] 用户点击通知栏按钮一");
        } else if (nActionExtra.equals("my_extra2")) {
            Log.e(TAG, "[onMultiActionClicked] 用户点击通知栏按钮二");
        } else if (nActionExtra.equals("my_extra3")) {
            Log.e(TAG, "[onMultiActionClicked] 用户点击通知栏按钮三");
        } else {
            Log.e(TAG, "[onMultiActionClicked] 用户点击通知栏按钮未定义");
        }
    }

    @Override
    public void onNotifyMessageArrived(Context context, NotificationMessage message) {
        Log.e(TAG, "[onNotifyMessageArrived] " + message);
    }

    @Override
    public void onNotifyMessageDismiss(Context context, NotificationMessage message) {
        Log.e(TAG, "[onNotifyMessageDismiss] " + message);
    }

    @Override
    public void onRegister(Context context, String registrationId) {
        Log.e(TAG, "[onRegister] " + registrationId);
        Intent intent = new Intent("com.jiguang.demo.register");
        context.sendBroadcast(intent);
    }

    @Override
    public void onConnected(Context context, boolean isConnected) {
        Log.e(TAG, "[onConnected] " + isConnected);
    }

    @Override
    public void onCommandResult(Context context, CmdMessage cmdMessage) {
        Log.e(TAG, "[onCommandResult] " + cmdMessage);
    }

    @Override
    public void onTagOperatorResult(Context context, JPushMessage jPushMessage) {
        //TagAliasOperatorHelper.getInstance().onTagOperatorResult(context,jPushMessage);
        super.onTagOperatorResult(context, jPushMessage);
    }

    @Override
    public void onCheckTagOperatorResult(Context context, JPushMessage jPushMessage) {
       // TagAliasOperatorHelper.getInstance().onCheckTagOperatorResult(context,jPushMessage);
        super.onCheckTagOperatorResult(context, jPushMessage);
    }

    @Override
    public void onAliasOperatorResult(Context context, JPushMessage jPushMessage) {
        //TagAliasOperatorHelper.getInstance().onAliasOperatorResult(context,jPushMessage);
        super.onAliasOperatorResult(context, jPushMessage);
    }

    @Override
    public void onMobileNumberOperatorResult(Context context, JPushMessage jPushMessage) {
        //TagAliasOperatorHelper.getInstance().onMobileNumberOperatorResult(context,jPushMessage);
        super.onMobileNumberOperatorResult(context, jPushMessage);
    }

    @Override
    public void onNotificationSettingsCheck(Context context, boolean isOn, int source) {
        super.onNotificationSettingsCheck(context, isOn, source);
        Log.e(TAG, "[onNotificationSettingsCheck] isOn:" + isOn + ",source:" + source);
    }

}
  • mavenCentral集成其他注意事项,查看解决方案
  • 若需手动集成,查看集成教程

四 、初始化推送服务

JPush SDK 提供的 API 接口,都主要集中在 cn.jpush.android.api.JPushInterface 类里。

public class ExampleApplication extends Application {
    @Override
        public void onCreate() {
            super.onCreate();
            JPushInterface.setDebugMode(true);
            JPushInterface.init(this);
       }
   }

五 、验证推送结果

  • 集成完成后,您可运行工程,然后 创建推送体验通知推送服务
  • 推送完成后,你可以在 推送历史中查看推送状态、推送通道、送达率等详细数据

小记
1、查看OPPO推送是否集成成功:

nearme_opush: OPush register success! registerId: OPPO_CN_27b550f7e16eda602a4160fc22be36cc

2、微信快捷键截屏:

Alt+A:微信快速截图


参考链接:https://www.jianshu.com/p/b617613b10bc
参考链接:https://blog.csdn.net/qq_38436214/article/details/116586268

你可能感兴趣的:(极光推送集成华为遇到的坑?)