DCLOUD开发者平台开发者中心网址:DCLOUD开发者平台开发者中心
Uni Push控制台需要对应用信息、厂商推送(离线推送)设置进行配置。如只需app在使用的过程中进行推送的话只需将应用信息进行配置即可,如果需要离线推送的正常使用,那我们需要将厂商推送进行配置。消息推送,可对app应用进行消息推送测试。
如下图所示将应用信息进行配置,如果应用只支持Android平台无需选择ios进行配置。
官方对Uni Push的解释就是,Uni App集成了个推平台,项目开发文档就是服务端开发文档也就是个推官方开发文档:RestAPI V2
注意:
1. uniPush推送功能需提交云端打包后才能生效,如需真机调试请使用 自定义基座。 详情参考:UniPush使用指南
2. 如果下方页面内容不显示或提示登录超时,请刷新页面重试。
3. 在使用推送过程中如果遇到任何问题,可以通过“配置管理”-“故障排查”中的联系方式获取帮助。
4. 每个账号有开通 uniPush 应用个数的限制,请合理安排使用。如需提升限额,需先完成企业认证(仅支持面向企业用户提升额度),然后发邮件到 [email protected] 申请。发送提额邮件时,需说明dev.dcloud.net.cn的登录账号,同时需解释公司主营业务,以及为何需要更多的uniPush额度。正常情况下,3个工作日内审核完毕。
5. 常见问题:UniPush常见问题
控制台界面如下图,用于测试、推送数据查看或是在控制台进行消息推送:
厂商应用开通指南:
image.png
https://thirdrcp-hz.getui.com/hw
-----BEGIN CERTIFICATE-----
MIIGqTCCBZGgAwIBAgIQAVdiWJ3ORoF7fDA5qyolZTANBgkqhkiG9w0BAQsFADBf
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMR4wHAYDVQQDExVHZW9UcnVzdCBDTiBSU0EgQ0EgRzEw
HhcNMjIwNTE2MDAwMDAwWhcNMjMwNjE2MjM1OTU5WjB0MQswCQYDVQQGEwJDTjES
MBAGA1UECAwJ5rWZ5rGf55yBMRIwEAYDVQQHDAnmna3lt57luIIxJzAlBgNVBAoM
Huavj+aXpeS6kuWKqOiCoeS7veaciemZkOWFrOWPuDEUMBIGA1UEAwwLKi5nZXR1
aS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDAOvUwMLw5roP+
vQzEqdVfFQDg5viSUnevk31GhS7UkwNVKPJkdwBvuetOuki5NfJR9GxQAq0fk0Qq
15VHHnLYdgY/VSBSuFJZ8DbKD+/3LqVp6WW7HEEgPWbto04bgB2KOqkt/ws3bmso
NZsdHHAYb2pbOTO7ZW4VpZaiIppGeLvcFNcP1QwqpARiOGOUxz3q4OFSh8QWapV9
Y15LBrTdMid4Dzd+UNRqZJYWX0KdmD5VNK3obo+Wq2Rj0ktV1skPWWINo+ecvJDq
O82+6m8zF+G1nmz7ofVCGm261wXdAaFWS7gdh8MRuSFSVW0O+edXTx4Ez2mNMzQp
65PjJAxfAgMBAAGjggNKMIIDRjAfBgNVHSMEGDAWgBSRn14xFa4Qn61gwffBzKpI
NC8MJjAdBgNVHQ4EFgQUpYw0JXac0ld0vX8gP1le02rlQUAwIQYDVR0RBBowGIIL
Ki5nZXR1aS5jb22CCWdldHVpLmNvbTAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYw
FAYIKwYBBQUHAwEGCCsGAQUFBwMCMHUGA1UdHwRuMGwwNKAyoDCGLmh0dHA6Ly9j
cmwzLmRpZ2ljZXJ0LmNvbS9HZW9UcnVzdENOUlNBQ0FHMS5jcmwwNKAyoDCGLmh0
dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9HZW9UcnVzdENOUlNBQ0FHMS5jcmwwPgYD
VR0gBDcwNTAzBgZngQwBAgIwKTAnBggrBgEFBQcCARYbaHR0cDovL3d3dy5kaWdp
Y2VydC5jb20vQ1BTMG8GCCsGAQUFBwEBBGMwYTAhBggrBgEFBQcwAYYVaHR0cDov
L29jc3AuZGNvY3NwLmNuMDwGCCsGAQUFBzAChjBodHRwOi8vY3JsLmRpZ2ljZXJ0
LWNuLmNvbS9HZW9UcnVzdENOUlNBQ0FHMS5jcnQwCQYDVR0TBAIwADCCAX0GCisG
AQQB1nkCBAIEggFtBIIBaQFnAHUA6D7Q2j71BjUy51covIlryQPTy9ERa+zraeF3
fW0GvW4AAAGAyt5DUAAABAMARjBEAiAsp7cSQHGTO8EF09x7mKga8eWF0UYq0JZ2
xQR4ubI87AIgK+zsAzAF7tFQ29fQGm/87wYEE8y1g5lhWqO+5vLUpg8AdwA1zxkb
v7FsV78PrUxtQsu7ticgJlHqP+Eq76gDwzvWTAAAAYDK3kOMAAAEAwBIMEYCIQDe
fomYJt4a0uSt2CE6pA1LePKCCobkCWbBriHSFgNPEwIhAPlyCWEPFkZ0sIV7rAEg
oZHuV77Xe58cSUIGm80UxS5sAHUAtz77JN+cTbp18jnFulj0bF38Qs96nzXEnh0J
gSXttJkAAAGAyt5DhwAABAMARjBEAiA+FlDj9Gmb8zbK+wHFlqkzjKLFqeSOH80F
Ndv/tgemaAIgFiGUdq3HTxNsdstCfBpK8UCN8ChNeI2O2msCHK8lU70wDQYJKoZI
hvcNAQELBQADggEBAHtbJKGJOfgJzvSfyvzPKcbYymhjIerPVX+HBAEqb2SX9f9M
qhvo89xsZTiT2dMSDLCvdEO2E5QWJZoTKmL3uY9BO6/4reoYvd8sGTjNU/spjZUR
hv1+79Xz9DTFtCYziBnPOv72t4iklZjpato1vJLHQ62f9BgQlYplMiZ1KZkmP5XA
my34lax7fg0SSz2GCmjKoNGkoCpvAl+TmJ+8IS0z6N/szZrmioDZT5Jp/lJ2U1fk
so3vAz19idF8P95yy2jRGg2IA8WdMnfxp8rv6HszdBoaKiMlSAYXU3mktRhedEz4
MUvq13jQmXo+vsN0eggEeUiFFHBHjlXs1g+b8bQ=
-----END CERTIFICATE-----
UPS即统一推送服务。个推与手机厂商合作,帮助建设系统消息推送通道。目前支持的厂商有坚果、海信和索尼。
应用创建后,在推送页面-配置管理-应用配置-Android多厂商配置-UPS,选择需要开通的UPS厂商,如下:
消息推送支持集成 Firebase 云信息传递(Firebase Cloud Messaging,简称 FCM)通道,以满足 App 在海外安卓设备上的使用推送的需求,该服务由 Google 拥有的 Firebase 公司提供。若app需要上架海外应用市场,建议您使用 Google Play专版 客户端 SDK 。
进入 Firebase官网 创建项目,获取 google-services.json 文件及 Server key 。
1,登录 google 账号,如果没有账号请先注册
3,打开项目列表页面,点击 “Add project” 创建项目
4,输入项目名称(根据自己应用取名),点击 “Continue”
5,确认是否需要使用 Google Analytics 服务(根据自己需要开启或关闭),点击 “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”
个推SDK的主要目标是提升开发者在服务端集成个推推送服务的开发效率。 开发者不需要进行复杂编程即可使用个推推送服务的各项常用功能,SDK可以自动帮您满足调用过程中所需的鉴权、组装参数、发送HTTP请求等非功能性要求。
开发语言 | 资源下载 | 其他 |
---|---|---|
Java | Maven 项目依赖 |
GitHub 项目主页 | 适用于 JDK 1.6 及其以上版本 |
| PHP | Composer 项目依赖
GitHub 项目主页 | 适用于 PHP 5.5 及其以上版本 |
<dependency>
<groupId>com.getui.push</groupId>
<artifactId>restful-sdk</artifactId>
<version>1.0.0.4</version>
</dependency>
/**
*
* @author zhoukeu
* @since 2021-12-20
*/
@RestController
@RequestMapping("/sys-message")
public class SysMessageController {
@Autowired
private 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
@Service
public class SysMessageServiceImpl extends ServiceBaseImpl<SysMessageMapper, SysMessage> implements SysMessageService {
@Resource
private GeTuiUtils geTuiUtils;
@Autowired
private 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
*/
@Mapper
public 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
@Component
public 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()) {
// success
log.info("推送成功");
System.out.println(apiResult.getData());
} else {
// failed
log.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;
}
}
/**
* 个推推送类
*/
@Configuration
public 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=200
System.setProperty("http.maxConnections", "200");
GtApiConfiguration apiConfiguration = new GtApiConfiguration();
// 填写应用配置
apiConfiguration.setAppId(appId);
apiConfiguration.setAppKey(appKey);
apiConfiguration.setMasterSecret(masterSecret);
// 接口调用前缀,请查看文档: 接口调用规范 -> 接口前缀, 可不填写appId
// 默认为https://restapi.getui.com/v2
apiConfiguration.setDomain("https://restapi.getui.com/v2/");
// 实例化ApiHelper对象,用于创建接口对象
ApiHelper apiHelper = ApiHelper.build(apiConfiguration);
return apiHelper;
}
}
push:
# 登录测试
app_id: l4jOPmTtJx9MpeY4SGgCh4
app_key: FEeRTZeCPx98QDwYBtZTG3
master_secret: RyU5cFvTy09YANmfJgWLC
# 本配置信息仅用于开发测试,请自行前往Uni Push信息配置获取