极光厂商通道集成指南

news2024/9/22 23:16:35

小米集成指南

1、使用JCenter自动化集成步骤

确认AndroidStudio的Project根目录的主gradle中配置了jcenter支持。(新建project默认配置就支持)

buildscript {  
    repositories {  
          jcenter()  
        }  
    }  

allprojects {
    repositories {  
          jcenter()  
         } 
     }

在应用module的gradle中dependencies节点添加如下代码

dependencies{  

    implementation 'cn.jiguang.sdk.plugin:xiaomi:3.8.5'
// JPushSDK3.8.5为例(厂商版本和jpush SDK版本保持一致,如果需要升级jpush SDK版本,注意厂商SDK版本的升级)  

} 

在应⽤module的gradle中defaultConfig节点添加如下代码(不要遗漏前缀MI-):

manifestPlaceholders=[  

    JPUSH_PKGNAME:"您应用的包名",

    XIAOMI_APPKEY:"MI-您的应用对应的小米的APPKEY",//小米平台注册的appkey 

    XIAOMI_APPID:"MI-您的应用对应的小米的APPID",//小米平台注册的appid

] 

由于 MiPush 的 regid 只能在主进程获取,非主进程获取到的regid为空,所以极光的 PushReceiver应寄宿于应用主进程, 需要在AndroidManifest.xml中将 PushReceiver 的分离进程配置去掉。配置示例如下:

	<receiver
      android:name="cn.jpush.android.service.PushReceiver"
      tools:node="replace"
      android:enabled="true">
         <intent-filter android:priority="1000">
             <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY" />
             <!--Required  显示通知栏 -->
             <category android:name="${applicationId}" />
         </intent-filter>
         <intent-filter>
             <action android:name="android.intent.action.USER_PRESENT" />
             <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
         </intent-filter>
         <!-- Optional -->
         <intent-filter>
             <action android:name="android.intent.action.PACKAGE_ADDED" />
             <action android:name="android.intent.action.PACKAGE_REMOVED" />

             <data android:scheme="package" />
         </intent-filter>
     </receiver>

2、配置AndroidManifest.xml集成步骤

        注意:(JCenter自动化集成与配置AndroidManifest.xml集成二者选择一种即可,如果您完成以上步骤,您可以跳过本段)

手动集成主要步骤为:

  • 1. 增加小米插件包及小米推送包
  • 2. 配置小米推送sdk所需要的权限
  • 3. 配置小米必须的组件
  • 4. 配置JPush接受的小米sdk的消息接受类
  • 5. 将XIAOMI_APPKEY与XIAOMI_APPID替换为在小米后台注册对应该应用的AppKey/AppID

        (1)导入极光的插件包以及小米推送sdk的jar,将极光提供的libs包中的jpush-android-plugin-xiaomi-v3.x.x.jar(插件包)及MiPush_SDK_Client_x_x_x.jar(小米推送包)导入到工程libs/目录下。

注1:极光集成小米通道在 JPush Android SDK 3.0.3 添加,对应测试的小米 SDK 版本为:3.2.2

注2:极光集成小米SDK在 JPush Android SDK 3.2.0 有升级,对应测试的小米 SDK 版本为:3.6.12

注2:极光集成小米SDK在 JPush Android SDK 3.3.2 有升级,对应测试的小米 SDK 版本为:3.6.18

注3:极光集成小米SDK在 JPush Android SDK 3.6.0 有升级,对应测试的小米 SDK 版本为:3.7.5

        (2)配置小米推送sdk所需要的权限

<permission
   		android:name="您应用的包名.permission.MIPUSH_RECEIVE"
    	android:protectionLevel="signature" />

   		<uses-permission android:name="您应用的包名.permission.MIPUSH_RECEIVE" />

     	<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
     	<uses-permission android:name="android.permission.INTERNET" />
     	<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
     	<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  		<uses-permission android:name="android.permission.READ_PHONE_STATE" />
     	<uses-permission android:name="android.permission.GET_TASKS" />
     	<uses-permission android:name="android.permission.VIBRATE" />

         (3)配置小米必须的组件

<service
   		android:name="com.xiaomi.push.service.XMJobService"
      	android:enabled="true"
     	android:exported="false"
     	android:permission="android.permission.BIND_JOB_SERVICE"
     	android:process=":pushservice" />

  	<service
     	android:name="com.xiaomi.push.service.XMPushService"
      	android:enabled="true"
     	android:process=":pushservice" />

 	<service
		android:name="com.xiaomi.mipush.sdk.PushMessageHandler"
		android:enabled="true"
		android:exported="true" />
	<service
		android:name="com.xiaomi.mipush.sdk.MessageHandleService"
		android:enabled="true" />

	<receiver
		android:name="com.xiaomi.push.service.receivers.NetworkStatusReceiver"
		android:exported="true">
		<intent-filter>
			<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
			<category android:name="android.intent.category.DEFAULT" />
		</intent-filter>
	</receiver>

	<receiver
		android:name="com.xiaomi.push.service.receivers.PingReceiver"
		android:exported="false"
		android:process=":pushservice">
		<intent-filter>
			<action android:name="com.xiaomi.push.PING_TIMER" />
		</intent-filter>
	</receiver>

    注:请不要将极光的组件PushReceiver配置进程和主进程分离。(按照示例默认配置即可)否则会影响小米RegId的获取

         (4)配置JPush接受的小米sdk的消息接受类

	<receiver
   		android:name="cn.jpush.android.service.PluginXiaomiPlatformsReceiver"
		android:exported="true">
		<intent-filter>
			<action android:name="com.xiaomi.mipush.RECEIVE_MESSAGE" />
		</intent-filter>
		<intent-filter>
			<action android:name="com.xiaomi.mipush.MESSAGE_ARRIVED" />
		</intent-filter>
		<intent-filter>
			<action android:name="com.xiaomi.mipush.ERROR" />
		</intent-filter>
	</receiver>

         (5)将APPKEY与APPID替换为在小米后台注册对应该应用的AppKey/AppID(不要遗漏前缀MI-)

<meta-data  
android:name="XIAOMI_APPKEY"  
android:value="MI-您的应用对应的小米的appkey"/>  
<meta-data  
android:name="XIAOMI_APPID"  
android:value="MI-您的应用对应小米的appID"/>

        (6)对于同一个应用集成了多个推送SDK,且其他SDK也使用了小米通道的用户:

可以将这个极光内置的Receiver,换成自己定义的Receiver。

这个Receiver必须继承小米的com.xiaomi.mipush.sdk.PushMessageReceiver

且在每个回调方法,都回调给极光的PluginXiaomiPlatformsReceiver。类似于这样:

public class XMPushReceiver extends PushMessageReceiver {

    final PluginXiaomiPlatformsReceiver receiver = new PluginXiaomiPlatformsReceiver();

    @Override
    public void onReceivePassThroughMessage(final Context context, final MiPushMessage message) {
        receiver.onReceivePassThroughMessage(context, message);
    }

    @Override
    public void onNotificationMessageClicked(Context context, MiPushMessage message) {
        receiver.onNotificationMessageClicked(context, message);
    }

    @Override
    public void onNotificationMessageArrived(Context context, MiPushMessage message) {
        receiver.onNotificationMessageArrived(context, message);
    }

    @Override
    public void onCommandResult(Context context, MiPushCommandMessage message) {
        receiver.onCommandResult(context, message);
    }

    @Override
    public void onReceiveRegisterResult(Context context, MiPushCommandMessage message) {
        receiver.onReceiveRegisterResult(context, message);
    }


}

3、小米SDK的编译混淆问题

  如果使用了proguard,需要在配置文件中加入,可以防止一个误报的warning导致无法成功编译:

-dontwarn com.xiaomi.push.**  
-keep class com.xiaomi.push.**{*;} 

4、点击通知跳转到指定Activity(小米,华为,vivo均适用)

说明

      小米/华为/vivo的push允许开发者在推送通知的时候传入自定义的intenturi字符串,当用户点击了该通知,系统会根据uri的值过滤出匹配的Activity,并打开Activity,达到跳转的目的。

        1:华为此功能从JPushAndroidSDK3.0.9开始支持;小米和vivo从JPushAndroidSDK3.3.8开始支持

        2此功能需要服务器端与Android端联合修改与调试。

服务端使用方式

        在pushapi的payload中的"notification"的"android"节点下添加以下字段:

关键字

类型

实例

说明

uri_activity

String

"com.HuananThirdPush.cn.OpenClickActivity"

该字段用于指定开发者想要打开的activity,值为activity节 点的"android:name"属性值。

        示例代码:

{  

    "platform": [  
          "android"  
        ],  

    "audience": "all",  

    "notification": {  

        "android": {  

            "alert": "在线alert003",  

            "title": "在线title003",  

            "uri_activity": "com.HuananThirdPush.cn.OpenClickActivity"  

        }  

    },  

    "message": {  

        "msg_content": "自定义消息内容003"  
    }  

}  

        极光提供服务端JAVASDK,下载地址GitHub - jpush/jpush-api-java-client: JiGuang's officially supported Java client library for accessing JPush APIs. 极光官方支持的 Java 版本服务器端 SDK。内含有example样例。可以拉取最新的代码自行打包,也可以直接使用libs文件夹下的jar

示例代码如下:

        注: addCustom("uri_activity","xxx")法传递的参数在非华为/VIVO/小米机型上做无效处理;addCustom("uri_action","xxx")方法传递的参数在非OPPO/FCM机型上做无效处理

public static PushPayload buildPushObject_CustomField() {  

    	   Notification notification = Notification.newBuilder()
    	                .addPlatformNotification(AndroidNotification.newBuilder()
    	                        .setAlert(ALERT)
    	                        .setTitle("Alert test")
    	                        .setLargeIcon("http://www.jiguang.cn/largeIcon.jpg")
    	                        .addCustom("uri_activity", "com.HuananThirdPush.cn.OpenClickActivity")
    	                        .addCustom("uri_flag", "uri_flag")
    	                        .addCustom("uri_action", "com.HuananThirdPush.cn.OpenClickActivity")
    	                        .build())
    	                .build();

    	        PushPayload.Builder payloadBuilder = new PushPayload.Builder()
    	                .setPlatform(Platform.all())
    	                .setAudience(Audience.all())
    	                .setNotification(notification);
    	               
    	        return  payloadBuilder.build();

    	} 

Android端配置步骤

        (1)AndroidManifest.xml中配置点击通知要打开的Activity

<activity android:name="您配置的activity"  
          android:exported="true">  
      <intent-filter>  
           <action android:name="android.intent.action.VIEW"/>  
           <category android:name="android.intent.category.DEFAULT"/>  
      </intent-filter>  
</activity> 

注:android:exported属性必须设置为true,并增加示例中的intent-filter,否则会导致无法收到通知。

        (2)获取通知相关信息


   目前启动配置的activity都是使用Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK方式启动,只需要在您配置的activity中的onCreate方法中进行处理,获取通知信息。华为通过getIntent().getData(),小米/vivo/OPPO/FCM通过  getIntent().getExtras().getString("JMessageExtra")取到Intent的数据。获取到的数据是JSON字符串,通过解析可以获得通知相关内容。

 JSON示例如下:

{
    "msg_id": "123456", 

    "n_content": "thisiscontent", 

    "n_extras": {

        "key1": "value1", 

        "key2": "value2"

    }, 

    "n_title": "thisistitle", 

    "rom_type": 0
}

 JSON内容字段说明:

字段

取值类型

描述

msg_id

String

通过此key获取到通知的msgid

n_title

String

通过此key获取到通知标题

n_content

String

通过此key获取到通知内容

n_extras

String

通过此key获取到通知附加字段

rom_type

byte

通过此key获取到下发通知的平台。得到值说明:byte类型的整数, 0为极光,1为小米,2为华为,3为魅族,4为oppo,5为vivo,8为FCM。

     注:rom_type用于点击事件的上报,一般情况下开发者只需要取到该字段的值用于上报,不需要关心具体取值


通知点击上报

        解析通知内容后,需主动调用接口来进行通知点击上报,上报接口如下

/** 
* context 上下文 
* msgId 消息ID 
* whichPushSDK 收到推送的平台,即 rom_type 字段的取值。 
**/  
JPushInterface.reportNotificationOpened(Context context, String msgId, byte whichPushSDK);

     注:点击上报必须传入正确的whichPushSDK参数,否则会造成统计数据错误。

富媒体调整

        在AndroidManifest.xml中将PushActivity、PopWinActivity的android:exported="false"属性修改为true,否则会导致收不到富媒体推送。

Activity示例代码(华为/小米/OPPO/vivo/FCM厂商均适用,魅族与基础的走极光通道的通知获取方法一致)

package com.HuananThirdPush.cn;

import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.widget.TextView;
import org.json.JSONException;
import org.json.JSONObject;
import cn.jpush.android.api.JPushInterface;

public class OpenClickActivity extends Activity {
    private static final String TAG = "OpenClickActivity";
    /**消息Id**/
    private static final String KEY_MSGID = "msg_id";
    /**该通知的下发通道**/
    private static final String KEY_WHICH_PUSH_SDK = "rom_type";
    /**通知标题**/
    private static final String KEY_TITLE = "n_title";
    /**通知内容**/
    private static final String KEY_CONTENT = "n_content";
    /**通知附加字段**/
    private static final String KEY_EXTRAS = "n_extras";
    private TextView mTextView;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mTextView = new TextView(this);
        setContentView(mTextView);
        handleOpenClick();
    }


    /**
     * 处理点击事件,当前启动配置的Activity都是使用
     * Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK
     * 方式启动,只需要在onCreat中调用此方法进行处理
     */
    private void handleOpenClick() {
        Log.d(TAG, "用户点击打开了通知");
        String data = null;
        
        //获取华为平台附带的jpush信息
        if (getIntent().getData() != null) {
            data = getIntent().getData().toString();
        }

        //获取fcm/oppo/小米/vivo 平台附带的jpush信息
        if (TextUtils.isEmpty(data) && getIntent().getExtras() != null) {
            data = getIntent().getExtras().getString("JMessageExtra");
        }

        Log.w(TAG, "msg content is " + String.valueOf(data));
        if (TextUtils.isEmpty(data)) return;
        try {
            JSONObject jsonObject = new JSONObject(data);
            String msgId = jsonObject.optString(KEY_MSGID);
            byte whichPushSDK = (byte) jsonObject.optInt(KEY_WHICH_PUSH_SDK);
            String title = jsonObject.optString(KEY_TITLE);
            String content = jsonObject.optString(KEY_CONTENT);
            String extras = jsonObject.optString(KEY_EXTRAS);
            StringBuilder sb = new StringBuilder();
            sb.append("msgId:");
            sb.append(String.valueOf(msgId));
            sb.append("\n");
            sb.append("title:");
            sb.append(String.valueOf(title));
            sb.append("\n");
            sb.append("content:");
            sb.append(String.valueOf(content));
            sb.append("\n");
            sb.append("extras:");
            sb.append(String.valueOf(extras));
            sb.append("\n");
            sb.append("platform:");
            sb.append(getPushSDKName(whichPushSDK));
            mTextView.setText(sb.toString());

            //上报点击事件
            JPushInterface.reportNotificationOpened(this, msgId, whichPushSDK);
        } catch (JSONException e) {
            Log.w(TAG, "parse notification error");
        }


    }

    private String getPushSDKName(byte whichPushSDK) {
        String name;
        switch (whichPushSDK) {
            case 0:
                name = "jpush";
                break;
            case 1:
                name = "xiaomi";
                break;
            case 2:
                name = "huawei";
                break;
            case 3:
                name = "meizu";
                break;
            case 4:
                name = "oppo";
                break;
            case 5:
                name = "vivo";
                break;
            case 8:
                name = "fcm";
                break;
            default:
                name = "jpush";
        }
        return name;
    }
}

5、集成结果判断

成功

        能成功调用接口获取到小米rid,存在小米集成成功但rid为null的情况。(需要在主进程中获取)

MiPushClient.getRegId(getApplicationContext()); 

失败

        缺少appkey或appid。打印:

xiaomisdkappkeyorappidwasempty,pleasecheckyourmanifestconfig 

        当配置都正常时,小米sdk注册失败时miui会打印E级别的日志,一般是appkey、appid非法。打印:

"xiaomipushregisterfailed-errorCode:" + message.getResultCode() + ",reason:" + message.getReason()); 

        当配置都正常时,无法通过方法MiPushClient.getRegId获得regID,需要检查一下小米应用是否开启推送功能。打印:

[PluginXiaomiPlatformsReceiver]xiaomipushregisterfailed-errorCode:22022,reason:Invalidpackagename:com.xxxxxx.xxxxxx  

6、小米厂商通道测试方法

  1. 在您的App中集成极光3.2.0及以上版本的SDK,并且按照「第三方通知通道集成指南」集成所需的厂商SDK
  2. 联系极光销售确认已开通厂商通道,如果成功开通则按照以下截图(极光官网-应用信息-推送设置-厂商通道)填写小米相关参数,保存后启用;

  1. 保持App在前台运行,尝试对设备进行推送;
  2. 如果应用收到消息,将App退到后台,并且杀掉所有App进程;
  3. 再次进行推送,如果能够收到推送,则表明厂商通道集成成功。

华为集成指南

主要步骤为:

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

1.集成步骤

(1)将极光提供的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'

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

注:services.json 配置文件的获取请参考厂商通道相关参数申请教程--华为相关参数获取部分。

(3) 在根级 build.gradle 中添加规则,以纳入 HMS 服务插件 和 华为 的 Maven 代码库,可根据华为开发者联盟发布的版本更新选择最新版本:

  buildscript {
        repositories {
            google()
            jcenter()
            maven {url 'http://developer.huawei.com/repo/'}
        }
    }
   buildscript {
       dependencies {
           classpath 'com.huawei.agconnect:agcp:1.4.1.300'
       }
   }
  
	allprojects {
        repositories {
            google()
            jcenter()
            maven {url 'http://developer.huawei.com/repo/'}
        }
    }

(4) 在应用 module 的 build.gradle 文件底部添加 apply plugin 代码行,以启用 gradle 插件: 

// ADD THIS AT THE TOP
   apply plugin: 'com.huawei.agconnect'

(5) 在应用 module 的 gradle 中 dependencies 节点添加如下代码,可根据 Huawei发布的版本更新选择最新版本: 

 dependencies {
       implementation 'com.huawei.hms:push:5.0.0.300'
   
     //引入极光-华为插件,如果采用此配置,无需拷贝jpush-android-plugin-huawei-v3.x.x.jar文件,
     也无需配置cn.jpush.android.service.PluginHuaweiPlatformsService组件
     
       implementation 'cn.jiguang.sdk.plugin:huawei:3.8.5'
        // JPushSDK3.8.5为例(厂商版本和jpush SDK版本保持一致,如果需要升级jpush SDK版本,注意厂商SDK版本的升级)
   }
   

注1:极光集成华为通道在 JPush Android SDK 3.0.5 添加,对应测试的华为HMS SDK 版本为:HMS-SDK-2.4.0.300.aar

注2:JPush Android SDK 3.0.9 适配HMS SDK的升级,对应测试的华为HMS SDK 版本为:HMSSdk-base-2.5.2.300.aar,HMSSdk-push-2.5.2.300.aar

注3:JPush Android SDK 3.1.2 适配HMS SDK的升级,对应测试的华为HMS SDK 版本为:HMSSdk-base-2.5.3.302.aar,HMSSdk-push-2.5.3.302.aar

注4:从HMS_SDK_2.6.0.301版本开始支持jar包+res资源集成,JPush Android SDK 3.1.5对应测试的华为HMS SDK 版本为:HMS_SDK_2.6.0.301.jar

注5:JPush Android SDK 3.2.0 更新华为HMS SDK版本为:hmssdk_2.6.3.301.jar

注6:JPush Android SDK 3.3.6 更新华为HMS SDK版本为:hmssdk_2.6.3.306.jar

注7:JPush Android SDK 3.5.4 更新华为HMS SDK版本为:3.0.3.301

注7:JPush Android SDK 3.6.0 更新华为HMS SDK版本为:4.0.2.300

注8: 添加 华为 Push SDK 的官方文档

(6) 配置接收HMS消息的服务(使用jcenter集成方式则无需配置)

  <service
         android:name="cn.jpush.android.service.PluginHuaweiPlatformsService"
         android:exported="false">
         <intent-filter>
             <action android:name="com.huawei.push.action.MESSAGING_EVENT" />
         </intent-filter>
 </service

(7)在build.gradle中配置在华为后台添加的指纹证书对应的签名

 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
        }
    }

注:HMS服务必须要求app签名才能注册成功。指纹证书是在终端采用keytool-list-v-keystorekeystorefileName获取偶对应的指纹证书。

(8)HMS SDK的编译混淆问题

如果使用了 proguard,需要在配置文件中加入,可以防止一个误报的 warning 导致无法成功编译

    -ignorewarning 
    -keepattributes *Annotation* 
    -keepattributes Exceptions 
    -keepattributes InnerClasses 
    -keepattributes Signature 
    -keepattributes SourceFile,LineNumberTable 
    -keep class com.hianalytics.android.**{*;} 
    -keep class com.huawei.updatesdk.**{*;} 
    -keep class com.huawei.hms.**{*;}

如果开发者使用了AndResGuard,需要在混淆配置文件中加入AndResGuard白名单。

```
    "R.string.hms*",
    "R.string.connect_server_fail_prompt_toast",
    "R.string.getting_message_fail_prompt_toast",
    "R.string.no_available_network_prompt_toast",
    "R.string.third_app_*",
    "R.string.upsdk_*",
    "R.layout.hms*",
    "R.layout.upsdk_*",
    "R.drawable.upsdk*",
    "R.color.upsdk*",
    "R.dimen.upsdk*",
    "R.style.upsdk*",
    "R.string.agc*"
    
```

2.点击通知跳转到指定Activity

(见小米集成指南第4点)

3.检测华为服务升级

如果华为设备华为服务版本过低的话,将不能使用华为推送通道发送通知,必须升级华为服务才行,用户可选检测该服务是否需要升级。

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        jPluginPlatformInterface = new JPluginPlatformInterface(this);
    }
    protected void onStart() {
        super.onStart();
        jPluginPlatformInterface.onStart(this);
    }
    protected void onStop() {
        super.onStop();
        jPluginPlatformInterface.onStop(this);
    }

注: 参数必须为Activity,请在合适的Activity里调用该接口,onStart和onStop 接口都必须在Activity的生命周期里调用,否则可能引起内存泄漏。

4.集成结果判断

      成功

        打印结果如下:

 I/JIGUANG-JPush: [PluginHuaweiPlatformsService] onNewToken:AOOkWX-Pg81gPcB7hneOV3928MOwA5Dm62NTocNU1DnfqvXYzubvh4rsGbVsSffmA3bZ0TZOMWhL62-BcNAyo4QPq9GmS5fK_Vz8sMZHYQW96OU8XiE2-i8YBJRmuRL6-Q
 D/JIGUANG-JPush: [ActionHelper] doAction:third_action
 D/JIGUANG-JPush: [ThirdPushManager] doAction,action:action_register_token,bundle:Bundle[{third_key_action=action_register_token, token=AOOkWX-Pg81gPcB7hneOV3928MOwA5Dm62NTocNU1DnfqvXYzubvh4rsGbVsSffmA3bZ0TZOMWhL62-BcNAyo4QPq9GmS5fK_Vz8sMZHYQW96OU8XiE2-i8YBJRmuRL6-Q, platform=2}],enable:true
 I/JIGUANG-JPush: [ThirdPushManager] uploadRegID regid:AOOkWX-Pg81gPcB7hneOV3928MOwA5Dm62NTocNU1DnfqvXYzubvh4rsGbVsSffmA3bZ0TZOMWhL62-BcNAyo4QPq9GmS5fK_Vz8sMZHYQW96OU8XiE2-i8YBJRmuRL6-Q

      失败

      在华为控制台上面的应用没有开通推送服务配置配置。支持的Emui系统下会有如下打印获取不到token:

W/JIGUANG-JPush:[HWpushHelper] get token error:907122036: no right
或者是如下打印
I/JIGUANG-JPush:[HWpushHelper] token:

处理方法:华为控制台推送服务--服务状态请确认为开通,具体可以参考厂商通道相关参数申请教程--华为相关参数获取部分。

5.华为集成常见错误码

类型                

返回码                

               

意义                

处理方式                

PUSH通用错误码

               

SUCCESS

               

0

成功

ERROR_NO_TOKEN

907122030

没有Token

请尝试删除Token后重新申请Token。

ERROR_NO_NETWORK

               

907122031

没有网络                

请检查网络连接。

ERROR_NO_TOKENSIGN

               

907122032

Token无效

请尝试删除Token后重新申请Token。

ERROR_PUSH_SERVER

               

907122047

PUSH服务端返回错误                

PUSH服务端返回错误,请联系华为方支持人员。

ERROR_UNKNOWN

               

907122045

未知错误                

出现未知错误,请联系华为方支持人员。

ERROR_SERVICE_NOT_AVAILABLE

               

907122046

PUSH不可服务

PUSH内部出现异常,请联系华为方支持人员。

ERROR_HMS_CLIENT_API

               

907122048

HMS无法连接PUSH

PUSH内部出现异常,请联系华为方支持人员。

ERROR_OPERATION_NOT_SUPPORTED

               

907122049

操作不支持,需要升级系统版本

请升级EMUI系统版本到10.0以上。

ERROR_MAIN_THREAD

               

907122050

操作不能在主线程中

请在子线程中操作。

ERROR_ARGUMENTS_INVALID

907135000

传入的参数错误

请检查相关的配置信息是否正确。比如:agconnect-services.json文件中的app_id;build.gradle文件是否配置证书签名等。

ERROR_INTERNAL_ERROR

               

907135001

内部错误,表示内部出现异常且无法恢复

内部接口出现异常,请联系华为方支持人员。

ERROR_NAMING_INVALID

               

907135002

服务不存在,调用的接口不存在

请检查构建HUAWEIApiClient时设置的API是否正确。

ERROR_CLIENT_API_INVALID

               

907135003

ApiClient对象无效

ApiClient对象为空或ApiClient对象状态不是已连接状态,请检查构建HuaweiApiClient时设置的API是否正确。

ERROR_EXECUTE_TIMEOUT

               

907135004

调用AIDL超时

此错误码只出现在开发者直接调用await接口时,请尝试将超时时间参数加大。如果觉得已经影响业务,请联系华为方支持人员。

ERROR_NOT_IN_SERVIC

               

907135005

当前区域不支持此业务

区域不支持此业务。请联系华为方支持人员。                

ERROR_SESSION_INVALID

               

907135006

AIDL连接session无效

请重试,如果多次重试失败,请联系华为方支持人员。

ERROR_GET_SCOPE_ERROR

               

907135700

调用网关查询应用scope失败

请检查当前应用是否在华为开发者联盟创建并申请相关服务。如果已经创建,请联系华为方支持人员。

ERROR_SCOPE_LIST_EMPTY

               

907135701

OpenGW没有配置scope

请检查当前应用是否在华为开发者联盟创建并申请相关服务。如果检查都正确,请联系华为方支持人员。

ERROR_CERT_FINGERPRINT_EMPTY

               

907135702

OpenGW没有配置指纹证书

1、请检查手机网络是否可以正常访问互联网。

2、请检查是否在AppGallery Connect上配置了正确的证书指纹。具体参考开发准备-AppGallery Connect配置。

3、如果检查都正确,请联系华为方支持人员。

               

ERROR_PERMISSION_LIST_EMPTY

               

907135703

OpenGW没有配置Permission

请检查当前应用是否在华为开发者联盟创建并申请相关服务。如果检查都正确,请联系华为方支持人员。

ERROR_AUTH_INFO_NOT_EXIST

               

6002

应用的鉴权信息不存在

请检查当前应用是否在华为开发者联盟创建并申请相关服务。如果已经创建,请联系华为方支持人员。

ERROR_CERT_FINGERPRINT_ERROR

               

6003

证书指纹校验:证书指纹错误

请检查是否在AppGallery Connect上配置了正确的证书指纹。具体参考开发准备-AppGallery Connect配置。

ERROR_PERMISSION_NOT_EXIST

               

6004

接口鉴权:权限不存在,未在联盟上申请

请检查当前应用是否在华为开发者联盟创建并申请相关服务。如果检查都正确,请联系华为方支持人员。

ERROR_PERMISSION_NOT_AUTHORIZE

               

6005

接口鉴权:未授权

请检查当前应用是否在华为开发者联盟创建并申请相关服务。如果检查都正确,请联系华为方支持人员。

ERROR_PERMISSION_EXPIRED

               

6006

接口鉴权:授权过期

请检查当前应用是否在华为开发者联盟创建并申请相关服务。如果已经创建,请联系华为方支持人员。

ERROR_API_NOT_SPECIFIED

               

1002

调用未指定的API错误                

请调用指定的API接口。

6.华为厂商测试方法 测试前请务必确认华为控制台推送服务--服务状态请确认为开通,具体可以参考厂商通道相关参数申请教程--华为相关参数获取部分

  1. 在您的App中集成极光3.2.0及以上版本的SDK,并且按照「第三方通知通道集成指南」集成所需的厂商SDK;
  2. 联系极光销售确认已开通厂商通道,如果成功开通则按照以下截图(极光官网应用信息-推送设置-厂商通道)填写华为相关参数,保存后启用;

3.将集成好的App(测试版本)安装在测试机(需要运行 EMUI版本 5.0及以上的手机)上,并且运行App;

4.保持App在前台运行,尝试对设备进行推送;

5.如果应用收到消息,将App退到后台,并且杀掉所有App进程;

6.再次进行推送,如果能够收到推送,则表明厂商通道集成成功。

魅族集成指南

1、使用JCenter自动化集成步骤

确认android studio的 Project 根目录的主 gradle 中配置了jcenter支持。(新建project默认配置 就支持)

buildscript {
		repositories {
		jcenter()
		}
		......
	}


	allprojets {
		repositories {
		jcenter()
		}
	}

在应用 module 的 gradle 中 dependencies 节点添加如下代码:

dependencies {
		implementation 'cn.jiguang.sdk.plugin:meizu:3.8.5'
    // JPushSDK3.8.5为例(厂商版本和jpush SDK版本保持一致,如果需要升级jpush SDK版本,注意厂商SDK版本的升级)
	}

在应用 module 的 gradle 中 defaultConfig 节点添加如下代码:

manifestPlaceholders = [
   		// 设置manifest.xml中的变量
   		MEIZU_APPKEY : "MZ-您的应用对应的魅族的APPKEY", // 魅族平台注册的appkey
   		MEIZU_APPID : "MZ-您的应用对应的魅族的APPID", // 魅族平台注册的appid
   ]

2、配置AndroidManifest.xml集成步骤

         意:(JCenter自动化集成与配置AndroidManifest.xml集成二者选择一种即可,如果您完成以上 步骤,您可以跳过本段)

手动集成步骤主要步骤为:

  • 4.1. 增加魅族插件包及魅族推送包
  • 4.2. 修改 minSdkVersion 的值
  • 4.3. 配置魅族推送sdk所需要的权限
  • 4.4. 配置JPush接受魅族sdk的消息接受类
  • 4.5. 将MEIZUAPPKEY与MEIZUAPPID替换为在魅族后台注册对应该应用 的AppKey/AppID

  (1)导入极光的插件包的jar,将极光提供的libs包中的插件包(jpush-android-plugin-meizu-v3.x.x.jar)和魅族推送包(meizu-push-x.x.x.jar)添加到工程libs目录下。

注1:  极光集成魅族通道在 JPush Android SDK 3.0.6 添加。

注2: JPush Android SDK 3.2.0添加了魅族推送包,对应的魅族sdk版本为:meizu-push-3.8.1.jar

注3: JPush Android SDK 3.6.0更新了魅族推送包,对应的魅族sdk版本为:meizu-push-3.9.0.jar

    (2) 修改minSdkVersion的值

注:魅族推送会强制将minSdkVersion修改为11。如果当前app使用的minSdkVersion的值小于11,则需要使用tools避免被强制覆盖。

<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    ...
 >

<uses‐sdk
    android:minSdkVersion="9"
    android:targetSdkVersion="21"
    tools:overrideLibrary=" cn.jpush.android.thirdpush.meizu"/>

    (3)配置魅族推送sdk所需要的权限

 <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
	<uses-permission android:name="com.meizu.c2dm.permission.RECEIVE" />
	<permission
		android:name="您应用的包名.permission.C2D_MESSAGE"
		android:protectionLevel="signature"></permission>
	<uses-permission android:name="您应用的包名.permission.C2D_MESSAGE" />

    (4)配置魅族推送sdk所需要的必要组件

       <service
            android:name="com.meizu.cloud.pushsdk.NotificationService"
            android:exported="true" />

        <receiver
            android:name="com.meizu.cloud.pushsdk.SystemReceiver"
            android:exported="false" >
            <intent-filter>
                <action android:name="com.meizu.cloud.pushservice.action.PUSH_SERVICE_START" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>

(5)配置JPush接受魅族sdk的消息接受类

	<receiver android:name="cn.jpush.android.service.PluginMeizuPlatformsReceiver">
		<intent-filter>
			<!-- 接收 push 消息 -->
			<action android:name="com.meizu.flyme.push.intent.MESSAGE" />
			<!-- 接收 register 消息 -->
			<action android:name="com.meizu.flyme.push.intent.REGISTER.FEEDBACK" />
			<!-- 接收 unregister 消息-->
			<action android:name="com.meizu.flyme.push.intent.UNREGISTER.FEEDBACK" />
			<!-- 兼容低版本 Flyme3 推送服务配置 -->
			<action android:name="com.meizu.c2dm.intent.REGISTRATION" />
			<action android:name="com.meizu.c2dm.intent.RECEIVE" />

			<category android:name="您应用的包名"></category>
		</intent-filter>
 	</receiver>

    (6)将MEIZUAPPKEY与MEIZUAPPID替换为在魅族后台注册对应该应用的AppKey/AppID(不要遗漏前缀MZ-)

<meta‐data
    android:name="MEIZU_APPKEY" 
    android:value="MZ‐您的应用对应的魅族的APPKEY"/>
<meta‐data
    android:name="MEIZU_APPID" 
    android:value="MZ‐您的应用对应的魅族的APPID"/>

(7)对于同一个应用集成了多个推送SDK,且其他SDK也使用了魅族通道的用户:

     可以将这个极光内置的Receiver,换成自己定义的Receiver。

     这个Receiver必须继承魅族的com.meizu.cloud.pushsdk.MzPushMessageReceiver

     且在每个回调方法,都回调给极光的PluginMeizuPlatformsReceiver。类似于这样:

public class MyMZPushReceiver extends MzPushMessageReceiver {

    final PluginMeizuPlatformsReceiver receiver = new PluginMeizuPlatformsReceiver();

    @Override
    public void onReceive(Context context, Intent intent) {
        receiver.onReceive(context, intent);
    }

    @Override
    public void onRegister(Context context, String s) {
        receiver.onRegister(context, s);
    }

    @Override
    public void onMessage(Context context, String s) {
        receiver.onMessage(context, s);
    }

    @Override
    public void onNotificationArrived(Context context, MzPushMessage mzPushMessage) {
        receiver.onNotificationArrived(context, mzPushMessage);
    }

    @Override
    public void onNotificationClicked(Context context, MzPushMessage mzPushMessage) {
        receiver.onNotificationClicked(context, mzPushMessage);
    }


    @Override
    public void onUnRegister(Context context, boolean b) {
        receiver.onUnRegister(context, b);
    }

    @Override
    public void onPushStatus(Context context, PushSwitchStatus pushSwitchStatus) {
        receiver.onPushStatus(context, pushSwitchStatus);
    }

    @Override
    public void onRegisterStatus(Context context, RegisterStatus registerStatus) {
        receiver.onRegisterStatus(context, registerStatus);
    }

    @Override
    public void onUnRegisterStatus(Context context, UnRegisterStatus unRegisterStatus) {
        receiver.onUnRegisterStatus(context, unRegisterStatus);
    }

    @Override
    public void onSubTagsStatus(Context context, SubTagsStatus subTagsStatus) {
        receiver.onSubTagsStatus(context, subTagsStatus);
    }

    @Override
    public void onSubAliasStatus(Context context, SubAliasStatus subAliasStatus) {
        receiver.onSubAliasStatus(context, subAliasStatus);
    }

    @Override
    public void onUpdateNotificationBuilder(PushNotificationBuilder pushNotificationBuilder) {
        receiver.onUpdateNotificationBuilder(pushNotificationBuilder);
    }
}

3、配置魅族通知栏小图标

       通过MzPushSDK接收的通知,可设置其通知栏icon,方法如下:

       在应用的工程目录res/drawable-xxxx/几个文件夹中添加对应不同分辨率的通知栏icon图标,文件名 为mz_push_notification_small_icon。如果文件名错误,将无法正确显示该应用的状态栏图 标。魅族手机状态栏icon规范请参考魅族 PushSDKDemo中的图片文件。

       注:如果没有放入符合规范的icon文件,会默认使用应用图标作为通知icon。而应用图标不符合魅族的通知栏icon设计规范的话,则会导 致通知栏图标无法正确显示。

4、通知内容长度兼容

         由于魅族官方的通知内容长度限制为100个字符以内(中英文都算一个),当通知内容(极光的“alert”字段的值)长度超过 100时,魅族通道会推送失败。此时调用极光api推送通知时,请在payload 中的 "notification" 的 "android" 节点的"extras"节点添 加以下字段:   功能说明

       由于魅族官方的通知内容长度限制为100个字符以内(中英文都算一个),当通知内容(极光的“alert”字段的值)长度超过 100时,魅族通道会推送失败。此时调用极光api推送通知时,请在payload 中的 "notification" 的 "android" 节点的"extras"节点添 加以下字段:

Key

类型

示例

说明

mzpns_content_forshort

String

"short content"

通知内容(极光的“alert”字段)长度超过100个字时,请在此字段的值传入不超过100个字的通知内容。

json示例代码:

{
    "platform":[
         "android"
    ],  
    "audience":"all",
    "notification":{
    "android":{
    "alert":"在国内 Android 生态中,推送通道都是由终端与云端之间的长链接来维持,严重依赖于应用进程的存活状态。如今一些手机......(省略若干字)......组件即可", 
    "title":"概述",
    "extras":{
          "mzpns_content_forshort":"在国内Android系统上推送严重依赖于应用进程的存活状态。"
     } 
   }
  } 
}

5、MeizuPush SDK的编译混淆问题

如果使用了 proguard,需要在配置文件中加入,可以防止一个误报的 warning 导致无法成功编译

-dontwarn com.meizu.cloud.**
-keep class com.meizu.cloud.** { *; }

6、集成结果判断

成功

JPush集成成功,魅族sdk打印日志:

E/AbstractMessageHandler(12917):currentHandlermessageBasicPushStatus{code='200',message=''}pushId='0XC715
16b727f6c0377570f645c0c415c627857667072',Becomeinvalidafter604800seconds}
或者
E/AbstractMessageHandler(12917):currentHandlermessageBasicPushStatus{code='200',message='alreadyregisterP
ushId,dontregisterfrequently'}pushId='J04760350615d6364567a7a447f0d0f7b017f055d6759',Becomeinvalidafter60
3767seconds}

失败

MEIZU_APPKEY、MEIZU_APPID非法,打印日志如下:

E/PushPlatformManager(10154):{"code":"1005","message":"参数错误,请参考API文档","value":"","redirect":""}
04‐ 2814:55:14.627:D/AndroidNetworking(10154):executiondone:ANRequest{sequenceNumber='1,mMethod=1,mPriority=M EDIUM,mRequestType=0,mUrl=https://api‐push.meizu.com/garcia/api/client/message/registerPush}

MEIZU_APPKEY、MEIZU_APPID不是同一个魅族应用,打印日志如下:

04‐2800:13:38.685:E/PushPlatformManager(32757):registerStatusBasicPushStatus{code='1006',message='签名认证 失败'}pushId='null',Becomeinvalidafter0seconds} 
04‐2800:13:38.724:I/AbstractMessageHandler(32728):startRegisterStatusHandlermatch 
04‐2800:13:38.724:E/AbstractMessageHandler(32728):currentmessageTypeMESSAGE_TYPE_PUSH_REGISTER_STATUS

7.集成错误码

名称

ErrorCode

错误原因

UNKNOWN_ERROR

-1

未知错误

SUCCESS

200

成功

SYSTEM_ERROR

1001

系统错误

SYSTEM_BUSY

1003

服务器忙

PARAMETER_ERROR

1005

参数错误,请参考API文档

INVALID_SIGN

1006

签名认证失败

INVALID_APPLICATION_ID

110000

appId不合法

INVALID_APPLICATION_KEY

110001

appKey不合法

UNSUBSCRIBE_PUSHID

110002

pushId未注册

INVALID_PUSHID

110003

pushId非法

PARAM_BLANK

110004

参数不能为空

APP_IN_BLACK_LIST

110009

应用被加入黑名单

APP_REQUEST_EXCEED_LIMIT

110010

应用请求频率过快

APP_PUSH_TIME_EXCEED_LIMIT

110051

超过该应用的次数限制

APP_REQUEST_PUSH_LIMIT

110019

超过该应用每天推送次数限制

INVALID_APPLICATION_PACKAGENAME

110031

packageName不合法

INVALID_TASK_ID

110032

非法的taskId

INVALID_APPLICATION_SECRET

110033

非法的appSecret

8、魅族厂商通道测试方法

1. 在您的App中集成极光3.2.0及以上版本的SDK,并且按照「第三方通知通道集成指南」集成所需的厂商SDK;

2. 联系极光销售确认已开通厂商通道,如果成功开通则按照以下截图(极光官网应用信息-推送设置-厂商通道)填写魅族相关参数,保存后启用;

                                                        

3. 将集成好的App(测试版本)安装在测试机(需要运行 Flyme版本 5.1.11.1及以上的手机)上,并且运行App;

4. 保持App在前台运行,尝试对设备进行推送;

5. 如果应用收到消息,将App退到后台,并且杀掉所有App进程;

6. 再次进行推送,如果能够收到推送,则表明厂商通道集成成功。

FCM集成指南

1、手动配置集成步骤

主要步骤为:

  • 1. 添加 FCM SDK 到项目中
  • 2. 修改 minSdkVersion 的值
  • 3. 配置 JPush 接收 FCM SDK 消息的服务类
  • 4. 设置通知图标

(1)导入极光的 FCM插件包的jar,将极光提供的libs包中的插件包(jpush-android-plugin-fcm-v3.x.x.jar)添加到工程libs目录下。

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

(3)在android studio 的 Project 根目录的主 gradle 中配置使用jcenter(新建的project默认已配置),具体如下:

buildscript {   
    repositories {  
    jcenter()  
    }  
    ......   
}   

allprojets {   
   repositories {  
    jcenter()   
    }    
}

 (4)在根级 build.gradle 中添加规则,以纳入 Google 服务插件 和 Google 的 Maven 代码库,可根据 Firebase 发布的版本更新选择最新版本:

buildscript {   
    dependencies {  
        classpath 'com.google.gms:google-services:4.2.0'  
    }  
}    

allprojets {   
    repositories {  
        maven {
            url "https://maven.google.com"
        }
    }    
}

(5)在应用 module 的 build.gradle 文件底部添加 apply plugin 代码行,以启用 gradle 插件:

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

(6)在应用 module 的 gradle 中 dependencies 节点添加如下代码,可根据 Firebase 发布的版本更新选择最新版本:

 dependencies {
	    implementation 'com.google.firebase:firebase-core:17.0.0'
        implementation 'com.google.firebase:firebase-messaging:20.0.0'
    }

1极光集成 FCM 通道在 JPush Android SDK 3.1.0 添加。

注2:极光JPush Android SDK 3.6.4,对应 FCM 通道版本:messaging版本为20.0.0,firebase-core 版本为17.0.0。

注3: 添加 FCM SDK 的官方文档https://firebase.google.com/docs/android/setup?authuser=0

注4:编译时如果遇到类似如下错误,拉取FCM依赖失败,请在 Android Studio->SDK Manager->SDK Tools 中将 Google Play Services 和 Google Repository 更新到最新版本后再试。

Failed to resolve: com.google.firebase:firebase-core:x.x.x  
Error:(36, 13) Failed to resolve: com.google.firebase:firebase-messaging:x.x.x  

 (7)FCM 推送会强制将 minSdkVersion 修改为 14。如果当前 app 使用的 minSdkVersion 的值小于14,则需要使用 tools 避免被强制覆盖。

<manifest   
        xmlns:android="http://schemas.android.com/apk/res/android"  
        xmlns:tools="http://schemas.android.com/tools"     ... >  
 
 <uses-sdk
        android:minSdkVersion="9"
        android:targetSdkVersion="21"
        tools:overrideLibrary=" com.google.android.gms.common.license,
            com.google.android.gms.tasks.license,
            com.google.firebase.firebase.common.license,
            com.google.firebase.firebase.iid.license,
            com.google.firebase.firebase.messaging.license,
            com.google.firebase.measurement.impl.license,
            com.google.firebase.measurement.license,
            com.google.firebase.firebase_core,
            com.google.firebase.measurement,
            com.google.firebase.firebase_common,
            com.google.firebase.messaging,
            com.google.firebase.iid,
            com.google.android.gms,
            com.google.android.gms.tasks,
            com.google.firebase.iid.internal,
            com.google.firebase.analytics.connector,
            com.google.android.gms.stats,
            com.google.android.gms.common,
            com.google.android.gms.measurement.api,
            com.google.android.gms.ads_identifier,
            com.google.android.gms.measurement_base,
            com.google.firebase.analytics.connector.impl,
            android.support.v4,
            android.support.compat,
            android.arch.lifecycle,
            android.support.mediacompat,
            android.support.coreutils,
            android.support.coreui,
            android.support.fragment,
            com.google.firebase.measurement_impl"/>

(8)配置JPush接收的FCM SDK的消息服务类

```
<service android:name="cn.jpush.android.service.PluginFCMMessagingService">
     <intent-filter>
           <action android:name="com.google.firebase.MESSAGING_EVENT"/>
     </intent-filter>
</service>

(9)在 AndroidManifest.xml 中增加如下配置来设置 FCM 通知图标。

<meta-data  
android:name="com.google.firebase.messaging.default_notification_icon"  
     android:resource="@drawable/您要配置的通知图标" />  

2、点击通知跳转 Activity(OPPO和FCM均适用)

  • 功能说明

        OPPO/FCM 允许开发者在推送通知的时候传入自定义的 intent action 字符串,当用户点击了该通知,系统会根据 action 的值过滤出匹配的 Activity ,并打开 Activity,获取推送内容。

服务端使用方式

  • Push API 推送说明

        在 push api 的 payload 中的 "notification" 的 "android" 节点下添加以下字段:

关键字

类型

示例

说明

uri_action

string

"com.HuananThirdPush.cn.OpenClickActivity"

该字段用于指定开发者想要打开的 activity。值为该activity下您配置的特殊action name

请求json如下  

{
    "platform": [
        "android"
    ], 
    "audience": "all", 
    "notification": {
        "android": {
            "alert": "在线alert003", 
            "title": "在线title003", 
            "uri_action": "com.HuananThirdPush.cn.OpenClickActivity"
        }
    },
    "message": {
        "msg_content": "自定义消息内容003"
    }
}

              极光提供服务端JAVASDK,下载地址GitHub - jpush/jpush-api-java-client: JiGuang's officially supported Java client library for accessing JPush APIs. 极光官方支持的 Java 版本服务器端 SDK。内含有example样例。可以拉取最新的代码自行打包,也可以直接使用libs文件夹下的jar

示例代码如下:

        注: addCustom("uri_activity","xxx")法传递的参数在非华为/VIVO/小米机型上做无效处理;addCustom("uri_action","xxx")方法传递的参数在非OPPO/FCM机型上做无效处理

public static PushPayload buildPushObject_CustomField() {  

         Notification notification = Notification.newBuilder()
                      .addPlatformNotification(AndroidNotification.newBuilder()
                              .setAlert(ALERT)
                              .setTitle("Alert test")
                              .setLargeIcon("http://www.jiguang.cn/largeIcon.jpg")
                              .addCustom("uri_activity", "com.HuananThirdPush.cn.OpenClickActivity")
                              .addCustom("uri_flag", "uri_flag")
                              .addCustom("uri_action", "com.HuananThirdPush.cn.OpenClickActivity")
                              .build())
                      .build();

              PushPayload.Builder payloadBuilder = new PushPayload.Builder()
                      .setPlatform(Platform.all())
                      .setAudience(Audience.all())
                      .setNotification(notification);
                     
              return  payloadBuilder.build();

      } 

Android端配置步骤

 (1)在 AndroidManifest.xml 中配置点击通知要打开的 activity

<activity android:name="您配置的activity"
          android:exported="true">
    <intent-filter>
        <action android:name="您配置的特殊action"/>
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>  
</activity> 

 (2)取通知相关信息

        在您配置的 activity 中的onCreate方法中进行处理,获取通知信息。

        华为通过getIntent().getData(),小米/vivo/oppo/vivo/FCM通过  getIntent().getExtras().getString("JMessageExtra")取到Intent的数据。获取到的数据是JSON字符串,通过解析可以获得通知相关内容。

        JSON 示例如下:

{
    "msg_id": "123456", 
    "n_content": "this is content", 
    "n_extras": {
        "key1": "value1", 
        "key2": "value2"
    }, 
    "n_title": "this is title", 
    "rom_type": 0
}

JSON 内容字段说明:

字段

取值类型

描述

msg_id

String

通过此key获取到通知的msgid

n_title

String

通过此key获取到通知标题

n_content

String

通过此key获取到通知内容

n_extras

String

通过此key获取到通知附加字段

rom_type

byte

通过此key获取到下发通知的平台。得到值说明:byte类型的整数,0为极光,1为小米,2为华为,3为魅族,4为OPPO,5为vivo,8为FCM。

 注: rom_type 用于点击事件的上报,一般情况下开发者只需要取到该字段的值用于上报,不需要关心具体取值

通知点击上报

    解析通知内容后,需主动调用接口来进行通知点击上报,上报接口如下:注: 点击上报必须传入正确的 whichPushSDK 参数,否则会造成统计数据错误。

/** 
* context 上下文 
* msgId 消息ID 
* whichPushSDK 收到推送的平台,即 rom_type 字段的取值。 
**/  
JPushInterface.reportNotificationOpened(Context context, String msgId, byte whichPushSDK);

 富媒体调整

        为 PushActivity 增加 <action android:name="cn.jpush.android.ui.PushActivity" />。

        为 PopWinActivity 增加 <action android:name="cn.jpush.android.ui.PopWinActivity" />。

<activity  
     android:name="cn.jpush.android.ui.PushActivity"  
     android:configChanges="orientation|keyboardHidden"  
     android:theme="@android:style/Theme.NoTitleBar">  
        <intent-filter>  
            <action android:name="cn.jpush.android.ui.PushActivity" />  
            <category android:name="android.intent.category.DEFAULT" />  
            <category android:name="您的应用的包名" />  
        </intent-filter>  
</activity>  

<activity  
     android:name="cn.jpush.android.ui.PopWinActivity"  
     android:configChanges="orientation|keyboardHidden"  
     android:theme="@style/MyDialogStyle">  
        <intent-filter>  
            <category android:name="android.intent.category.DEFAULT" />  
            <category android:name="您的应用的包名" />  
            <action android:name="cn.jpush.android.ui.PopWinActivity"/>  
        </intent-filter>  
</activity>

Activity 示例代码

(华为/小米/oppo/vivo/FCM厂商均适用,魅族与基础的走极光通道的通知获取方法一致)

package com.HuananThirdPush.cn;

import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.widget.TextView;
import org.json.JSONException;
import org.json.JSONObject;
import cn.jpush.android.api.JPushInterface;

public class OpenClickActivity extends Activity {
    private static final String TAG = "OpenClickActivity";
    /**消息Id**/
    private static final String KEY_MSGID = "msg_id";
    /**该通知的下发通道**/
    private static final String KEY_WHICH_PUSH_SDK = "rom_type";
    /**通知标题**/
    private static final String KEY_TITLE = "n_title";
    /**通知内容**/
    private static final String KEY_CONTENT = "n_content";
    /**通知附加字段**/
    private static final String KEY_EXTRAS = "n_extras";
    private TextView mTextView;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mTextView = new TextView(this);
        setContentView(mTextView);
        handleOpenClick();
    }


    /**
     * 处理点击事件,当前启动配置的Activity都是使用
     * Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK
     * 方式启动,只需要在onCreat中调用此方法进行处理
     */
    private void handleOpenClick() {
        Log.d(TAG, "用户点击打开了通知");
        String data = null;
        
        //获取华为平台附带的jpush信息
        if (getIntent().getData() != null) {
            data = getIntent().getData().toString();
        }

        //获取fcm/oppo/小米/vivo 平台附带的jpush信息
        if (TextUtils.isEmpty(data) && getIntent().getExtras() != null) {
            data = getIntent().getExtras().getString("JMessageExtra");
        }

        Log.w(TAG, "msg content is " + String.valueOf(data));
        if (TextUtils.isEmpty(data)) return;
        try {
            JSONObject jsonObject = new JSONObject(data);
            String msgId = jsonObject.optString(KEY_MSGID);
            byte whichPushSDK = (byte) jsonObject.optInt(KEY_WHICH_PUSH_SDK);
            String title = jsonObject.optString(KEY_TITLE);
            String content = jsonObject.optString(KEY_CONTENT);
            String extras = jsonObject.optString(KEY_EXTRAS);
            StringBuilder sb = new StringBuilder();
            sb.append("msgId:");
            sb.append(String.valueOf(msgId));
            sb.append("\n");
            sb.append("title:");
            sb.append(String.valueOf(title));
            sb.append("\n");
            sb.append("content:");
            sb.append(String.valueOf(content));
            sb.append("\n");
            sb.append("extras:");
            sb.append(String.valueOf(extras));
            sb.append("\n");
            sb.append("platform:");
            sb.append(getPushSDKName(whichPushSDK));
            mTextView.setText(sb.toString());

            //上报点击事件
            JPushInterface.reportNotificationOpened(this, msgId, whichPushSDK);
        } catch (JSONException e) {
            Log.w(TAG, "parse notification error");
        }


    }

    private String getPushSDKName(byte whichPushSDK) {
        String name;
        switch (whichPushSDK) {
            case 0:
                name = "jpush";
                break;
            case 1:
                name = "xiaomi";
                break;
            case 2:
                name = "huawei";
                break;
            case 3:
                name = "meizu";
                break;
            case 4:
                name = "oppo";
                break;
                case 5:
                name = "vivo";
                break;
            case 8:
                name = "fcm";
                break;
            default:
                name = "jpush";
        }
        return name;
    }
}

3、集成成功的标志

D/JIGUANG-JPush: [FCMPushHelper] fcm token is eFPX0mIDzvs:APA91bGUAn6jCSVgT1Y83DP-2Fh_OM2cnqUIecNhUCLyUc3WAV4CalTQCvfTnJmOi900QByUiMQLdEkvi3UklY9g8X6vGLA4G9n0lpymDtTwVnAVh0LUJjdPBlfmSBc85AXhLg2e8BUu
D/JIGUANG-JPush: [ThirdPushManager] doAction,action:action_register_token,bundle:Bundle[{token=eFPX0mIDzvs:APA91bGUAn6jCSVgT1Y83DP-2Fh_OM2cnqUIecNhUCLyUc3WAV4CalTQCvfTnJmOi900QByUiMQLdEkvi3UklY9g8X6vGLA4G9n0lpymDtTwVnAVh0LUJjdPBlfmSBc85AXhLg2e8BUu, platform=8}]
I/JIGUANG-JPush: [ThirdPushManager] uploadRegID regid:eFPX0mIDzvs:APA91bGUAn6jCSVgT1Y83DP-2Fh_OM2cnqUIecNhUCLyUc3WAV4CalTQCvfTnJmOi900QByUiMQLdEkvi3UklY9g8X6vGLA4G9n0lpymDtTwVnAVh0LUJjdPBlfmSBc85AXhLg2e8BUu

上报到极光服务器成功的标志,如果没有以下上报日志,需要检查下集成代码

[PluginPlatformRidUpdate] onUpdateRidSuccess rid:2 ,pluginPlatformRegIDBean:PluginPlatformRegIDBean{pluginPlatformType=8, regid='cn5o2732Qo2bF7HuMimHPO:APA91bEYkKNcxkZjli-LSelq7o0ldXAOXd7iGcTFLQ_pQw-7liV2gc1BwWdpGq_J5VisKGTa_S7PyM8CpPn0kk39JQo87w1_eXZxPT0lOysBkDbqQw-5NXnK86SN9GLLg15QhHu34H0l', rid=2, retryCount=0}

4、FCM 测试方法

  1. 在您的App中集成极光3.2.0及以上版本的SDK,并且按照「第三方通知通道集成指南」集成所需的厂商SDK;
  2. 联系极光销售确认已开通厂商通道,如果成功开通则按照以下截图(极光官网应用信息-推送设置-厂商通道)填写FCM相关参数,保存后启用;

  3. 将技术支持所给的debug版本的jcore替换掉项目中的版本,然后在极光初始化之后加上如下代码:
设置country需要在init之后设置,即在application的oncreate中:
JPushInterface.setDebugMode(true);
JPushInterface.init(this);
JCoreInterface.testCountryCode("us");

  1. 将集成好的App(测试版本)安装在测试机(需要GooglePlay服务为系统服务且版本不低于17.3.4)上,然后翻墙,并且运行App;
  2. 保持App在前台运行,尝试对设备进行推送;
  3. 如果应用收到消息,将App退到后台(进入省电模式,或后台驻留),强行停止应用可能收不到;
  4. 再次进行推送,如果能够收到推送,则表明FCM通道集成成功。

OPPO集成指南

1、使用JCenter自动化集成步骤

 确认androidstudio的Project根目录的主gradle中配置了jcenter支持。(新建project默认配置就支持)。

buildscript{  
     repositories{  
      jcenter()  
    }  
} 

allprojects{  
    repositories{  
      jcenter()   
    }  
}  

在应用module的gradle中dependencies节点添加如下代码:

dependencies{  
        implementation 'cn.jiguang.sdk.plugin:oppo:3.8.5'
     // JPushSDK3.8.5为例(厂商版本和jpush SDK版本保持一致,如果需要升级jpush SDK版本,注意厂商SDK版本的升级)
} 

在应用module的gradle中defaultConfig节点添加如下代码(不要遗漏前缀OP-):

manifestPlaceholders=[  
        JPUSH_PKGNAME:"您应用的包名",
        //设置manifest.xml中的变量  
        OPPO_APPKEY : "OP-您的应用对应OPPO的APPKEY", // OPPO平台注册的appkey
        OPPO_APPID : "OP-您的应用对应OPPO的APPID", // OPPO平台注册的appid
        OPPO_APPSECRET: "OP-您的应用对应OPPO的APPSECRET",//OPPO平台注册的appsecret
 ]

2、配置AndroidManifest.xml集成步骤

        注意:(JCenter自动化集成与配置AndroidManifest.xml集成二者选择一种即可,如果您完成以上步骤,您可以跳过本段)

手动集成主要步骤为:

  • 1. 增加OPPO插件包及OPPO推送包
  • 2. 配置OPPO推送sdk所需要的权限
  • 3. 配置OPPO必须的组件
  • 4. 将OPPO_APPKEY、OPPO_APPID、OPPO_APPSECRET 替换为在OPPO后台注册对应该应用的AppKey/AppID/APPSecret

(1)导入极光的插件包以及OPPO的SDK的jar

        将极光提供的libs包中的jpush-android-plugin-oppo-v3.x.x.jar( JPush 插件包)及mcssdk-x.x.x.jar (OPPO推送包)导入到工程libs/目录下。

注1:极光集成 OPPO 通道在 JPush Android SDK 3.1.5 添加。

注2:oppo推送包,在JPush 3.4.0之前为:com.coloros.mcssdk.jar。JPush 3.4.0适配OPPO SDK的升级,对应OPPO SDK更新为:mcssdk-2.0.2.jar。

注3:JPush 3.3.9版本的JPush可仅更新3.4.0的OPPO插件包即可,无需升级为JPush3.4.0。

注4:OPPO推送包 v2.1.0 版本升级为 com.heytap.msp-push-2.1.0.aar,Jpush v3.6.8 开始支持,与之前版本不兼容

注5:OPPO推送包 v2.1.0 只支持 Android 4.4 或以上版本的手机系统,minsdk 至少要求 19 

(2)配置OPPO推送所需要的权限

 <uses-permission android:name="com.coloros.mcs.permission.RECIEVE_MCS_MESSAGE"/>
         <uses-permission android:name="com.heytap.mcs.permission.RECIEVE_MCS_MESSAGE"/>

(3)配置OPPO 推送的必须的组件

        <!-- since JPushv3.6.8 ,oppov2.1.0 oppo 核心功能-->
          <service android:name="cn.jpush.android.service.PluginOppoPushService"
             android:permission="com.coloros.mcs.permission.SEND_MCS_MESSAGE">
             <intent-filter>
                 <action android:name="com.coloros.mcs.action.RECEIVE_MCS_MESSAGE" />
             </intent-filter>
         </service>

         <!-- since JPushv3.6.8 ,oppov2.1.0 oppo 核心功能-->
         <service
             android:name="com.heytap.msp.push.service.DataMessageCallbackService"
             android:permission="com.heytap.mcs.permission.SEND_PUSH_MESSAGE">
 
             <intent-filter>
                 <action android:name="com.heytap.mcs.action.RECEIVE_MCS_MESSAGE"/>
 
                 <action android:name="com.heytap.msp.push.RECEIVE_MCS_MESSAGE"/>
             </intent-filter>
         </service> <!--兼容Q版本-->

(4)配置OPPO 推送的相关参数(不要遗漏前缀OP-)

<meta-data android:name="OPPO_APPKEY"
           android:value="OP-您的应用对应的OPPO的APPKEY" />

 <meta-data android:name="OPPO_APPID"
            android:value="OP-您的应用对应的OPPO的APPID" />

 <meta-data android:name="OPPO_APPSECRET"
            android:value="OP-您的应用对应的OPPO的APPSECRET" /> 

(5)在工程的build.gradle文件中添加如下配置代码

dependencies {
    ...
    implementation fileTree(include: ['*.jar'], dir: 'libs')

    ...
    implementation(name: 'com.heytap.msp-push-2.1.0', ext: 'aar')
    ...  

}
android {
    ...

    repositories {
        flatDir {
            dirs 'libs'
        }
    }

}

3、OPPO SDK的编译混淆问题

        如果使用了proguard,需要在配置文件中加入,可以防止一个误报的warning导致无法成功

  -dontwarn com.coloros.mcsdk.**
	-keep class com.coloros.mcsdk.** { *; }
    
	-dontwarn com.heytap.**
	-keep class com.heytap.** { *; }
	    
	-dontwarn com.mcs.**
  -keep class com.mcs.** { *; }

4、通知内容长度兼容

  • 功能说明

        由于 OPPO 官方的通知内容长度限制为200个字数以内(中英文都算一个),当通知内容(极光的“alert”字段的值)长度超过200字,OPPO 通道会推送失败。此时调用极光api推送通知,请在payload 中的 "notification" 的 "android" 节点的"extras"节点添加以下字段:

Key

类型

示例

说明

oppns_content_forshort

String

"short content"

通知内容(极光的“alert”字段)长度超过200个字时,请在此字段的值传入不超过200个字的通知内容。

 json示例代码:

{
    "platform": [
        "android"
    ],
    "audience": "all",
    "notification": {
        "android": {
            "alert": "在国内 Android 生态中,推送通道都是由终端与云端之间的长链接来维持,严重依赖于应用进程的存活状态。如今一些手机厂家会在自家 rom 中做系统级别的推送通道,再由系统分发给各个 app,以此提高在自家 rom 上的推送送达率。JPush SDK 为了尽可能提高开发者在各类 rom 上的推送送达率,对使用 ColorOS 的设备推送,自动切换到OPPO通道。同时,为了保证 SDK 的易用性,原本 JPush 的所有接口调用逻辑都不用修改,JPush 会对自身支持的功能做兼容.只需在manifest中配置上 OPPO SDK 必须的配置组件即可.",
            "title": "概述",
            "uri_activity": "com.HuananThirdPush.cn.OpenClickActivity",
            "extras": {
                "oppns_content_forshort": "在国内 Android 生态中,推送通道都是由终端与云端之间的长链接来维持,严重依赖于应用进程的存活状态。"
            }
        }

    },
    "message": {
        "msg_content": "自定义消息内容003"
    }
}

5、点击通知跳转到指定Activity 

 (见FCM集成指南第2点)

6、集成结果判断

        成功

        JPush集成OPPO sdk成功 打印日志:

D/JIGUANG-JPush: [PluginOppoPushService] processMessage type:4105,messageID:0,taskID:null,appPackage:xxxxxxx,registerID:null,sdkVersion:null,command:12289,responseCode:0,content:CN_7a4511397d4b453e19abf6f0ada40c99
[OPushCallback] OPush registerID is CN_7a4511397d4b453e19abf6f0ada40c99

7、OPPO厂商通道测试方法

  1. 在您的App中集成极光3.2.0及以上版本的SDK,并且按照「第三方通知通道集成指南」集成所需的厂商SDK;
  2. 联系极光技术支持确认已在极光的后台配置好了相关的应用信息。如果开通成功了再进行下一个步骤;

  1. 将集成好的App(测试版本)安装在测试机(需要运行 ColorOS版本 3.1及以上的手机)上,并且运行App
  2. 保持App在前台运行,尝试对设备进行推送;
  3. 如果应用收到消息,将App退到后台,并且杀掉所有App进程;
  4. 再次进行推送,如果能够收到推送,则表明厂商通道集成成功。

vivo集成指南

1、使用JCenter自动化集成步骤

确认androidstudio的Project根目录的主gradle中配置了jcenter支持。(新建project默认配置就支持)

 buildscript{
      repositories{
      jcenter() 
      }
}

allprojects{
      repositories{
      jcenter() 
      } 
}

在应用module的gradle中dependencies节点添加如下码:

dependencies{
          implementation 'cn.jiguang.sdk.plugin:vivo:3.8.5'
  // JPushSDK3.8.5为例(厂商版本和jpush SDK版本保持一致,如果需要升级jpush SDK版本,注意厂商SDK版本的升级)
   
 }

在应用 module 的 gradle 中 defaultConfig 节点添加如下代码:

manifestPlaceholders=
    JPUSH_PKGNAME:"您的应用包名",
    //设置manifest.xml中的变量
    VIVO_APPKEY : "您应用对应的vivo AppKey", // VIVO平台注册的appkey
    VIVO_APPID : "您应用对应的 vivo AppID", // VIVO平台注册的appid
]

2、配置AndroidManifest.xml集成步骤

     注意:(JCenter自动化集成与配置AndroidManifest.xml集成二者选择一种即可,如果您完成以上步骤,您可以跳过本段)

手动配置主要步骤为:

  • 1. 增加VIVO插件包及VIVO推送包
  • 2. 配置VIVO必须的组件
  • 3. 将VIVO_APPKEY、VIVO_APPID 替换为在VIVO后台注册对应该应用的AppKey/AppID

导入极光的插件包以及vivo的SDK的jar

(1)将极光提供的libs包中的jpush-android-plugin-vivo-v3.x.x.jar (JPush插件包)及pushsdk_v2.x.x.jar  (vivo推送包)导入到工程libs/目录下。 

  注1:极光集成 VIVO 通道在 JPush Android SDK 3.2.0 添加,vivo sdk版本为:pushsdk_v2.3.1.jar。

  注2:JPush Android SDK 3.5.8 更新vivo sdk版本为:push_sdk_v2.9.0.jar。

(2)配置vivo 推送的必须的组件

<receiver android:name="cn.jpush.android.service.PluginVivoMessageReceiver">
        <intent-filter>
          <!-- 接收push 消息 -->
            <action android:name="com.vivo.pushclient.action.RECEIVE" />
        </intent-filter>
</receiver>
<service
    android:name="com.vivo.push.sdk.service.CommandClientService"
    android:exported="true" />
<activity
    android:name="com.vivo.push.sdk.LinkProxyClientActivity"
    android:exported="false"
    android:screenOrientation="portrait"
    android:theme="@android:style/Theme.Translucent.NoTitleBar" /> 

(3)配置vivo 推送的相关参数

<meta-data android:name="com.vivo.push.api_key"
           android:value="您应用对应的vivo的AppKey" /> 
<meta-data android:name="com.vivo.push.app_id"
           android:value="您应用对应的vivo的AppID" />

3.vivo SDK的编译混淆问题

若需要混淆 app,请在混淆文件中添加以下说明,防止 SDK 内容被二次混淆.

-dontwarn com.vivo.push.**
-keep class com.vivo.push.**{*; }
-keep class com.vivo.vms.**{*; }

4.点击通知跳转到指定Activity

(见小米集成指南第4点)

5.集成结果判断

成功

JPush集成vivo sdk成功 打印日志:

I/JIGUANG-JPush: [PluginPlatformRidUpdate] onUpdateRidSuccess rid:18263
,pluginPlatformRegIDBean:PluginPlatformRegIDBean{pluginPlatformType=5,
regid='15480619114881085348378', rid=18263, retryCount=0}

6、vivo厂商通道测试方法

1. 在您的App中集成极光3.3.4及以上版本的SDK,并且按照「第三方通知通道集成指南」集成所需的厂商SDK;

2. 联系极光销售确认已开通厂商通道,如果成功开通则按照以下截图填写魅族相关参数,保存后启用;

3. 将集成好的App(测试版本)安装在测试机(需要支持vivo推送的设备)上,并且运行App;

4. 保持App在前台运行,尝试对设备进行推送;

5. 如果应用收到消息,将App退到后台,并且杀掉所有App进程;

6. 再次进行推送,如果能够收到推送,则表明厂商通道集成成功。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/181917.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ffmpeg为mkv封装格式的音视频文件添加内挂字幕

现在好莱坞的电影&#xff0c;都是全球看&#xff0c;一个地区的人看电影时&#xff0c;电影屏幕上应该展示对应的本地区语言字幕。故电影画面在不同的地区&#xff0c;需要配置不同的语言字幕。故视频画面里面的字幕应该可以拆出来&#xff0c;不能像老版三国演义&#xff0c;…

数据中心Spine/Leaf+VXLAN的结构

大家过年好&#xff0c;我是技福的小咖老师。今天我们继续聊聊网络架构。 随着业务系统对IT基础设备灵活度要求的不断提升&#xff0c;云计算、大数据以及虚拟化等技术在新型数据中心的建设中发挥着重要作用。如何更好地满足数据中心计算资源灵活调配以及服务扩展&#xff0c;…

C语言块级变量

所谓代码块&#xff0c;就是由{ }包围起来的代码。代码块在C语言中随处可见&#xff0c;例如函数体、选择结构、循环结构等。不包含代码块的C语言程序根本不能运行&#xff0c;即使最简单的C语言程序&#xff08;上节已经进行了展示&#xff09;也要包含代码块。C语言允许在代码…

不就是Java吗之 认识异常

认识异常一、异常的概念与体系结构1.1 异常的概念1.2 异常的体系结构1.3 异常的分类1.3.1 编译时异常(受查异常)1.3.2 运行时异常(非受查异常)二、异常的处理2.1 防御型编程2.1.1 LBYL2.1.2 EAFP2.2 异常的抛出2.3 异常的捕获2.3.1 异常的声明2.3.2 try-catch捕获并处理2.3.3 f…

linux gui版本控制工具对比

linux gui版本控制工具对比qgitungitgitgsublime mergegitKrakengitAhead tkdiff之前一直用windows开发, 最近想用linux开发, 选版本控制工具的时候考察了以下几款可以在linux平台上使用的版本控制工具, 还是觉得tortoise好用. 记录下它们的优缺点. 想起以前一位同事说过的话,…

Elasticsearch:将数据从 Elasticsearch 和 Kibana 导出到 Pandas Dataframe

在这篇文章中&#xff0c;我们将看到如何从 Elasticsearch 索引和 Kibana 的 CSV 报告中导出数据 - post-url 到 pandas 数据帧。 数据的可视化可以在 Kibana 中完成&#xff0c;但如果你想对数据进行更精细的分析并创建更动态的可视化&#xff0c;将数据导出到 pandas datafra…

LeetCode 55. 跳跃游戏 45. 跳跃游戏 II 22. 括号生成 53. 最大子数组和

&#x1f308;&#x1f308;&#x1f604;&#x1f604; 55. 跳跃游戏 一、力扣示例 二、解决办法 三、代码实现 45. 跳跃游戏 II 一、力扣示例 二、解决办法 三、代码实现 22. 括号生成 一、力扣示例 二、解决办法 三、代码实现 53. 最大子数组和 一、力扣示例 …

WebAssembly编译之(3)-WASM编译实战之C/C++导出asm.js及wasm库

引言 上一节我们介绍了Ubuntu下的WASM的编译环境快速搭建。这一节我们继续WASM编译相关的介绍——如何导出C/C编写的函数库 WASM 相关文档&#xff1a; WebAssembly编译之(1)-asm.js及WebAssembly原理介绍 WebAssembly编译之(2)-Ubuntu搭建WASM编译环境 单个C文件(*.cpp)的导出…

每日学术速递1.28

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 今天带来的arXiv上最新发表的3篇AI论文。 Subjects: cs.AI、cs.Cv 1.Revisiting Temporal Modeling for CLIP-based Image-to-Video Knowledge Transferring 标题&#xff1a;重新审视基于CLIP的图像-视…

计讯物联5G工业级路由器在智慧消防的功能解析

据悉&#xff0c;国务院安全生产委员会印发《“十四五”国家消防工作规划》&#xff08;以下简称《规划》&#xff09;&#xff0c;对“十四五”时期消防改革发展作出全面部署。《规划》提出&#xff0c;坚持防消一体、防救并重&#xff1b;加强改革创新&#xff0c;加快消防“…

11 Day : 编写操作系统中断程序,加快时钟

前言&#xff1a;昨天学习了中断&#xff0c;今天就废话不多说&#xff0c;直接编写程序吧 内容更新&#xff1a;之前有朋友说看不太懂我的代码写的是啥&#xff0c;能不能详细讲讲&#xff0c;所以本期开始我会详细讲解代码&#xff0c;也会同步更新之前的博客&#xff0c;大多…

java基础巩固-宇宙第一AiYWM:为了维持生计,做项目经验之~高速项目大数据及机器学习算法方面的思路总结~整起

原始项目可能主要的功能是接收下位机传送来的很多参数&#xff0c;然后将参数以不同形式表达出来&#xff0c;在此过程中会涉及到文件上传下载、excel表格导出…等&#xff0c;但是呢&#xff0c;这么多数据不玩一下岂不是太浪费。于是&#xff0c;额们决定这样来: 项目中有一个…

Metasploit工具使用(上)

Metasploit工具使用1.Metasploit简介1.1.Metasploit下载1.2.Metasploit框架结构1.2.1.框架路径1.2.2.框架内容介绍1.2.2.1.data目录文件1.2.2.2.modules目录文件1.2.2.3.scripts目录文件1.2.2.4.tools目录文件1.2.2.5.plugins目录文件1.3.Metasploit更新2.MSF中数据库设置2.1.数…

动态与静态函数库的的使用 和 区别 及 优缺点

这里写目录标题初识静态库与动态库静态函数库动态函数库初识静态库与动态库 静态函数库与动态函数库的使用中&#xff0c;有人也把他称为程序的静态链接及动态链接。 静态链接&#xff1a;指程序链接时使用静态库的链接方式&#xff0c;把所有需要的库函数加入&#xff08;拷贝…

Vue3商店后台管理系统设计文稿篇(七)

记录使用vscode构建Vue3商店后台管理系统&#xff0c;这是第七篇&#xff0c;主要记录系统登录页面的创建过程&#xff0c;包含完整vue登录页面代码&#xff1b;Vuex的相关知识以及具体的使用&#xff0c;对state中值得获取&#xff0c;修改&#xff0c;异步修改&#xff0c;分…

Gradle学习笔记之Hook生命周期

简介 Gradle生命周期中的hook&#xff08;钩子&#xff09;函数是由gradle自动回调的&#xff0c;可以用来帮助我们实现一些功能&#xff1a; Gradle在生命周期各个阶段都提供了用于回调的钩子函数: Gradle初始化阶段: 在settings.gradle执行完后&#xff0c;会回调Gradle对…

2022爱分析・智能客服厂商全景报告 | 爱分析报告

报告编委 张扬 爱分析联合创始人&首席分析师 文鸿伟 爱分析高级分析师 王鹏 爱分析分析师 目录 研究范围定义厂商全景地图市场分析与厂商评估入选厂商列表研究范围定义 研究范围 在数字化快速发展的大背景下&#xff0c;随着消费人群及其消费意识的转变&#xff0c;客户对…

亚马逊云科技凭借多年云业务经验,协同合作伙伴快速展开生态化创新

在过去的两周里&#xff0c;ChatGPT的热度居高不下&#xff0c;引发全网讨论。虽然AlphaGo这类AI产品也曾引起热议&#xff0c;但是在应用层面终究还是离用户太远了。而ChatGPT更像是「民用级」的产品&#xff0c;真正意义上让AI技术跨入广泛破圈应用时代。在当下&#xff0c;机…

大数据-Hive

第1章 Hive入门 1.1 什么是Hive 1&#xff09;Hive简介 Hive是由Facebook开源&#xff0c;基于Hadoop的一个数据仓库工具&#xff0c;可以将结构化的数据文件映射为一张表&#xff0c;并提供类SQL查询功能。 2&#xff09;Hive本质 Hive是一个Hadoop客户端&#xff0c;用于…

springboot项目解决@ResponseBody注解返回xml格式数据而不是json格式的问题

目录 1.说明 2.解决 1.说明 一般情况下&#xff0c;RestController中的接口默认响应数据格式都是 json 格式的数据&#xff0c;但有时候使用某些依赖包&#xff0c;会影响ResponseBody的响应数据类型为xml格式&#xff0c; 例&#xff1a; 2.解决 但我们希望响应数据格式是…