使用Dcloud通过厂商通道给H5应用推送消息Android版
推送功能包括三个步骤:注册厂商并申请应用、打包app获取cid、测试推送功能
步骤一:注册厂商开发者账号并申请应用
Dcloud使用的是个推的推送功能,而个推集成了国内大型厂商的推送,所以在使用推送时需要在各厂商注册开发者账号并申请应用,才能使用相应厂商的推送功能。在各厂商申请应用时填写的包名必须与H5项目包名保持一致
分别在小米、华为、魅族注册开发者账号并申请应用后(可以不用申请channel),将appId,secret等信息配置在Dcloud后台。
配置成功后,就可以通过Uni Push给应用推送消息了
步骤二:打包app获取cid
注意:只有打包后的app才能收到推送,可以使用打正式包,或者自定义调试基座,已打包成功的忽略此步骤
手机安装apk后,每一个手机都会获取到一个唯一识别号cid,同一部手机安装同一个应用的编码是唯一的,卸载重新安装时cid也相同。消息推送也是根据cid将消息推送给对应的客户端,所以,如果进行测试的话需要显示的获取用户的cid,在html中加入如下代码,Hbuilder控制台打印的clientid就是手机的唯一识别号cid,在步骤三中就可以根据cid给这部手机推送消息。
document.addEventListener( "plusready", function(){
var info=plus.push.getClientInfo();
console.log(JSON.stringify(info));
}
);
{"id":"unipush","token":"313a128a2c8cdd84c2226d7cd1b1264d","clientid":"313a128a2c8cdd84c2226d7cd1b1264d","appid":"pPyZWxE32a6PXba102Jq009","appkey":"b7dOalX1HR7pqwUx0hp4i13"}
打包时需要配置证书,使用keytool生成一个.keystore的证书,具体步骤这里不展开
由于每天打包次数有限,建议选择打自定义调试基座,这样改动代码后也不用再次打包,同步到手机后就可以展示运行效果
打包完成需要安装到手机,打开手机设置→关于手机(一般在设置最底部,部分手机在顶部“我的设备”)→版本号(部分手机需要打开更多参数),连续快速点击后会提示打开开发者模式成功,然后回到设置中找到开发者选项,打开USB调试模块,数据线连接电脑后,点击运行→运行到手机或模拟器,右侧会显示出手机,如果打包时选择的是打自定义调试基座,这里需要再次选择自定义调试基座。
安装完成后,手机上会出现一个应用图标。
步骤三:测试推送功能
打开Dcloud管理后台https://dev.dcloud.net.cn 测试推送消息,推送前需要从后台结束移动端的应用,然后点击Uni Push输入标题、内容,点击底部的预览,弹出预计接收人数
如果人数大于0,说明已经有移动端安装了应用,否则检查打包及安装过程。
手机端可以接收到推送通知,说明所有配置都是成功的,可以进行编写代码推送,如果没有接收到通知,检查通知栏是否允许应用在通知栏显示,如果允许通知依旧无法收到通知,则需要进行调试排查问题,排查方式后边单独写一篇文章介绍。
下面进行编码测试阶段:
个推官方建议使用v2版本,项目中也使用v2版本。
使用时可以直接通过maven导入相关依赖
在pom.xml中引入
<repository>
<id>getui-nexus</id>
<url>http://mvn.gt.getui.com/nexus/content/repositories/releases</url>
</repository>
<dependency>
<groupId>com.gexin.platform</groupId>
<artifactId>gexin-rp-sdk-http</artifactId>
<version>4.1.2.0</version>
</dependency>
然后新建AppInfo测试类
消息推送主要分为2部分:项目信息配置、接收对象
1、首先需要对类进行初始化,在Dcloud后台获取项目的信息:appId,appsecret,分别进行填写
public class AppInfo {
public PushApi pushApi;
public StatisticApi statisticApi;
public void getApi(){
GtApiConfiguration apiConfiguration = new GtApiConfiguration();
//填写应用配置
apiConfiguration.setAppId("XXXXXX");
apiConfiguration.setAppKey("XXxxxxx");
apiConfiguration.setMasterSecret("XXXXXx");
// 接口调用前缀,请查看文档: 接口调用规范 -> 接口前缀, 可不填写appId
apiConfiguration.setDomain("https://restapi.getui.com/v2/");
// 实例化ApiHelper对象,用于创建接口对象
ApiHelper apiHelper = ApiHelper.build(apiConfiguration);
// 创建对象,建议复用。目前有PushApi、StatisticApi、UserApi
pushApi = apiHelper.creatApi(PushApi.class);
statisticApi=apiHelper.creatApi(StatisticApi.class);
}
2、配置好项目信息后,把步骤二中的cid设置为接收对象,替换代码中的cid,手机通知栏就可以收到推送通知。
完整代码如下:
package org.jeecg.modules.oa.mobile.msg.getui;
import com.alibaba.fastjson.JSONObject;
import com.getui.push.v2.sdk.ApiHelper;
import com.getui.push.v2.sdk.GtApiConfiguration;
import com.getui.push.v2.sdk.api.PushApi;
import com.getui.push.v2.sdk.api.StatisticApi;
import com.getui.push.v2.sdk.common.ApiResult;
import com.getui.push.v2.sdk.dto.CommonEnum;
import com.getui.push.v2.sdk.dto.req.Audience;
import com.getui.push.v2.sdk.dto.req.Settings;
import com.getui.push.v2.sdk.dto.req.Strategy;
import com.getui.push.v2.sdk.dto.req.message.PushBatchDTO;
import com.getui.push.v2.sdk.dto.req.message.PushChannel;
import com.getui.push.v2.sdk.dto.req.message.PushDTO;
import com.getui.push.v2.sdk.dto.req.message.PushMessage;
import com.getui.push.v2.sdk.dto.req.message.android.AndroidDTO;
import com.getui.push.v2.sdk.dto.req.message.android.GTNotification;
import com.getui.push.v2.sdk.dto.req.message.android.ThirdNotification;
import com.getui.push.v2.sdk.dto.req.message.android.Ups;
import com.getui.push.v2.sdk.dto.req.message.ios.Alert;
import com.getui.push.v2.sdk.dto.req.message.ios.Aps;
import com.getui.push.v2.sdk.dto.req.message.ios.IosDTO;
import com.getui.push.v2.sdk.dto.res.statistic.StatisticDTO;
import com.google.common.collect.Sets;
import org.jeecg.common.util.DateUtils;
import java.util.*;
public class AppInfo {
public PushApi pushApi;
public StatisticApi statisticApi;
public static final String CID = "fa0b6ef8c8ee7e30888db8e70641a4ed";
public static void main(String[] args) {
new AppInfo().test();//iso+安卓
}
public void getApi(){
GtApiConfiguration apiConfiguration = new GtApiConfiguration();
//填写应用配置
apiConfiguration.setAppId("XXXXXX");
apiConfiguration.setAppKey("XXxxxxx");
apiConfiguration.setMasterSecret("XXXXXx");
// 接口调用前缀,请查看文档: 接口调用规范 -> 接口前缀, 可不填写appId
apiConfiguration.setDomain("https://restapi.getui.com/v2/");
// 实例化ApiHelper对象,用于创建接口对象
ApiHelper apiHelper = ApiHelper.build(apiConfiguration);
// 创建对象,建议复用。目前有PushApi、StatisticApi、UserApi
pushApi = apiHelper.creatApi(PushApi.class);
statisticApi=apiHelper.creatApi(StatisticApi.class);
}
/*****************************************批量推送结束*****************************************/
public void test() {
getApi();
//根据cid进行单推
PushDTO<Audience> pushDTO = pushDTO();
// 设置接收人信息
Audience audience = new Audience();
pushDTO.setAudience(audience);
audience.addCid(CID);
// audience.setAll("all");
System.out.println("test:"+pushDTO.toString());
// 进行cid单推
ApiResult<Map<String, Map<String, String>>> apiResult = pushApi.pushToSingleByCid(pushDTO);
System.out.println(apiResult.toString());
if (apiResult.isSuccess()) {
// success
System.out.println("推送成功"+apiResult.getData());
} else {
// failed
System.out.println("推送失败code:" + apiResult.getCode() + ", msg: " + apiResult.getMsg());
}
}
private PushDTO<Audience> pushDTO() {
PushDTO<Audience> pushDTO = new PushDTO<Audience>();
pushDTO.setRequestId(System.currentTimeMillis() + "");
pushDTO.setGroupName("fl");
Settings settings = new Settings();
settings.setTtl(3600000);
//settings.setTtl(-1);
Strategy strategy = new Strategy();
strategy.setSt(1);
strategy.setDef(4);//默认走厂商通道,否则android应用打开时会导致打开应用失败
strategy.setIos(4);
settings.setStrategy(strategy);
pushDTO.setSettings(settings);
PushMessage pushMessage = new PushMessage();
GTNotification notification = new GTNotification();
notification.setTitle("收到通知");
notification.setBody("你1有一个待审核工作");
notification.setClickType(CommonEnum.ClickTypeEnum.TYPE_STARTAPP.type);//打开地址
notification.setUrl("http://www.baidu.com");
JSONObject payload =new JSONObject();
payload.put("openPage","/maildetail/1353550768530235394/receive/m");
payload.put("id","1355449428499136513");
notification.setPayload(payload.toJSONString());
System.out.println("参入参数"+payload.toJSONString());
pushMessage.setNotification(notification);
pushDTO.setPushMessage(pushMessage);
PushChannel pushChannel = new PushChannel();
AndroidDTO androidDTO = new AndroidDTO();
Ups ups = new Ups();
ThirdNotification thirdNotification = new ThirdNotification();
thirdNotification.setClickType(CommonEnum.ClickTypeEnum.TYPE_STARTAPP.type);
thirdNotification.setTitle("mailtitle3");
thirdNotification.setBody("mailcontent!");
ups.setNotification(thirdNotification);
//设置options 方式二
Map<String, Map<String,Object>> options = new HashMap<String, Map<String, Object>>();
Map<String,Object> all = new HashMap<String, Object>();
// all.put("channel","default");//添加默认channel导致小米手机无法收到消息
options.put("ALL",all);
ups.setOptions(options);
androidDTO.setUps(ups);
pushChannel.setAndroid(androidDTO);
IosDTO iosDTO = new IosDTO();
Aps aps = new Aps();
aps.setSound("default");//设置苹果的声音
Alert alert = new Alert();
alert.setTitle("消息title-" + System.currentTimeMillis());
alert.setBody("你有一个待审核工作");
aps.setAlert(alert);
iosDTO.setAps(aps);
//iphone 设置payLoad
//iosDTO.setPayload("{openPage:/index.html-ios#/modulecontrol,name:zhangsan,id:12342412412}");
iosDTO.setPayload(payload.toJSONString());
pushChannel.setIos(iosDTO);
pushDTO.setPushChannel(pushChannel);
return pushDTO;
}
}
以上代码可以在android上正常推送,特别需要注意的是官方示例程序中设置了channel值default,而默认通道也是default,让我误以为必须要设置通道,否则无法推送,设置后反而导致小米手机无法收到厂商推送,去掉 all.put("channel","default");后小米也可以收到推送。
原因:如果不设置channel则走默认通道,如果设置了channel则按照设置的通道发送。我在各厂商只申请了应用信息并没有申请通道,所以初学者一定不要设置channel,熟悉运行机制后可以根据实际需求申请通道。