一、前言:
首先极光推送对各个厂商通道对接是没有在开发者平台提供文档的,需要申请VIP资格后,极光才会提供对应对接文档。
1、极光普通集成
1、步骤1
2、步骤2
3、步骤3
4、步骤4
5、步骤5
注意:下载集成的SDK,导入到项目中。
6、权限
<!-- Required -->
<permission
android:name="您应用的包名.permission.JPUSH_MESSAGE"
android:protectionLevel="signature" />
<!-- Required -->
<uses-permission android:name="您应用的包名.permission.JPUSH_MESSAGE" />
<uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- Optional. Required for location feature -->
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <!-- 用于开启 debug 版本的应用在 6.0 系统上的层叠窗口权限 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.VIBRATE" />
<!-- 极光推送 -->
<!--华为推送配置-->
<meta-data
android:name="com.huawei.hms.client.appid"
android:value="104398523"/>
<meta-data
android:name="com.huawei.hms.client.cpid"
android:value="2850086000435121118"/>
<!-- Since JCore2.0.0 Required SDK核心功能-->
<!-- 可配置android:process参数将Service放在其他进程中;android:enabled属性不能是false -->
<!-- 这个是自定义Service,要继承极光JCommonService,可以在更多手机平台上使得推送通道保持的更稳定 -->
<service android:name=".util.jpush.PushService"
android:enabled="true"
android:exported="false"
android:process=":pushcore">
<intent-filter>
<action android:name="cn.jiguang.user.service.action" />
</intent-filter>
</service>
<!-- Required since 3.0.7 -->
<!-- 新的 tag/alias 接口结果返回需要开发者配置一个自定的广播 -->
<!-- 3.3.0开始所有事件将通过该类回调 -->
<!-- 该广播需要继承 JPush 提供的 JPushMessageReceiver 类, 并如下新增一个 Intent-Filter -->
<receiver
android:name=".util.jpush.PushMessageReceiver"
android:enabled="true"
android:exported="false" >
<intent-filter>
<action android:name="cn.jpush.android.intent.RECEIVE_MESSAGE" />
<category android:name="com.onepiece.phonefangdajing" />
</intent-filter>
</receiver>
7、PushService
public class PushService extends JCommonService {
}
8、PushMessageReceiver
public class PushMessageReceiver extends JPushMessageReceiver {
private static final String TAG = "PushMessageReceiver";
@Override
public void onMessage(Context context, CustomMessage customMessage) {
Log.e(TAG, "[onMessage] " + customMessage);
Intent intent = new Intent("com.jiguang.demo.message");
intent.putExtra("msg", customMessage.message);
context.sendBroadcast(intent);
}
@Override
public void onNotifyMessageOpened(Context context, NotificationMessage message) {
Log.e(TAG, "[onNotifyMessageOpened] " + message);
try{
//打开自定义的Activity
Intent intent = new Intent(context, StartActivity.class);
Bundle bundle = new Bundle();
bundle.putString(JPushInterface.EXTRA_NOTIFICATION_TITLE,message.notificationTitle);
bundle.putString(JPushInterface.EXTRA_ALERT,message.notificationContent);
intent.putExtras(bundle);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP );
context.startActivity(intent);
}catch (Throwable throwable){
throwable.fillInStackTrace();
}
}
@Override
public void onMultiActionClicked(Context context, Intent intent) {
Log.e(TAG, "[onMultiActionClicked] 用户点击了通知栏按钮");
String nActionExtra = intent.getExtras().getString(JPushInterface.EXTRA_NOTIFICATION_ACTION_EXTRA);
//开发者根据不同 Action 携带的 extra 字段来分配不同的动作。
if (nActionExtra == null) {
Log.d(TAG, "ACTION_NOTIFICATION_CLICK_ACTION nActionExtra is null");
return;
}
if (nActionExtra.equals("my_extra1")) {
Log.e(TAG, "[onMultiActionClicked] 用户点击通知栏按钮一");
} else if (nActionExtra.equals("my_extra2")) {
Log.e(TAG, "[onMultiActionClicked] 用户点击通知栏按钮二");
} else if (nActionExtra.equals("my_extra3")) {
Log.e(TAG, "[onMultiActionClicked] 用户点击通知栏按钮三");
} else {
Log.e(TAG, "[onMultiActionClicked] 用户点击通知栏按钮未定义");
}
}
@Override
public void onNotifyMessageArrived(Context context, NotificationMessage message) {
//1、不用点击,直接收到
Log.e(TAG, "[onNotifyMessageArrived] " + message);
}
@Override
public void onNotifyMessageDismiss(Context context, NotificationMessage message) {
Log.e(TAG, "[onNotifyMessageDismiss] " + message);
}
@Override
public void onRegister(Context context, String registrationId) {
Log.e(TAG, "[onRegister] " + registrationId);
Intent intent = new Intent("com.jiguang.demo.register");
context.sendBroadcast(intent);
}
@Override
public void onConnected(Context context, boolean isConnected) {
Log.e(TAG, "[onConnected] " + isConnected);
}
@Override
public void onCommandResult(Context context, CmdMessage cmdMessage) {
Log.e(TAG, "[onCommandResult] " + cmdMessage);
}
@Override
public void onTagOperatorResult(Context context, JPushMessage jPushMessage) {
//TagAliasOperatorHelper.getInstance().onTagOperatorResult(context,jPushMessage);
super.onTagOperatorResult(context, jPushMessage);
}
@Override
public void onCheckTagOperatorResult(Context context, JPushMessage jPushMessage) {
// TagAliasOperatorHelper.getInstance().onCheckTagOperatorResult(context,jPushMessage);
super.onCheckTagOperatorResult(context, jPushMessage);
}
@Override
public void onAliasOperatorResult(Context context, JPushMessage jPushMessage) {
//TagAliasOperatorHelper.getInstance().onAliasOperatorResult(context,jPushMessage);
super.onAliasOperatorResult(context, jPushMessage);
}
@Override
public void onMobileNumberOperatorResult(Context context, JPushMessage jPushMessage) {
//TagAliasOperatorHelper.getInstance().onMobileNumberOperatorResult(context,jPushMessage);
super.onMobileNumberOperatorResult(context, jPushMessage);
}
@Override
public void onNotificationSettingsCheck(Context context, boolean isOn, int source) {
super.onNotificationSettingsCheck(context, isOn, source);
Log.e(TAG, "[onNotificationSettingsCheck] isOn:" + isOn + ",source:" + source);
}
}
二、其它厂商集成:
1、小米通道对接:
1.在小米开发者平台申请对应推送账号 appId key 等
2 增加小米插件包及小米推送包
3 配置小米推送sdk所需要的权限
4 配置小米必须的组件
5 配置JPush接受的小米sdk的消息接受类
6 将XIAOMI_APPKEY与XIAOMI_APPID替换为在小米后台注册对应该应用的AppKey/AppID
2、华为通道对接:
1添加 Huawei SDK 到项目中
2 配置接收 HMS 消息的广播接收器
3 在build.gradle中配置在华为后台添加的指纹证书对应的签名
三、华为厂商集成:
1、添加 Huawei SDK 到项目中
-
拷贝third-push/huawei/libs中的插件包(jpush-android-plugin-huawei-v3.x.x.jar)到工程libs目录下
注意:也可使用jcenter集成方式,无需拷贝jpush-android-plugin-huawei-v3.x.x.jar文件,也无需配置cn.jpush.android.service.PluginHuaweiPlatformsService组件
-
示例:implementation 'cn.jiguang.sdk.plugin:huawei:3.x.x'
- 在 Huawei 上创建和 JPush 上同包名的待发布应用,创建完成后下载该应用的 agconnect-services.json 配置文件并添加到应用的 module 目录下。
1、在根级 build.gradle 中添加规则,以纳入 HMS 服务插件 和 华为 的 Maven 代码库,可根据华为开发者联盟发布的版本更新选择最新版本:
buildscript{
repositories {
google()
jcenter()
// hms
maven { url 'http://developer.huawei.com/repo/'}
}
}
buildscript {
dependencies {
// hms
classpath 'com.huawei.agconnect:agcp:1.4.1.300'
}
}
allprojects {
repositories {
google()
jcenter()
// hms
maven { url 'http://developer.huawei.com/repo/'}
}
}
- 2、在应用 module 的 build.gradle 文件底部添加 apply plugin 代码行,以启用 gradle 插件:
apply plugin: 'com.huawei.agconnect'
- 3、在应用 module 的 gradle 中 dependencies 节点添加如下代码,可根据 华为 发布的版本更新选择最新版本:
dependencies {
implementation 'com.huawei.hms:push:4.0.2.300'
//引入极光-华为插件,如果采用此配置,无需拷贝jpush-android-plugin-huawei-v3.x.x.jar文件,也无需配置cn.jpush.android.service.PluginHuaweiPlatformsService组件
//引入SDK重复了,可以注释调
implementation 'cn.jiguang.sdk.plugin:huawei:4.0.0'
}
1.下面注意:签名的SHA256的内容配置到华为应用市场的app项目中
注:指纹证书是在终端采用keytool -list -v -keystore keystorefileName 获取偶对应的指纹证书.获取结果如下:
这是华为应用市场的页面
2.记得必须要签名后的包
signingConfigs {
release {
storeFile file("release.keystore")//签名文件的path
storePassword "123456"
keyAlias "android.keystore"
keyPassword "123456"
}
}
buildTypes {
release {
minifyEnabled true
proguardFiles 'proguard-rules.pro'
signingConfig signingConfigs.release
}
debug{
minifyEnabled false
signingConfig signingConfigs.release
}
}
3.下面是在华为推送平台去创建账号 信息以及config文件,华为开发者地址
https://developer.huawei.com/consumer/cn/service/josp/agc/index.html?cid=1&tid=13&id=9249519184595935890#/myApp/103194983/9249519184596012000
4.在我的项目中获取当前需要添加配置的参数
5.添加刚刚生成的sha256
6.注意:拷贝你获取的参数 ,下载 agconnect-services.json
讲下载的agconnect-services.json 放在主项目目录下:
7.根据配置运行查看log 是否配置成功
注意:发现自己的log跟别人不一样
8.打开华为开发者平台,开通推送服务
可以测试推送了,查看日志:
3、此时如果像上图那样 就表示成功了,但应该不会成功,嘿嘿,接下来 有两个坑点:
1、极光推送平台需要配置你各推送平台申请的key ,但文档并没有说明:
2、对上面添加的agconnect-services.json 虽然放在主工程目录下了,并不一定能读取成功,这时候你还需要添加配置防止解析不到agconnect-services.json 导致初始化失败:
<meta-data
android:name="com.huawei.hms.client.appid"
android:value="配置文件里面的appID"/>
<meta-data
android:name="com.huawei.hms.client.cpid"
android:value="配置文件里面的cpid"/>
其他通道类似小米一样根据VIP文档依次复制就行了,最终厂商通道点击通知activity 跳转都会进入:OpenClickActivity
---------------------------------------是极光推送生成的文档--------------------------------
三、极光选择小米和华为厂商生成的文档:
一、添加工程配置
1、Project 根目录的主 gradle
确认 android studio 的 Project 根目录的主 gradle 中配置了 mavenCentral 支持(新建 project 默认配置就支持),配置华为和 FCM Maven 代码库,,可根据华为和 FCM 发布的版本更新选择最新版本:
buildscript {
repositories {
google()
jcenter()
mavenCentral()
// hms
maven { url 'http://developer.huawei.com/repo/'}
// fcm
maven { url "https://maven.google.com" }
}
dependencies {
// fcm
classpath 'com.google.gms:google-services:4.3.4'
// hms
classpath 'com.huawei.agconnect:agcp:1.4.1.300'
}
}
allprojects {
repositories {
google()
jcenter()
mavenCentral()
//hms
maven {url 'http://developer.huawei.com/repo/'}
//fcm
maven { url "https://maven.google.com" }
}
}
2、module 的 gradle配置
在 module 的 gradle 中添加依赖和 AndroidManifest 的替换变量,集成极光推送SDK和厂商通道SDK,其中厂商组合选择所需的通道即可。
android {
......
defaultConfig {
applicationId "com.xxx.xxx" //JPush 上注册的包名.
......
ndk {
//选择要添加的对应 cpu 类型的 .so 库。
abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a'
// 还可以添加 'x86', 'x86_64', 'mips', 'mips64'
}
manifestPlaceholders = [
JPUSH_PKGNAME : applicationId,
JPUSH_APPKEY : "你的 Appkey ", //JPush 上注册的包名对应的 Appkey.
JPUSH_CHANNEL : "developer-default", //暂时填写默认值即可.
MEIZU_APPKEY : "MZ-魅族的APPKEY",
MEIZU_APPID : "MZ-魅族的APPID",
XIAOMI_APPID : "MI-小米的APPID",
XIAOMI_APPKEY : "MI-小米的APPKEY",
OPPO_APPKEY : "OP-oppo的APPKEY",
OPPO_APPID : "OP-oppo的APPID",
OPPO_APPSECRET : "OP-oppo的APPSECRET",
VIVO_APPKEY : "vivo的APPKEY",
VIVO_APPID : "vivo的APPID"
]
......
}
......
}
dependencies {
......
implementation 'cn.jiguang.sdk:jcore:2.7.2' // 此处以JCore 2.7.2 版本为例。
implementation 'cn.jiguang.sdk:jpush:4.0.0' // 此处以JPush 4.0.0 版本为例
// 接入华为厂商
implementation 'com.huawei.hms:push:4.0.2.300'
implementation 'cn.jiguang.sdk.plugin:huawei:4.0.0'// 极光厂商插件版本与接入 JPush 版本保持一致,下同
// 接入 FCM 厂商
implementation 'com.google.firebase:firebase-messaging:21.0.1'
implementation 'cn.jiguang.sdk.plugin:fcm:4.0.0'
// 接入魅族厂商
implementation 'cn.jiguang.sdk.plugin:meizu:4.0.0'
// 接入 VIVO 厂商
implementation 'cn.jiguang.sdk.plugin:vivo:4.0.0'
// 接入 OPPO 厂商
implementation 'cn.jiguang.sdk.plugin:oppo:4.0.0'
// 接入小米厂商
implementation 'cn.jiguang.sdk.plugin:xiaomi:4.0.0'
......
}
apply plugin: 'com.google.gms.google-services'
apply plugin: 'com.huawei.agconnect'
3、应用 Module 配置
如果选择的厂商通道包含了HUAWEI厂商通道和FCM厂商通道,则需要额外执行以下操作,若未选择可忽略本步骤。
FCM:在 Firebase 上创建和 JPush 上同包名的待发布应用,创建完成后下载该应用的 google-services.json 配置文件并添加到应用的 module 目录下。
HUAWEI:在 Huawei 上创建和 JPush 上同包名的待发布应用,创建完成后下载该应用的 agconnect-services.json 配置文件并添加到应用的 module 目录下。
二 、配置推送必须组件
在 AndroidManifest 中配置一个Service,以在更多手机平台上获得更稳定的支持,示例如下:
<!-- Since JCore2.0.0 Required SDK核心功能-->
<!-- 可配置android:process参数将Service放在其他进程中;android:enabled属性不能是false -->
<!-- 这个是自定义Service,要继承极光JCommonService,可以在更多手机平台上使得推送通道保持的更稳定 -->
<service android:name="xx.xx.PushService "
android:enabled="true"
android:exported="false"
android:process=":pushcore">
<intent-filter>
<action android:name="cn.jiguang.user.service.action" />
</intent-filter>
</service>
//PushService 类
public class PushService extends JCommonService {
}
从JPush3.0.7开始,需要配置继承JPushMessageReceiver的广播,原来如果配了MyReceiver现在可以弃用。示例如下。
<!-- Required since 3.0.7 -->
<!-- 新的 tag/alias 接口结果返回需要开发者配置一个自定的广播 -->
<!-- 3.3.0开始所有事件将通过该类回调 -->
<!-- 该广播需要继承 JPush 提供的 JPushMessageReceiver 类, 并如下新增一个 Intent-Filter -->
<receiver
android:name="自定义 PushMessageReceiver"
android:enabled="true"
android:exported="false" >
<intent-filter>
<action android:name="cn.jpush.android.intent.RECEIVE_MESSAGE" />
<category android:name="您应用的包名" />
</intent-filter>
</receiver>
// PushMessageReceiver类
public class PushMessageReceiver extends JPushMessageReceiver {
private static final String TAG = "PushMessageReceiver";
@Override
public void onMessage(Context context, CustomMessage customMessage) {
Log.e(TAG, "[onMessage] " + customMessage);
Intent intent = new Intent("com.jiguang.demo.message");
intent.putExtra("msg", customMessage.message);
context.sendBroadcast(intent);
}
@Override
public void onNotifyMessageOpened(Context context, NotificationMessage message) {
Log.e(TAG, "[onNotifyMessageOpened] " + message);
try{
//打开自定义的Activity
Intent i = new Intent(context, StartActivity.class);
Bundle bundle = new Bundle();
bundle.putString(JPushInterface.EXTRA_NOTIFICATION_TITLE,message.notificationTitle);
bundle.putString(JPushInterface.EXTRA_ALERT,message.notificationContent);
i.putExtras(bundle);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP );
context.startActivity(i);
}catch (Throwable throwable){
}
}
@Override
public void onMultiActionClicked(Context context, Intent intent) {
Log.e(TAG, "[onMultiActionClicked] 用户点击了通知栏按钮");
String nActionExtra = intent.getExtras().getString(JPushInterface.EXTRA_NOTIFICATION_ACTION_EXTRA);
//开发者根据不同 Action 携带的 extra 字段来分配不同的动作。
if (nActionExtra == null) {
Log.d(TAG, "ACTION_NOTIFICATION_CLICK_ACTION nActionExtra is null");
return;
}
if (nActionExtra.equals("my_extra1")) {
Log.e(TAG, "[onMultiActionClicked] 用户点击通知栏按钮一");
} else if (nActionExtra.equals("my_extra2")) {
Log.e(TAG, "[onMultiActionClicked] 用户点击通知栏按钮二");
} else if (nActionExtra.equals("my_extra3")) {
Log.e(TAG, "[onMultiActionClicked] 用户点击通知栏按钮三");
} else {
Log.e(TAG, "[onMultiActionClicked] 用户点击通知栏按钮未定义");
}
}
@Override
public void onNotifyMessageArrived(Context context, NotificationMessage message) {
Log.e(TAG, "[onNotifyMessageArrived] " + message);
}
@Override
public void onNotifyMessageDismiss(Context context, NotificationMessage message) {
Log.e(TAG, "[onNotifyMessageDismiss] " + message);
}
@Override
public void onRegister(Context context, String registrationId) {
Log.e(TAG, "[onRegister] " + registrationId);
Intent intent = new Intent("com.jiguang.demo.register");
context.sendBroadcast(intent);
}
@Override
public void onConnected(Context context, boolean isConnected) {
Log.e(TAG, "[onConnected] " + isConnected);
}
@Override
public void onCommandResult(Context context, CmdMessage cmdMessage) {
Log.e(TAG, "[onCommandResult] " + cmdMessage);
}
@Override
public void onTagOperatorResult(Context context, JPushMessage jPushMessage) {
//TagAliasOperatorHelper.getInstance().onTagOperatorResult(context,jPushMessage);
super.onTagOperatorResult(context, jPushMessage);
}
@Override
public void onCheckTagOperatorResult(Context context, JPushMessage jPushMessage) {
// TagAliasOperatorHelper.getInstance().onCheckTagOperatorResult(context,jPushMessage);
super.onCheckTagOperatorResult(context, jPushMessage);
}
@Override
public void onAliasOperatorResult(Context context, JPushMessage jPushMessage) {
//TagAliasOperatorHelper.getInstance().onAliasOperatorResult(context,jPushMessage);
super.onAliasOperatorResult(context, jPushMessage);
}
@Override
public void onMobileNumberOperatorResult(Context context, JPushMessage jPushMessage) {
//TagAliasOperatorHelper.getInstance().onMobileNumberOperatorResult(context,jPushMessage);
super.onMobileNumberOperatorResult(context, jPushMessage);
}
@Override
public void onNotificationSettingsCheck(Context context, boolean isOn, int source) {
super.onNotificationSettingsCheck(context, isOn, source);
Log.e(TAG, "[onNotificationSettingsCheck] isOn:" + isOn + ",source:" + source);
}
}
四 、初始化推送服务
JPush SDK 提供的 API 接口,都主要集中在 cn.jpush.android.api.JPushInterface 类里。
public class ExampleApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
JPushInterface.setDebugMode(true);
JPushInterface.init(this);
}
}
五 、验证推送结果
小记
1、查看OPPO推送是否集成成功:
nearme_opush: OPush register success! registerId: OPPO_CN_27b550f7e16eda602a4160fc22be36cc
2、微信快捷键截屏:
Alt+A:微信快速截图
参考链接:https://www.jianshu.com/p/b617613b10bc
参考链接:https://blog.csdn.net/qq_38436214/article/details/116586268