前言
前一段时间一直在调查阿里的移动推送,文档看得差不多了,接下来想写个demo验证一下自己的理解,是否真的能落地实施。根据以往的经验,每个人每次对接第三方资源,总会遇到这样那样相似的问题。
作为一名后端开发,对Android开发只是略知一二,不知道有多少不知道。在写Flutter的demo中,遇到不少问题。这些问题对于熟悉Android开发的同学来说,只不过是小菜一碟,但还是有必要记录一下,留给有需要的同学,希望能为他们的对接工作节约时间。
服务器端推送Demo:
一、官方对接参考文档
Java代码参考:https://help.aliyun.com/document_detail/48048.html
参数说明:https://help.aliyun.com/document_detail/48089.html
高级推送代码参考:https://help.aliyun.com/document_detail/48089.html
二、pom.xml jar的引入
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-push</artifactId>
<version>3.13.6</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>[4.3.2,5.0.0)</version>
</dependency>
三、Java代码
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.push.model.v20160801.PushRequest;
import com.aliyuncs.push.model.v20160801.PushResponse;
import com.google.gson.Gson;
/**
* 阿里云推送demo
* @author 程就人生
* @Date
*/
public class AliyunPush {
public static void main(String[] args) {
// 你在阿里云移动推送创建应用产生的appKey
Long appKey = 0L;
// 你在阿里云推送注册账号产生的accessKeyId、accessSecret
String accessKeyId = "accessKeyId";
String accessSecret = "accessSecret";
// 选择推送消息的区域
String regionId = "cn-shanghai";
DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessSecret);
IAcsClient client = new DefaultAcsClient(profile);
PushRequest request = new PushRequest();
request.setAppKey(appKey);
// 推送类型:MESSAGE:表示消息、NOTICE:表示通知
request.setPushType("NOTICE");
// 设备类型:iOS:iOS设备、ANDROID:Android设备、ALL:全部设备类型
request.setDeviceType("ALL");
// 推送目标 DEVICE:根据设备推送、ACCOUNT:根据账号推送、ALIAS:根据别名推送、TAG:根据标签推送、ALL:推送给全部设备
request.setTarget("ALL");
// 根据Target来设定,如果target为DEVICE时,这里填充deviceId1,deviceId2
request.setTargetValue("ALL");
// 在线时,接收到通知的标题和内容
request.setTitle("在线标题");
request.setBody("在线内容");
// 通知渠道channelID,Andorid 8及以上必须填写,和移动端配置保持一致,否则移动端收到的通知不能在通知栏展示
request.setAndroidNotificationChannel("1");
// 离线消息/通知是否保存
request.setStoreOffline(true);
// 点击通知后动作。可取值:APPLICATION:打开应用(默认值)、ACTIVITY:打开应用AndroidActivity、URL:打开URL、NONE:无跳转
request.setAndroidOpenType("ACTIVITY");
// 与通知跳转类型相匹配,如果设置了ACTIVITY,那么AndroidActivity就必须填写
request.setAndroidActivity("com.example.MainActivity");
// 离线状态下必须配置的几个参数,否则接收不到离线消息
request.setAndroidPopupActivity("com.example.MainActivity");
// 离线状态下,接收到通知的标题和内容
request.setAndroidPopupTitle("离线通知标题");
request.setAndroidPopupBody("离线通知内容");
try {
PushResponse response = client.getAcsResponse(request);
System.out.println(new Gson().toJson(response));
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
System.out.println("ErrCode:" + e.getErrCode());
System.out.println("ErrMsg:" + e.getErrMsg());
System.out.println("RequestId:" + e.getRequestId());
}
}
}
四、测试
当在控制台输出以下字样时,代表服务器端推送成功了:
五、在对接过程中遇到的几个问题:
1.参数配置错误
appKey、accessKeyId、accessSecret,这三个参数,随便哪个参数写错了,控制台就会报错,这个时候就根据错误提示解决即可。
参考文档:https://help.aliyun.com/document_detail/175967.html?spm=a2c4g.11186623.0.0.2e133c6bynJaqo
2.服务器端推送的通知,在移动端不能在通知栏展示?
服务器端的通道ID AndroidNotificationChannel 必须和移动端通道ID保持一致,移动端配置文件里是必须配置的,如果服务器端的通道ID不写,那么移动端就不能在通知栏展示通知,接收到的通知会变成在线才能接收到的消息。这个在文档里说明的并不详细。
参考文档:https://help.aliyun.com/document_detail/67398.html?spm=a2c4g.11186623.0.0.31ec5249vyD2hv
3.离线通知收不到?
AndroidPopupActivity、AndroidPopupTitle、AndroidPopupBody这三个参数必填,如果不填写,就接收不到离线消息。这也是需要特别注意的地方。
4.开发者门户调试,移动端收不到通知?
建议使用 推送高级接口 的开发者门户调试工具,其他简易接口:推送通知给Android设备等接口就不要尝试了,如果手机是Android8.0及以上版本,可能会收不到通知,因为这些Api里面的参数不全,没地方填充,在服务端的统计列表里,也不会有任何报错,找不到问题出现在哪里。
登录阿里云后台,推送高级接口会自动获取配置参数,url地址为:https://next.api.aliyun.com/api/Push/2016-08-01/Push?spm=api-workbench…0.0.5a5b1e0f6HwFCj¶ms={}
这几个问题,刚开始总以为是移动端demo的问题,因为在阿里云的推送记录里,没有任何报错信息。其实是服务器端参数设置的问题,官方文档比代码更新有延迟,确实会让很多第一次对接的伙伴在这里浪费不少时间。另外在写服务端代码时,最好多参考几个官方文档demo,有些参数的作用说的不是太明确,还需要找技术支持核实一下。