一、DCLOUD开发者平台uni app开通uni push厂商推送配置
DCLOUD开发者平台开发者中心网址:DCLOUD开发者平台开发者中心
1、Uni Push1.0(老版本)
(1)Uni Push控制台菜单列表
Uni Push控制台需要对应用信息、厂商推送(离线推送)设置进行配置。如只需app在使用的过程中进行推送的话只需将应用信息进行配置即可,如果需要离线推送的正常使用,那我们需要将厂商推送进行配置。消息推送,可对app应用进行消息推送测试。
(2)应用信息配置:
如下图所示将应用信息进行配置,如果应用只支持Android平台无需选择ios进行配置。
(3)消息推送
官方对Uni Push的解释就是,Uni App集成了个推平台,项目开发文档就是服务端开发文档也就是个推官方开发文档:RestAPI V2
注意:
1. uniPush推送功能需提交云端打包后才能生效,如需真机调试请使用 自定义基座。 详情参考:UniPush使用指南
2. 如果下方页面内容不显示或提示登录超时,请刷新页面重试。
3. 在使用推送过程中如果遇到任何问题,可以通过“配置管理”-“故障排查”中的联系方式获取帮助。
4. 每个账号有开通 uniPush 应用个数的限制,请合理安排使用。如需提升限额,需先完成企业认证(仅支持面向企业用户提升额度),然后发邮件到 service@dcloud.io 申请。发送提额邮件时,需说明dev.dcloud.net.cn的登录账号,同时需解释公司主营业务,以及为何需要更多的uniPush额度。正常情况下,3个工作日内审核完毕。
5. 常见问题:UniPush常见问题
控制台界面如下图,用于测试、推送数据查看或是在控制台进行消息推送:
(4)厂商推送设置
华为
1. 创建华为应用
- 参见华为官方文档 配置AppGallery Connect ,完成文档中的内容配置。登录 AppGallery Connect 网站,选择我的项目。打开刚才创建的项目,查看应用信息中相应的华为 AppID、华为 SecretKey。该信息在之后步骤中将会使用,如下图:

- 在 “项目设置 > 增长” 中选择“推送服务”,点击“立即开通”,以此来开启华为侧推送服务状态。

- 在 “项目设置 > 常规” 中填写“ SHA256证书指纹 ”,点击右侧对勾进行保存;若不知道具体值,请参考 SHA256指纹证书获取 。

- 在 “项目设置 > 推送服务> 配置”中开通项目回执状态,配置个推侧的回调地址以及HTTPS证书。如下

回执名称可自定义
https://thirdrcp-hz.getui.com/hw
-----BEGIN CERTIFICATE-----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-----END CERTIFICATE-----
-
2. 应用配置
在个推开发者中心中填写相关厂商信息:

小米
1. 创建小米应用
- 登录 小米开放平台 申请开发者帐号:

- 进入管理控制台->消息推送:

- 选择创建手机/平板应用:

- 填写应用名称和应用包名创建应用

- 勾选我同意接受小米推送的接入合作协议复选框,点击启用按钮:

查看应用信息,获取小米 AppID、小米 AppKey、小米 AppSecret:
2. 应用配置
在个推开发者中心中填写相关厂商信息:

OPPO
1. 创建 OPPO 应用
- 登录 OPPO 推送平台 登录/注册帐号:

- 选择创建应用:

- 填写应用名称和应用包名以及上传应用图标创建应用

查看应用信息,获取 OPPO App ID、OPPO App Key、OPPO App Secret、OPPO Master Secret
2. 应用配置
在个推开发者中心中填写相关厂商信息:

VIVO
1. 创建 VIVO 应用
- 首先,先创建 VIVO 应用,见 Vivo 推送平台开启指南。
- 查看应用信息,获取 VIVO APP ID、VIVO APP keyy、VIVO APP secret
2. 应用配置
- 在个推开发者中心中填写相关厂商信息:

魅族
1. 创建魅族应用
- 登录 魅族开放平台 申请开发者帐号:

- 登录 魅族推送平台 ,选择新建应用:

- 填写应用名称和应用包名,上传应用图标后创建应用:

- 打开新创建的应用:

在配置管理中查看相应的魅族 AppID、魅族 AppKey、魅族 AppSecret:
2. 应用配置
在个推开发者中心中填写相关厂商信息:

UPS
UPS即统一推送服务。个推与手机厂商合作,帮助建设系统消息推送通道。目前支持的厂商有坚果、海信和索尼。
1. 创建 UPS 应用
应用创建后,在推送页面-配置管理-应用配置-Android多厂商配置-UPS,选择需要开通的UPS厂商,如下:
2. 应用配置
- UPS开通后无需再手动配置参数,效果如下:
FCM
1.简介
消息推送支持集成 Firebase 云信息传递(Firebase Cloud Messaging,简称 FCM)通道,以满足 App 在海外安卓设备上的使用推送的需求,该服务由 Google 拥有的 Firebase 公司提供。若app需要上架海外应用市场,建议您使用 Google Play专版 客户端 SDK 。
2.创建FCM应用
进入 Firebase官网 创建项目,获取 google-services.json 文件及 Server key 。
1,登录 google 账号,如果没有账号请先注册
2,登录后点击右上角的“Go to console”
3,打开项目列表页面,点击 “Add project” 创建项目
4,输入项目名称(根据自己应用取名),点击 “Continue”
5,确认是否需要使用 Google Analytics 服务(根据自己需要开启或关闭),点击 “Continue”
6,确认后创建项目,点击 “Continue” 
进入项目详情页面,点击 “Android” 图标添加 Android 应用
7,输入 Android 应用信息(包名、昵称、证书SHA-1),点击 “Register App”
8,注册 Android 应用后下载配置文件 “google-services.json”,保存 google-services.json 文件后面需要使用
点击 “Next” 继续
9,此步骤中的操作云端打包机已经处理,忽略提示信息,继续点击“Next”,进入下一步
完成注册 Android 应用,点击 “Continue to console” 回到项目详情页面
10,点击 “Project settings” ,进入项目设置页面
11,切换到 “Cloud Messaging” 项,获取 “Server key”
- 在个推开发者中心中填写相关厂商信息:
三星
3.应用配置
二、Java项目服务端集成Uni Push
1、服务端 SDK
SDK介绍
个推SDK的主要目标是提升开发者在服务端集成个推推送服务的开发效率。 开发者不需要进行复杂编程即可使用个推推送服务的各项常用功能,SDK可以自动帮您满足调用过程中所需的鉴权、组装参数、发送HTTP请求等非功能性要求。
获取SDK
| 开发语言 | 资源下载 | 其他 |
|---|---|---|
| Java | Maven 项目依赖 |
GitHub 项目主页 | 适用于 JDK 1.6 及其以上版本 | | PHP | Composer 项目依赖
GitHub 项目主页 | 适用于 PHP 5.5 及其以上版本 |
2.Pom文件引入依赖
<dependency><groupId>com.getui.push</groupId><artifactId>restful-sdk</artifactId><version>1.0.0.4</version></dependency>
3.集成Uni Push Java代码实现
/**** @author zhoukeu* @since 2021-12-20*/@RestController@RequestMapping("/sys-message")public class SysMessageController {@Autowiredprivate SysMessageService sysMessageService;/*** 消息推送服务端接口,测试用*/@NoAuthentication@RequestMapping(value = "/pushMess", method = RequestMethod.GET)public void forwardNews(){sysMessageService.forwardNews();}}
/**** @author zhoukeu* @since 2021-12-20*/public interface SysMessageService extends IService<SysMessage> {void forwardNews();}
/**** @author zhoukeu* @since 2021-12-20*/@Slf4j@Servicepublic class SysMessageServiceImpl extends ServiceBaseImpl<SysMessageMapper, SysMessage> implements SysMessageService {@Resourceprivate GeTuiUtils geTuiUtils;@Autowiredprivate SysMessageMapper sysMessageMapper;/*** 集成个推推送消息*/@Override@Scheduled(cron = "0 0/2 * * * ?")public void forwardNews(){List<Map<String, Object>> maps = sysMessageMapper.selectMessages();if (maps.size() > 0) {maps.forEach(map -> {log.info("正在推送:{}", map);// System.out.println(map);// 获取推送信息String cid = (String) map.get("F_ClientID");String title = (String) map.get("F_Title");String content = (String) map.get("F_Summary");String linkUrl = (String) map.get("F_LinkUrl");// type = 1 消息推送String type = GeTuiUtils.MESSAGE_PUSH;ApiResult<Map<String, Map<String, String>>> mapApiResult = geTuiUtils.pushToSingleByCid(cid, title, content, linkUrl, type);// 修改推送消息表map.put("F_IsPush", 1);SysMessage sysMessage = null;try {sysMessage = this.mapToEntity(map, SysMessage.class, Other);} catch (IllegalAccessException | InstantiationException e) {e.printStackTrace();}// 判断消息是否推送成功打印日志更新数据库状态if (mapApiResult.isSuccess()) {sysMessageMapper.updateById(sysMessage);log.info("成功推送至:{}", map.get("F_FullName"));} else {log.error("无法推送消息至:{},请检查后重试", map.get("F_FullName"));}});} else {log.info("没有消息需要推送");}}}
/**** @author zhoukeu* @since 2021-12-20*/@Mapperpublic interface SysMessageMapper extends MapperBase<SysMessage> {@Select("SELECT\n" +"\tm.F_MessageID,\n" +"\tm.F_Title,\n" +"\tm.F_Summary,\n" +"\tm.F_LinkUrl,\n" +"\tm.F_IsPush,\n" +"\tm.F_Status,\n" +"\tu.F_ClientID,\n" +"\tu.F_FullName \n" +"FROM\n" +"\tT_Sys_Message m\n" +"\tLEFT JOIN T_Sys_User u ON m.F_RecieverUserID= u.F_UserID \n" +"WHERE\n" +"\tm.F_IsPush= 0 \n" +"\tAND m.F_Status = 0\n" +"\tAND m.F_IsDeleted= 0 \n" +"\tAND u.F_ClientID IS NOT NULL\n" +"\tAND u.F_IsDeleted = 0\n" +"\tAND u.F_AccountState = 1\n" +"\tAND u.F_LockState != 3\n" +"\tAND u.F_UserState = 1")List<Map<String, Object>> selectMessages();}
@Slf4j@Componentpublic class GeTuiUtils {// 消息推送public static final String MESSAGE_PUSH = "1";// 离线推送public static final String OFFLINE_PUSH = "2";@Resource(name = "myApiHelper")private ApiHelper myApiHelper;/*** 消息推送(离线推送)单cid推送**/public ApiResult<Map<String, Map<String, String>>> pushToSingleByCid(String cid, String title, String content, String linkUrl, String type) {PushDTO<Audience> pushDTO = this.buildPushDTO(title, content, linkUrl, type);// 设置接收人信息Audience audience = new Audience();pushDTO.setAudience(audience);audience.addCid(cid); // cid// 进行cid单推PushApi pushApi = myApiHelper.creatApi(PushApi.class);ApiResult<Map<String, Map<String, String>>> apiResult = pushApi.pushToSingleByCid(pushDTO);if (apiResult.isSuccess()) {// successlog.info("推送成功");System.out.println(apiResult.getData());} else {// failedlog.error("推送失败");System.out.println("code:" + apiResult.getCode() + ", msg: " + apiResult.getMsg());}return apiResult;}/*** 消息参数模板*/private PushDTO<Audience> buildPushDTO(String title, String content, String linkUrl, String type) {PushDTO<Audience> pushDTO = new PushDTO<>();// 设置推送参数//requestid需要每次变化唯一pushDTO.setRequestId(System.currentTimeMillis() + "");pushDTO.setGroupName("wxb-group");// 消息通知//GTNotification notification = new GTNotification();//pushMessage.setNotification(notification);//notification.setTitle(title);//notification.setBody(content);//android8.0以上//0:无声音,无振动,不显示;//1:无声音,无振动,锁屏不显示,通知栏中被折叠显示,导航栏无logo;//2:无声音,无振动,锁屏和通知栏中都显示,通知不唤醒屏幕;//3:有声音,无振动,锁屏和通知栏中都显示,通知唤醒屏幕;//4:有声音,有振动,亮屏下通知悬浮展示,锁屏通知以默认形式展示且唤醒屏幕;// notification.setChannelLevel("3");//notification.setClickType("payload");//notification.setPayload(payload);//notification.setBadgeAddNum("1");/* 设置个推通道参数,更多参数请查看文档或对象源码 *///配置推送条件// 1: 表示该消息在用户在线时推送个推通道,用户离线时推送厂商通道;// 2: 表示该消息只通过厂商通道策略下发,不考虑用户是否在线;// 3: 表示该消息只通过个推通道下发,不考虑用户是否在线;// 4: 表示该消息优先从厂商通道下发,若消息内容在厂商通道代发失败后会从个推通道下发。Strategy strategy = new Strategy();strategy.setDef(1);strategy.setSt(1);Settings settings = new Settings();settings.setStrategy(strategy);pushDTO.setSettings(settings);//消息有效期,走厂商消息需要设置该值settings.setTtl(3600000);PushChannel pushChannel = new PushChannel();Map<String, String> map = new HashMap<>();map.put("title", title);map.put("content", content);map.put("linkUrl", linkUrl);map.put("type", type);// 转json对象String payload = JSONUtils.toJSONString(map);// ========================= ios离线配置 ==============================//推送苹果离线通知标题内容Alert alert = new Alert();//苹果离线通知栏标题alert.setTitle(title);//苹果离线通知栏内容alert.setBody(content);Aps aps = new Aps();//1表示静默推送(无通知栏消息),静默推送时不需要填写其他参数。// 苹果建议1小时最多推送3条静默消息aps.setContentAvailable(0);aps.setSound("default");aps.setAlert(alert);IosDTO iosDTO = new IosDTO();iosDTO.setPayload(payload);iosDTO.setAps(aps);iosDTO.setType("notify");pushChannel.setIos(iosDTO);// =================== 安卓离线厂商通道推送消息体 ===========================AndroidDTO androidDTO = new AndroidDTO();pushDTO.setPushChannel(pushChannel);pushChannel.setAndroid(androidDTO);Ups ups = new Ups();androidDTO.setUps(ups);ThirdNotification notification1 = new ThirdNotification();ups.setNotification(notification1);//安卓离线展示的标题notification1.setTitle(title);//安卓离线展示的内容notification1.setBody(content);notification1.setClickType("intent");notification1.setIntent("intent:#Intent;action=android.intent.action.oppopush;" +"launchFlags=0x14000000;" +"component=包名/io.dcloud.PandoraEntry;S.UP-OL-SU=true;" +"S.title=" + title + ";" +"S.content="+ content + ";" +"S.payload=" + payload + ";end");// notification1.setPayload(payload);//各厂商自有功能单项设置// ups.addOption("HW", "/message/android/notification/badge/class", "io.dcloud.PandoraEntry ");// ups.addOption("HW", "/message/android/notification/badge/add_num", 1);// ups.addOption("HW", "/message/android/notification/importance", "HIGH");// ups.addOption("VV","classification",1);//设置options 方式一// ups.addOption("HW","badgeAddNum",3);// ups.addOption("HW","badgeClass","com.getui.demo.GetuiSdkDemoActivity");// ups.addOption("OP","app_message_id",11);// ups.addOption("VV","message_sort",1);// ups.addOptionAll("channel","default");// PushMessage在线走个推通道才会起作用的消息体PushMessage pushMessage = new PushMessage();pushDTO.setPushMessage(pushMessage);Map<String, Object> mapTC = new HashMap<>();mapTC.put("title", title);mapTC.put("content", content);mapTC.put("payload", map);String jsonTC = JSONUtils.toJSONString(mapTC);pushMessage.setTransmission(jsonTC);log.info("pushDTO:{}", pushDTO);return pushDTO;}/*** 离线通知消息参数模板**/private PushDTO<Audience> offlinePushDTO(String title, String content, String linkUrl, String type) {PushDTO<Audience> pushDTO = new PushDTO<>();// 设置推送参数//requestid需要每次变化唯一pushDTO.setRequestId(System.currentTimeMillis() + "");pushDTO.setGroupName("wxb-group");// PushMessage在线走个推通道才会起作用的消息体Map<String, String> map = new HashMap<>();map.put("title", title);map.put("content", content);map.put("linkUrl", linkUrl);map.put("type", type);PushMessage pushMessage = new PushMessage();pushDTO.setPushMessage(pushMessage);Map<String, Object> mapTC = new HashMap<>();mapTC.put("title", title);mapTC.put("content", content);mapTC.put("payload", map);String jsonTC = JSONUtils.toJSONString(mapTC);System.err.println(jsonTC);pushMessage.setTransmission(jsonTC);log.info("pushDTO:{}", pushDTO);return pushDTO;}}
/*** 个推推送类*/@Configurationpublic class GTPushConfig {@Value("${push.app_id}")private String appId;@Value("${push.app_key}")private String appKey;@Value("${push.master_secret}")private String masterSecret;@Bean(name = "myApiHelper")public ApiHelper apiHelper() {// 设置httpClient最大连接数,当并发较大时建议调大此参数。或者启动参数加上 -Dhttp.maxConnections=200System.setProperty("http.maxConnections", "200");GtApiConfiguration apiConfiguration = new GtApiConfiguration();// 填写应用配置apiConfiguration.setAppId(appId);apiConfiguration.setAppKey(appKey);apiConfiguration.setMasterSecret(masterSecret);// 接口调用前缀,请查看文档: 接口调用规范 -> 接口前缀, 可不填写appId// 默认为https://restapi.getui.com/v2apiConfiguration.setDomain("https://restapi.getui.com/v2/");// 实例化ApiHelper对象,用于创建接口对象ApiHelper apiHelper = ApiHelper.build(apiConfiguration);return apiHelper;}}
push:# 登录测试app_id: l4jOPmTtJx9MpeY4SGgCh4app_key: FEeRTZeCPx98QDwYBtZTG3master_secret: RyU5cFvTy09YANmfJgWLC# 本配置信息仅用于开发测试,请自行前往Uni Push信息配置获取
