我之所以能去花费那么长时间去解决极光推送问题,就是因为这是必须克服的困难。
我项目要用,我项目未来是为了产生经济效益的,所以我抱着必须克服的精神去挑战,所以我一定会赢,只是需要的时间长一些或短一些
使用极光推送的目的
就是为了让用户第一时间收到交互的消息,增加用户交流的畅快性,而产生用户粘合度
最理想的解决方案
-
通知栏显示通知消息(来通知时,最好响一声)
-
在进入app内部,提示音响一下,在消息的按钮右上角显示消息数量
=》这两项让用户体验达到非常好的效果
一、快速开始:下载 demo ,测试消息推送
具体步骤,在极光推送文档有,我不赘述,只留下值得注意的问题。
注意:小米手机由于有 MIUI保护,所以测试极光推送时,看不到消息,需要关闭MIUI
具体步骤:设置--》更多设置--》开发者选项--》关闭MIUI优化(在开发者选项里面菜单的最后面)
1. 创建推送消息
2. 在手机接收到极光推送的消息
二、 react native作为前端,Java作为服务端 完成推送服务
解决这个问题的逻辑思路:
1. 首先需要在登陆极光的官网,进入企业应用运营平台,创建App(切记保存一下你填写的包名)2. 之后react native项目先集成极光的jpush-react-native插件,
3. 先通过企业应用运营平台创建推送,等到react native 项目可以接受到推送的消息
4. 再创建springboot项目 集成极光的java SDK,进行消息推送。
1. 在企业应用运营平台创建App
2. 在react native项目集成极光插件jpush-react-native
官方文档上有Android 和 IOS,而我使用的是react native,官网没有,不过极光有React Native版本插件 jpush-react-native,具体配置看github上面的文档。下面代码重点步骤
(1)android/app/build.gradle 文件
android {
defaultConfig {
//在此替换你的应用包名(就是上面在运营平台创建应用时,第二步骤让你填写的应用包名)
applicationId "yourApplicationId"
...
manifestPlaceholders = [
JPUSH_APPKEY: "yourAppKey", //在此替换你的APPKey
JPUSH_CHANNEL: "yourChannel" //在此替换你的channel
]
}
}
(2)android/app/src/main/AndroidManifest.xml 文件
<meta-data
android:name="JPUSH_CHANNEL"
android:value="${JPUSH_CHANNEL}" />
<meta-data
android:name="JPUSH_APPKEY"
android:value="${JPUSH_APPKEY}" />
3. 企业应用运营平台创建推送,测试跑通
(1)前端react native 可以这样简单的写成如下这样
componentDidMount() {
//初始化
JPush.init({ appKey: '你自己的', channel: 'default', production: 1});
//设置别名
JPush.setAlias({sequence: new Date().getTime(), alias: "teng"});
//连接状态
this.connectListener = result => {
console.log("连接状态:" + JSON.stringify(result))
};
JPush.addConnectEventListener(this.connectListener);
//通知开关是否开启
JPush.isNotificationEnabled((result) => {
console.log('当前应用的通知开关是否开启', result);
});
//通知回调(有消息,就会被推送到这个回调函数里面)
this.notificationListener = result => {
console.log("notificationListener:" + JSON.stringify(result))
};
JPush.addNotificationListener(this.notificationListener);
}
(2)企业应用运营平台创建,一个别名为teng 的消息推送
(3)成功推送的显示
企业应用运营平台会显示推送成功
react native 接收到了消息
4. 在springboot项目里面集成极光Java SDK
在极光推送文档 -> REST API -> 服务端SDK里面 进入文档
我集成的方式,是自己导入相关依赖,自己写极光推送服务,好处就是,不用引入过多的依赖包
解决这个问题的逻辑思路
1. 导入相关依赖
2. 写JPushUtil工具类
3. 前端发起请求,服务端调用推送服务,前端接收到消息
(1)导入相关依赖
跟官网上的有些不同 --- 我的 springboot version 是2.7.0 和 jdk 1.8
1. 我没用任何log4或slf4j的包,因为容易导致 Class path contains multiple SLF4J bindings错误
2. jpush-client 是根据需要加的
3. gson我用的版本较高,因为用官网上的2.3版本会报错Error creating bean with name 'gsonBuilder' defined in class path resource
<dependency>
<groupId>cn.jpush.api</groupId>
<artifactId>jpush-client</artifactId>
<version>3.6.1</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>cn.jpush.api</groupId>
<artifactId>jiguang-common</artifactId>
<version>1.1.11</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.6.Final</version>
<scope>compile</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.9.0</version>
</dependency>
(2)JPshUtil工具类
public class JPushUtil {
public static JPushClient jPushClient;
private static String master_secret="c4bfec35e99577b42e234221";
private static String app_key="b711ec6bda065fd6dabe0b20";
@PostConstruct
private void init(){
log.info("极光推送服务进行初始化");
jPushClient = new JPushClient(master_secret, app_key);
}
//构建推送对象:所有平台,推送目标是别名为 "1"
public static void notificationWithAlias() {
try {
HashMap<String,String> map = new HashMap();
map.put("name","滕禹鑫");
String noticeUserId = "1";
PushResult pushResult = jPushClient.sendAndroidNotificationWithAlias("标题", "输入内容", map, noticeUserId);
log.info(String.valueOf(pushResult));
} catch (APIConnectionException e) {
e.printStackTrace();
} catch (APIRequestException e) {
e.printStackTrace();
}
}
}
(3)前端发起请求,获得推送的数据
三、实际开发中遇到的问题
1. 应用任何时候都可以接收到推送的消息
当关闭进程时,是无法进行消息推送的,直到你再次使用App,才会接受到推送消息,如何克服这个困难,最简单的方法就是,引导用户将APP添加到自启动。这样就跟微信一样了,即使杀死进程,它也能接收到消息。
2. 如何在通知栏上显示推送的消息
极光推送自定义的消息,是不支持直接在通知栏展示的,我使用 sendAndroidNotificationWithAlias方法,可以直接在通知栏显示。但我用红米Note11真机调试时,发现启动MIUI优化后,即使我将app加入自启动,都无法在通知栏显示
=》我认为可能,需要通过厂商通道,来发消息推送,才可能解决这个问题。