小米集成指南
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、小米厂商通道测试方法
- 在您的App中集成极光3.2.0及以上版本的SDK,并且按照「第三方通知通道集成指南」集成所需的厂商SDK
- 联系极光销售确认已开通厂商通道,如果成功开通则按照以下截图(极光官网-应用信息-推送设置-厂商通道)填写小米相关参数,保存后启用;
- 保持App在前台运行,尝试对设备进行推送;
- 如果应用收到消息,将App退到后台,并且杀掉所有App进程;
- 再次进行推送,如果能够收到推送,则表明厂商通道集成成功。
华为集成指南
主要步骤为:
- 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.华为厂商测试方法 (测试前请务必确认华为控制台推送服务--服务状态请确认为开通,具体可以参考厂商通道相关参数申请教程--华为相关参数获取部分)
- 在您的App中集成极光3.2.0及以上版本的SDK,并且按照「第三方通知通道集成指南」集成所需的厂商SDK;
- 联系极光销售确认已开通厂商通道,如果成功开通则按照以下截图(极光官网应用信息-推送设置-厂商通道)填写华为相关参数,保存后启用;
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 测试方法
- 在您的App中集成极光3.2.0及以上版本的SDK,并且按照「第三方通知通道集成指南」集成所需的厂商SDK;
- 联系极光销售确认已开通厂商通道,如果成功开通则按照以下截图(极光官网应用信息-推送设置-厂商通道)填写FCM相关参数,保存后启用;
- 将技术支持所给的debug版本的jcore替换掉项目中的版本,然后在极光初始化之后加上如下代码:
设置country需要在init之后设置,即在application的oncreate中: JPushInterface.setDebugMode(true); JPushInterface.init(this); JCoreInterface.testCountryCode("us");
- 将集成好的App(测试版本)安装在测试机(需要GooglePlay服务为系统服务且版本不低于17.3.4)上,然后翻墙,并且运行App;
- 保持App在前台运行,尝试对设备进行推送;
- 如果应用收到消息,将App退到后台(进入省电模式,或后台驻留),强行停止应用可能收不到;
- 再次进行推送,如果能够收到推送,则表明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厂商通道测试方法
- 在您的App中集成极光3.2.0及以上版本的SDK,并且按照「第三方通知通道集成指南」集成所需的厂商SDK;
- 联系极光技术支持确认已在极光的后台配置好了相关的应用信息。如果开通成功了再进行下一个步骤;
- 将集成好的App(测试版本)安装在测试机(需要运行 ColorOS版本 3.1及以上的手机)上,并且运行App
- 保持App在前台运行,尝试对设备进行推送;
- 如果应用收到消息,将App退到后台,并且杀掉所有App进程;
- 再次进行推送,如果能够收到推送,则表明厂商通道集成成功。
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. 再次进行推送,如果能够收到推送,则表明厂商通道集成成功。