Vous savez, il est à nouveau utilisé dans le projet. En tant que programmeur, vous devez "évoluer" régulièrement et écrire dur. Bien que vous ayez écrit beaucoup de push en tant que développeur Android, les push d'uniapp sont également différents. Enregistrez-le. Pour usage futur.
Tout d'abord, le push uniPush d'uniapp est un service push unifié intégré lancé par DCloud et Getui Company, c'est-à-dire que vous n'avez pas à choisir, il suffit de pousser.
Deuxièmement, unipush est divisé en version 1.0 et version 2.0. C'est très important. C'est un concept complètement différent. Ne pensez pas qu'il s'agit d'une simple version mise à jour.
Version 1.0 : il s'agit d'une méthode push traditionnelle. Le client et le serveur doivent tous deux intégrer le service push, et le serveur envoie une demande au serveur push pour exploiter la fonction push correspondante.
Version 2.0 : Votre serveur n'existe pas. C'est l'équivalent du concept d'opération cloud , c'est-à-dire l'intégration d'uniCloud et du cloud. C'est aussi une tendance inévitable de la technologie cloud uniapp. Il a des fonctions puissantes et est livré avec une console Web.Puisqu'il en manque pour le serveur, le processus naturel est simple.
Assurez-vous donc de choisir une version raisonnable en fonction des besoins de votre entreprise. J'écris également pour la première fois. Je veux ressentir la nouvelle version. En conséquence, j'ai presque fini d'écrire et je me rends compte que quelque chose ne va pas. 2.0 n'est pas adapté aux besoins de mon projet cette fois, je suis donc revenu à la version 1.0. . Cet article présente donc toujours l'utilisation de la version 1.0 et comment l'ajuster si votre uniapp est packagée dans une application basée sur local.
Permettez-moi de parler de l'utilisation d'unipush 1.0 dans des circonstances normales (apk non emballé)
1. Ouvrir le service push unipush
Après avoir créé un nouveau projet uniapp, sélectionnez la configuration du module App dans manifest.json, puis cochez Push (message push) et la version correspondante, voici unipush 1.0
Cliquez ensuite sur Configurer pour entrer dans le centre de développement Dcloud
Ici, je ne présenterai pas d'iOS, vous pouvez donc décocher l'IOS dans la plateforme de sélection. Ici, vous pouvez voir que vous devez remplir le nom et la signature du package.
Concernant le packaging, si vous utilisez le cloud packaging
Vous pouvez également voir que votre nom de package est en fait uni. Votre AppID est la chose encerclée ci-dessus, remplissez-le dans la colonne du nom du package, n'oubliez pas de vérifier l'utilisation de l'ancien certificat Dcloud lors de l'emballage. De cette façon, vous pouvez regarder l'introduction dans la colonne de signature du centre de développement. Cela signifie-t-il que si vous utilisez un emballage cloud et une ancienne version du certificat, quoi remplir la signature, il vous a déjà dit, copiez cette signature et remplissez la colonne Entrez la signature.
Enfin, cliquez pour activer l'application, et une fenêtre pop-up apparaîtra lorsque l'activation est réussie.
2. Pousser les connaissances connexes
Pour écrire push, vous devez d'abord comprendre push. Comme le push traditionnel ou ce genre de livraison en temps réel d'une petite quantité d'informations (messagerie instantanée), ce n'est rien de plus que :
1. La méthode du polling, c'est-à-dire faire régulièrement des requêtes http pour vérifier s'il y a des nouvelles à envoyer, cette méthode est la méthode la plus stupide.
2. SMS, Hao, n'hésitez pas
3. Connexion longue, bien que la connexion longue soit mature maintenant, mais pour les téléphones mobiles, ce type de consommation de performances est encore énorme. Après tout, ce n'est pas un chat ou une diffusion en direct.
Heureusement, des notifications tierces matures sont déjà apparues sur le marché, telles que Jiguang Push, Alibaba Cloud Push, Getui, etc. Je ne m'étendrai pas ici, mais je le mentionnerai simplement. Étant donné que de nombreuses personnes se sont engagées dans le développement de technologies Web en arrière-plan ou non mobiles, elles ne connaissent pas le push mobile, ni même ce qu'est le push.
Comme le montre l'image, il existe diverses fenêtres contextuelles sur la barre d'état de votre téléphone mobile que vous aimez parfois et dont vous vous lasserez parfois.Il peut s'agir de publicités, de notifications de mise à jour, de certains messages ou de SMS, etc. Et push ne fait pas seulement référence aux fenêtres pop-up, cette fenêtre pop-up est une fonction fournie avec Android, c'est-à-dire la notification (notification), vous pouvez laisser votre téléphone mobile afficher ces fenêtres pop-up sans aucune technologie push , et même apporter diverses icônes, effets sonores, vibrations, etc. Et la poussée consiste à transmettre des données au téléphone mobile en temps réel, à faire savoir au téléphone mobile que je vais démarrer des fenêtres contextuelles, quel est le contenu affiché sur la fenêtre contextuelle ou quoi faire en cliquant dessus fenêtre pop-up, comprenez les applaudissements !
Deuxièmement, parlons brièvement du principe du push et de l'architecture technique, je reprends directement l'image originale d'unipush, et je ne sais pas dessiner.
Pour le dire franchement, votre téléphone mobile établit d'abord une connexion avec le serveur unipush (serveur push), qui est essentiellement établi via une identification unique, qui est ici appelée clientId (cid). Ensuite, après que votre serveur java intègre le service push, vous pouvez appeler l'API du serveur push en envoyant une requête pour lui dire que je veux pousser un message xxx vers le téléphone mobile dont le cid est xx, et le serveur push peut pousser les données au téléphone mobile via le cid .
Vous avez également vu que je parle de téléphones portables et d'équipements, pas d'une certaine personne ou d'un certain compte. Parce que le compte est souvent un ensemble de système de compte de notre propre serveur. Donc, si vous voulez une méthode push plus riche, ou l'associez à votre propre système de compte (vous pouvez également transmettre directement l'ID de périphérique cid à votre propre serveur pour le lier), alors vous avez besoin d'un ensemble d'autres méthodes push liées à cid, qui est dérivé Hors de l'alias (alias), étiquette (tag). Certaines méthodes push tierces ont des méthodes plus riches, mais elles sont similaires et ont généralement des méthodes telles que des alias et des balises.
Alias (alias), généralement utilisé pour s'associer à votre propre compte. Il peut s'agir du numéro de compte, du surnom, de l'adresse e-mail ou du numéro de téléphone mobile de l'utilisateur, selon vos propres besoins.
Les balises sont généralement utilisées pour regrouper votre propre système de compte, comme le push collectif pour un certain type d'utilisateurs, ou le push collectif pour les utilisateurs d'un certain groupe.
Enfin, vous devez comprendre que le push est généralement divisé en deux types, l'un s'appelle notification et l'autre s'appelle message (unipush s'appelle ici message de transmission transparent). La différence entre les deux est que l'un sert uniquement à rappeler et l'autre à transmettre des données ou à personnaliser la logique métier, les styles, etc.
Les notifications sont relativement simples et grossières. Généralement, il suffit de passer un titre et un contenu, puis de l'afficher automatiquement sur le téléphone mobile. Par exemple, cela sert à rappeler aux utilisateurs que le logiciel doit être mis à jour, que vous avez de nouveaux messages, de nouvelles réponses , etc.
Pour les messages de transmission transparents, vous pouvez généralement personnaliser le format de données, mais json est principalement utilisé.Deuxièmement, une fois que votre téléphone mobile reçoit le message de transmission transparent, il n'ouvrira pas automatiquement une fenêtre comme une notification, mais il n'y a aucune réponse du tout. , venez de recevoir les données , vous devez ouvrir une fenêtre contextuelle en fonction de l'entreprise ou effectuer des opérations de suivi.
Le processus push est légèrement différent des autres push tiers. Vous devez obtenir le cid dès que l'application est en cours d'exécution, puis écrire une interface en arrière-plan Java. L'application transmet le cid au serveur d'arrière-plan, et l'arrière-plan le serveur exécute le cid, l'alias et l'étiquette à lier. Une fois que l'utilisateur s'est déconnecté, n'oubliez pas de dissocier, sinon, s'il y a plusieurs appareils pour se connecter avec un compte, il y aura des poussées désordonnées.
Eh bien, il suffit de les comprendre fondamentalement. Continuez à coder !
3. uniapp obtient le clientId et établit une connexion avec unipush
Nous devrions d'abord obtenir le clientId lorsque l'application s'exécute pour la première fois, le code est le suivant
getClient: (callback) => {
// #ifdef APP-PLUS
let clientInfo = plus.push.getClientInfo(); //获取 clientID
uni.setStorageSync('clientid', clientInfo.clientid) //缓存到本地
console.log(clientInfo);
// #endif
}
4. Surveillez le traitement lors de la réception de la poussée
En plus d'obtenir le cid, nous devons également configurer le traitement des messages push reçus. Certains des codes ici sont empruntés à d'autres (je ne sais pas qui exactement...), et ajouter nos propres ajustements. Ensuite, mettez-le dans un fichier js unipush.js pour plus de commodité
export default {
init: () => {
// #ifdef APP-PLUS
plus.push.setAutoNotification(true); //设置通知栏显示通知 //必须设置
plus.push.addEventListener("click", function(msg) {
plus.push.clear(); //清空通知栏
pushHandle(msg) //处理方法
}, false);
// 监听在线消息事件
plus.push.addEventListener("receive", function(msg) {
console.log("receive:"+JSON.stringify(msg));
if (plus.os.name=='iOS') { //由于IOS 必须要创建本地消息 所以做这个判断
if (msg.payload&& msg.payload!=null&&msg.type=='receive') {
console.log(msg);
// {"title": "xxx","content": "xxx","payload": "xxx"} 符合这种 才会自动创建消息 文档地址https://ask.dcloud.net.cn/article/35622
plus.push.createMessage(msg.title,msg.content,JSON.stringify(msg.payload)) //创建本地消息
}
}
if (plus.os.name=='Android') {
let options={
cover:false,
sound:"system",
title:msg.title
}
plus.push.createMessage(msg.content,msg.payload.content,options);
// if(!msg.title||!msg.content||!msg.payload){ // 不符合自动创建消息的情况
// //这里根据你消息字段来创建消息
// console.log("这里根据你消息字段来创建消息:"+msg.title+","+msg.content+","+msg.payload);
// plus.push.createMessage(msg.payload.content,JSON.stringify(msg.payload)) //创建本地消息
// }else{
// //符合自动创建消息
// console.log("符合自动创建消息"+msg.title+","+msg.content+","+msg.payload);
// pushHandle(msg)
// }
}
}, false);
// #endif
},
getClient: (callback) => {
// #ifdef APP-PLUS
let clientInfo = plus.push.getClientInfo(); //获取 clientID
uni.setStorageSync('clientid', clientInfo.clientid)
console.log(clientInfo);
// #endif
},
}
const pushHandle = (msg) => {
if (typeof (msg.payload )=='string') { //如果是字符串,表示是ios创建的 要转换一下
msg.payload=JSON.parse(msg.payload )
}
if(!msg) return false;
plus.runtime.setBadgeNumber(0); //清除app角标
//下面的代码根据自己业务来写 这里可以写跳转业务代码
//跳转到tab
if (msg.payload.pathType == '1') {
uni.switchTab({
url: msg.payload.url
})
}
//跳转到详情
if (msg.payload.pathType == 0) {
let url = msg.payload.url
if (msg.payload.args) {
url = url + '?id=' + msg.payload.args
}
console.log(url);
uni.navigateTo({
url: url
})
}
}
Enfin, ajoutez le code suivant dans App.vue
<script>
import push from 'push/unipush.js';
export default {
onLaunch: function() {
console.log('App Launch');
push.getClient();
push.init();
},
onShow: function() {
console.log('App Show')
},
onHide: function() {
console.log('App Hide')
}
}
</script>
<style>
/*每个页面公共css */
</style>
Jusqu'à présent, le code de téléphone portable a été complété. Assez simple. Vient ensuite le côté serveur Java
5. Push intégré côté serveur Java
Pour obtenir des informations pertinentes telles que la clé secrète, accédez au centre de développement, et il y a des informations relatives à la clé secrète dans le message push -> gestion de la configuration -> configuration de l'application
Mon arrière-plan est Springboot, alors remplissez la configuration suivante sous application.yml
Ensuite, intégrez un sdk poussé dans pom.xml
<dependency>
<groupId>com.getui.push</groupId>
<artifactId>restful-sdk</artifactId>
<version>1.0.0.8</version>
</dependency>
6. Créer une classe de configuration push GTPushConfig
import com.getui.push.v2.sdk.ApiHelper;
import com.getui.push.v2.sdk.GtApiConfiguration;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class GTPushConfig {
// @Value("https://restapi.getui.com/v2")
// private String baseUrl;
@Value("${uniPush.appId}")
private String appId;
@Value("${uniPush.appKey}")
private String appKey;
@Value("${uniPush.masterSecret}")
private String masterSecret;
@Bean(name = "myApiHelper")
public ApiHelper apiHelper() {
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;
}
}
7. Encapsuler la classe d'outil push PushUtil et la classe d'entité de message push
Classe d'entité de message push
@Data
public class PushReqBean implements Serializable {
//消息类型 0代表透传消息(使用这个,需要手机自己弹出通知,定义通知样式,content为json串) 1代表是通知(使用这个,标题和内容即手机上显示的通知标题和内容)
private Integer noticeType;
//推送用户类型 0 全部用户 1根据cid推送 2根据别名 3根据标签
private Integer userType;
//用户标识,可为cid,别名,tag,多个之间逗号隔开
private String user;
//推送标题
private String title;
//推送内容
private String content;
}
Le résultat de l'appel api encapsule la classe d'entité (optionnel)
@Data
public class ResultBean implements Serializable {
public int code;
public String msg;
public Object data;
}
Classe d'outils push, dans celle-ci, j'ai intégré presque toutes les fonctions, telles que les alias de liaison, la liaison par lots, les balises de liaison, la déliaison, les notifications push selon diverses méthodes, les messages de transmission push transparents selon diverses méthodes, etc. .
import com.getui.push.v2.sdk.ApiHelper;
import com.getui.push.v2.sdk.api.PushApi;
import com.getui.push.v2.sdk.api.UserApi;
import com.getui.push.v2.sdk.common.ApiResult;
import com.getui.push.v2.sdk.dto.req.*;
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.GTNotification;
import com.getui.push.v2.sdk.dto.res.QueryCidResDTO;
import com.getui.push.v2.sdk.dto.res.TaskIdDTO;
import com.google.gson.JsonObject;
import com.njlift.wechat.common.Result;
import com.njlift.wechat.entity.PushReqBean;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.*;
@Component
public class PushUtil {
@Resource(name = "myApiHelper")
private ApiHelper myApiHelper;
/**
* 绑定别名
* @param cid 用户在推送服务器的唯一识别标志
* @param alias 在自己服务器上的唯一识别标志
* @return 绑定结果
*/
public Result bindAlias(String cid,String alias){
Result rb=new Result();
CidAliasListDTO cidAliasListDTO=new CidAliasListDTO();
CidAliasListDTO.CidAlias cidAlias=new CidAliasListDTO.CidAlias();
cidAlias.setCid(cid);
cidAlias.setAlias(alias);
cidAliasListDTO.add(cidAlias);
UserApi userApi = myApiHelper.creatApi(UserApi.class);
ApiResult<Void> voidApiResult = userApi.bindAlias(cidAliasListDTO);
rb.setCode(voidApiResult.getCode());
rb.setMsg(voidApiResult.getMsg());
rb.setData(voidApiResult.getData());
return rb;
}
/**
* 批量解绑别名
* @param aliasList 别名列表
* @return 解绑结果
*
*/
public Result unbindAlias(List<String> aliasList){
Result rb=new Result();
List<CidAliasListDTO.CidAlias> list=new ArrayList<>();
UserApi userApi = myApiHelper.creatApi(UserApi.class);
for (String alias:aliasList){
ApiResult<QueryCidResDTO> queryCidResDTOApiResult = userApi.queryCidByAlias(alias);
if (queryCidResDTOApiResult.isSuccess()){
List<String> cidList = queryCidResDTOApiResult.getData().getCid();
for (String cid:cidList){
CidAliasListDTO.CidAlias cidAlias=new CidAliasListDTO.CidAlias();
cidAlias.setAlias(alias);
cidAlias.setCid(cid);
list.add(cidAlias);
}
}
}
CidAliasListDTO cidAliasListDTO=new CidAliasListDTO();
cidAliasListDTO.setDataList(list);
ApiResult<Void> voidApiResult = userApi.batchUnbindAlias(cidAliasListDTO);
rb.setCode(voidApiResult.getCode());
rb.setMsg(voidApiResult.getMsg());
rb.setData(voidApiResult.getData());
return rb;
}
/**
* 一个用户根据cid进行绑定tag标签(次数限制)
* @param cid 用户在推送服务器的唯一识别标志
* @param tag 标签名
* @return 绑定结果
*/
public Result userBindTagsByCid(String cid,String tag){
Result rb=new Result();
UserApi userApi = myApiHelper.creatApi(UserApi.class);
TagDTO dto=new TagDTO();
dto.addTag(tag);
ApiResult<Void> voidApiResult = userApi.userBindTags(cid, dto);
rb.setCode(voidApiResult.getCode());
rb.setMsg(voidApiResult.getMsg());
rb.setData(voidApiResult.getData());
return rb;
}
/**
* 一个用户根据别名进行绑定tag标签(次数限制)
* @param alias 在自己服务器上的唯一识别标志
* @param tag 标签名
* @return 绑定结果
*/
public Result userBindTagsByAlias(String alias,String tag){
Result rb=new Result();
rb.setCode(1);
UserApi userApi = myApiHelper.creatApi(UserApi.class);
ApiResult<QueryCidResDTO> queryCidResDTOApiResult = userApi.queryCidByAlias(alias);
if (queryCidResDTOApiResult.isSuccess()){
List<String> cidList = queryCidResDTOApiResult.getData().getCid();
if (cidList.size()==1){
String cid = cidList.get(0);
TagDTO dto=new TagDTO();
dto.addTag(tag);
ApiResult<Void> voidApiResult = userApi.userBindTags(cid, dto);
rb.setCode(voidApiResult.getCode());
rb.setMsg(voidApiResult.getMsg());
rb.setData(voidApiResult.getData());
}else {
rb.setMsg("该别名对应多个cid,无法绑定标签");
}
}else {
rb.setMsg(queryCidResDTOApiResult.getMsg());
}
return rb;
}
/**
* 一批用户绑定tag标签(每分钟100次,每日10000次)
* @param cidList 用户在推送服务器的唯一识别标志
* @param tag 标签名
* @return 绑定结果
*/
public Result userBindTagsByAlias(List<String> cidList,String tag){
Result rb=new Result();
rb.setCode(1);
UserApi userApi = myApiHelper.creatApi(UserApi.class);
UserDTO userDTO=new UserDTO();
Set<String> cidSet=new HashSet<>(cidList);
userDTO.setCid(cidSet);
ApiResult<Map<String, String>> mapApiResult = userApi.usersBindTag(tag, userDTO);
rb.setCode(mapApiResult.getCode());
rb.setMsg(mapApiResult.getMsg());
rb.setData(mapApiResult.getData());
return rb;
}
/**
* 批量用户解绑一个标签
* @param list 用户集合(可cid集合或alias集合)
* @param type 0表示alias集合,1表示cid集合
* @param tag 标签
* @return 解绑结果
*/
public Result usersUnbindTag(List<String> list,int type,String tag){
Result rb=new Result();
rb.setCode(1);
UserApi userApi = myApiHelper.creatApi(UserApi.class);
UserDTO userDTO=new UserDTO();
List<String> cidList=new ArrayList<>();
if (type==0){
for (String alias:list){
ApiResult<QueryCidResDTO> queryCidResDTOApiResult = userApi.queryCidByAlias(alias);
if (queryCidResDTOApiResult.isSuccess()){
cidList.addAll(queryCidResDTOApiResult.getData().getCid());
}
}
}else {
cidList.addAll(list);
}
Set<String> cidSet=new HashSet<>(cidList);
userDTO.setCid(cidSet);
ApiResult<Map<String, String>> mapApiResult = userApi.deleteUsersTag(tag, userDTO);
rb.setCode(mapApiResult.getCode());
rb.setMsg(mapApiResult.getMsg());
rb.setData(mapApiResult.getData());
return rb;
}
/**
* 群推透传消息
* @param bean 推送信息
* @return 结果
*/
public Result pushMessageToAll(PushReqBean bean){
Result rb=new Result();
PushDTO<String> pushDTO = new PushDTO<String>();
pushDTO.setRequestId(System.currentTimeMillis() + "");
pushDTO.setAudience("all");
PushMessage pushMessage = new PushMessage();
JsonObject jsonObject=new JsonObject();
jsonObject.addProperty("m_title",bean.getTitle());
jsonObject.addProperty("m_content",bean.getContent());
pushMessage.setTransmission(jsonObject.toString());
pushDTO.setPushMessage(pushMessage);
PushApi pushApi = myApiHelper.creatApi(PushApi.class);
ApiResult<TaskIdDTO> apiResult = pushApi.pushAll(pushDTO);
rb.setCode(apiResult.getCode());
rb.setMsg(apiResult.getMsg());
rb.setData(apiResult.getData());
return rb;
}
/**
* 根据cid推送消息(含批量)
* @param bean 推送信息
* @return 结果
*/
public Result pushMessageToCid(PushReqBean bean){
boolean isMany=bean.getUser().contains(",");
if (isMany){
return pushMessageToManyCid(bean);
}else {
return pushMessageToSingleCid(bean);
}
}
/**
* 根据别名推送消息(含批量)
* @param bean 推送信息
* @return 结果
*/
public Result pushMessageToAlias(PushReqBean bean){
boolean isMany=bean.getUser().contains(",");
if (isMany){
return pushMessageToManyAlias(bean);
}else {
return pushMessageToSingleAlias(bean);
}
}
//根据cid单推消息
private Result pushMessageToSingleCid(PushReqBean bean){
Result rb=new Result();
PushDTO<Audience> pushDTO = new PushDTO<Audience>();
pushDTO.setRequestId(System.currentTimeMillis() + "");
PushMessage pushMessage = new PushMessage();
JsonObject jsonObject=new JsonObject();
jsonObject.addProperty("m_title",bean.getTitle());
jsonObject.addProperty("m_content",bean.getContent());
pushMessage.setTransmission(jsonObject.toString());
pushDTO.setPushMessage(pushMessage);
Audience audience = new Audience();
audience.addCid(bean.getUser());
pushDTO.setAudience(audience);
PushApi pushApi = myApiHelper.creatApi(PushApi.class);
ApiResult<Map<String, Map<String, String>>> apiResult = pushApi.pushToSingleByCid(pushDTO);
rb.setCode(apiResult.getCode());
rb.setMsg(apiResult.getMsg());
rb.setData(apiResult.getData());
return rb;
}
//批量根据cid推送消息
private Result pushMessageToManyCid(PushReqBean bean){
Result rb = new Result();
PushDTO pushDTO=new PushDTO();
PushMessage pushMessage = new PushMessage();
JsonObject jsonObject=new JsonObject();
jsonObject.addProperty("m_title",bean.getTitle());
jsonObject.addProperty("m_content",bean.getContent());
pushMessage.setTransmission(jsonObject.toString());
pushDTO.setPushMessage(pushMessage);
PushApi pushApi = myApiHelper.creatApi(PushApi.class);
ApiResult<TaskIdDTO> msg = pushApi.createMsg(pushDTO);
if (msg.isSuccess()){
AudienceDTO audienceDTO=new AudienceDTO();
audienceDTO.setTaskid(msg.getData().getTaskId());
audienceDTO.setAsync(true);
List<String> users = Arrays.asList(bean.getUser().split(","));
Audience audience=new Audience();
for (String user:users){
audience.addCid(user);
}
audienceDTO.setAudience(audience);
PushApi pushApi1 = myApiHelper.creatApi(PushApi.class);
ApiResult<Map<String, Map<String, String>>> mapApiResult = pushApi1.pushListByCid(audienceDTO);
rb.setCode(mapApiResult.getCode());
rb.setMsg(mapApiResult.getMsg());
rb.setData(mapApiResult.getData());
}else {
rb.setCode(msg.getCode());
rb.setMsg(msg.getMsg());
rb.setData(msg.getData());
}
return rb;
}
//根据别名单推消息
private Result pushMessageToSingleAlias(PushReqBean bean){
Result rb=new Result();
PushDTO<Audience> pushDTO = new PushDTO<Audience>();
pushDTO.setRequestId(System.currentTimeMillis() + "");
PushMessage pushMessage = new PushMessage();
JsonObject jsonObject=new JsonObject();
jsonObject.addProperty("m_title",bean.getTitle());
jsonObject.addProperty("m_content",bean.getContent());
pushMessage.setTransmission(jsonObject.toString());
pushDTO.setPushMessage(pushMessage);
Audience audience = new Audience();
audience.addAlias(bean.getUser());
pushDTO.setAudience(audience);
PushApi pushApi = myApiHelper.creatApi(PushApi.class);
ApiResult<Map<String, Map<String, String>>> apiResult = pushApi.pushToSingleByAlias(pushDTO);
rb.setCode(apiResult.getCode());
rb.setMsg(apiResult.getMsg());
rb.setData(apiResult.getData());
return rb;
}
//批量根据别名推送消息
private Result pushMessageToManyAlias(PushReqBean bean){
Result rb = new Result();
PushDTO pushDTO=new PushDTO();
PushMessage pushMessage = new PushMessage();
JsonObject jsonObject=new JsonObject();
jsonObject.addProperty("m_title",bean.getTitle());
jsonObject.addProperty("m_content",bean.getContent());
pushMessage.setTransmission(jsonObject.toString());
pushDTO.setPushMessage(pushMessage);
PushApi pushApi = myApiHelper.creatApi(PushApi.class);
ApiResult<TaskIdDTO> msg = pushApi.createMsg(pushDTO);
if (msg.isSuccess()){
AudienceDTO audienceDTO=new AudienceDTO();
audienceDTO.setTaskid(msg.getData().getTaskId());
audienceDTO.setAsync(true);
List<String> users = Arrays.asList(bean.getUser().split(","));
Audience audience=new Audience();
for (String user:users){
audience.addAlias(user);
}
audienceDTO.setAudience(audience);
PushApi pushApi1 = myApiHelper.creatApi(PushApi.class);
ApiResult<Map<String, Map<String, String>>> mapApiResult = pushApi1.pushListByAlias(audienceDTO);
rb.setCode(mapApiResult.getCode());
rb.setMsg(mapApiResult.getMsg());
rb.setData(mapApiResult.getData());
}else {
rb.setCode(msg.getCode());
rb.setMsg(msg.getMsg());
rb.setData(msg.getData());
}
return rb;
}
//根据标签推送消息
public Result pushMessageToTag(PushReqBean bean){
Result rb=new Result();
PushDTO<Audience> pushDTO = new PushDTO<Audience>();
pushDTO.setRequestId(System.currentTimeMillis() + "");
PushMessage pushMessage = new PushMessage();
JsonObject jsonObject=new JsonObject();
jsonObject.addProperty("m_title",bean.getTitle());
jsonObject.addProperty("m_content",bean.getContent());
pushMessage.setTransmission(jsonObject.toString());
pushDTO.setPushMessage(pushMessage);
Audience audience = new Audience();
Condition condition=new Condition();
condition.setKey("custom_tag");
List<String> tags=new ArrayList<>();
if (bean.getUser().contains(",")){
tags.addAll(Arrays.asList(bean.getUser().split(",")));
}else {
tags.add(bean.getUser());
}
Set<String> sets=new HashSet<>();
for (String tag:tags){
sets.add(tag);
}
condition.setValues(sets);
condition.setOptType("and");
audience.addCondition(condition);
pushDTO.setAudience(audience);
PushApi pushApi = myApiHelper.creatApi(PushApi.class);
ApiResult<TaskIdDTO> apiResult = pushApi.pushByTag(pushDTO);
rb.setCode(apiResult.getCode());
rb.setMsg(apiResult.getMsg());
rb.setData(apiResult.getData());
return rb;
}
/**
* 群推通知
* @param bean 推送信息
* @return 结果
*/
public Result pushNoticeToAll(PushReqBean bean){
Result rb=new Result();
PushDTO<String> pushDTO = new PushDTO<String>();
pushDTO.setRequestId(System.currentTimeMillis() + "");
pushDTO.setAudience("all");
PushMessage pushMessage = new PushMessage();
GTNotification notification = new GTNotification();
notification.setTitle(bean.getTitle());
notification.setBody(bean.getContent());
notification.setClickType("none");
pushMessage.setNotification(notification);
pushDTO.setPushMessage(pushMessage);
PushApi pushApi = myApiHelper.creatApi(PushApi.class);
ApiResult<TaskIdDTO> apiResult = pushApi.pushAll(pushDTO);
rb.setCode(apiResult.getCode());
rb.setMsg(apiResult.getMsg());
rb.setData(apiResult.getData());
return rb;
}
/**
* 根据cid推送通知(含批量)
* @param bean 推送信息
* @return 结果
*/
public Result pushNoticeToCid(PushReqBean bean){
boolean isMany=bean.getUser().contains(",");
if (isMany){
return pushNoticeToManyCid(bean);
}else {
return pushNoticeToSingleCid(bean);
}
}
/**
* 根据别名推送通知(含批量)
* @param bean 推送信息
* @return 结果
*/
public Result pushNoticeToAlias(PushReqBean bean){
boolean isMany=bean.getUser().contains(",");
if (isMany){
return pushNoticeToManyAlias(bean);
}else {
return pushNoticeToSingleAlias(bean);
}
}
//根据cid单推通知
private Result pushNoticeToSingleCid(PushReqBean bean){
Result rb=new Result();
PushDTO<Audience> pushDTO = new PushDTO<Audience>();
pushDTO.setRequestId(System.currentTimeMillis() + "");
PushMessage pushMessage = new PushMessage();
GTNotification notification = new GTNotification();
notification.setTitle(bean.getTitle());
notification.setBody(bean.getContent());
notification.setClickType("none");
pushMessage.setNotification(notification);
pushDTO.setPushMessage(pushMessage);
Audience audience = new Audience();
audience.addCid(bean.getUser());
pushDTO.setAudience(audience);
PushApi pushApi = myApiHelper.creatApi(PushApi.class);
ApiResult<Map<String, Map<String, String>>> apiResult = pushApi.pushToSingleByCid(pushDTO);
rb.setCode(apiResult.getCode());
rb.setMsg(apiResult.getMsg());
rb.setData(apiResult.getData());
return rb;
}
//批量根据cid推送通知
private Result pushNoticeToManyCid(PushReqBean bean) {
Result rb = new Result();
PushDTO pushDTO=new PushDTO();
PushMessage pushMessage = new PushMessage();
GTNotification notification = new GTNotification();
notification.setTitle(bean.getTitle());
notification.setBody(bean.getContent());
notification.setClickType("none");
pushMessage.setNotification(notification);
pushDTO.setPushMessage(pushMessage);
PushApi pushApi = myApiHelper.creatApi(PushApi.class);
ApiResult<TaskIdDTO> msg = pushApi.createMsg(pushDTO);
if (msg.isSuccess()){
AudienceDTO audienceDTO=new AudienceDTO();
audienceDTO.setTaskid(msg.getData().getTaskId());
audienceDTO.setAsync(true);
List<String> users = Arrays.asList(bean.getUser().split(","));
Audience audience=new Audience();
for (String user:users){
audience.addCid(user);
}
audienceDTO.setAudience(audience);
PushApi pushApi1 = myApiHelper.creatApi(PushApi.class);
ApiResult<Map<String, Map<String, String>>> mapApiResult = pushApi1.pushListByCid(audienceDTO);
rb.setCode(mapApiResult.getCode());
rb.setMsg(mapApiResult.getMsg());
rb.setData(mapApiResult.getData());
}else {
rb.setCode(msg.getCode());
rb.setMsg(msg.getMsg());
rb.setData(msg.getData());
}
return rb;
}
//根据别名单推通知
private Result pushNoticeToSingleAlias(PushReqBean bean){
Result rb=new Result();
PushDTO<Audience> pushDTO = new PushDTO<Audience>();
pushDTO.setRequestId(System.currentTimeMillis() + "");
PushMessage pushMessage = new PushMessage();
GTNotification notification = new GTNotification();
notification.setTitle(bean.getTitle());
notification.setBody(bean.getContent());
notification.setClickType("none");
pushMessage.setNotification(notification);
pushDTO.setPushMessage(pushMessage);
Audience audience = new Audience();
audience.addAlias(bean.getUser());
pushDTO.setAudience(audience);
PushApi pushApi = myApiHelper.creatApi(PushApi.class);
ApiResult<Map<String, Map<String, String>>> apiResult = pushApi.pushToSingleByAlias(pushDTO);
rb.setCode(apiResult.getCode());
rb.setMsg(apiResult.getMsg());
rb.setData(apiResult.getData());
return rb;
}
//批量根据别名推送通知
private Result pushNoticeToManyAlias(PushReqBean bean) {
Result rb = new Result();
PushDTO pushDTO=new PushDTO();
PushMessage pushMessage = new PushMessage();
GTNotification notification = new GTNotification();
notification.setTitle(bean.getTitle());
notification.setBody(bean.getContent());
notification.setClickType("none");
pushMessage.setNotification(notification);
pushDTO.setPushMessage(pushMessage);
PushApi pushApi = myApiHelper.creatApi(PushApi.class);
ApiResult<TaskIdDTO> msg = pushApi.createMsg(pushDTO);
if (msg.isSuccess()){
AudienceDTO audienceDTO=new AudienceDTO();
audienceDTO.setTaskid(msg.getData().getTaskId());
audienceDTO.setAsync(true);
List<String> users = Arrays.asList(bean.getUser().split(","));
Audience audience=new Audience();
for (String user:users){
audience.addAlias(user);
}
audienceDTO.setAudience(audience);
PushApi pushApi1 = myApiHelper.creatApi(PushApi.class);
ApiResult<Map<String, Map<String, String>>> mapApiResult = pushApi1.pushListByAlias(audienceDTO);
rb.setCode(mapApiResult.getCode());
rb.setMsg(mapApiResult.getMsg());
rb.setData(mapApiResult.getData());
}else {
rb.setCode(msg.getCode());
rb.setMsg(msg.getMsg());
rb.setData(msg.getData());
}
return rb;
}
//根据标签推送通知
public Result pushNoticeToTag(PushReqBean bean){
Result rb=new Result();
PushDTO<Audience> pushDTO = new PushDTO<Audience>();
pushDTO.setRequestId(System.currentTimeMillis() + "");
PushMessage pushMessage = new PushMessage();
GTNotification notification = new GTNotification();
notification.setTitle(bean.getTitle());
notification.setBody(bean.getContent());
notification.setClickType("none");
pushMessage.setNotification(notification);
pushDTO.setPushMessage(pushMessage);
Audience audience = new Audience();
Condition condition=new Condition();
condition.setKey("custom_tag");
List<String> tags=new ArrayList<>();
if (bean.getUser().contains(",")){
tags.addAll(Arrays.asList(bean.getUser().split(",")));
}else {
tags.add(bean.getUser());
}
Set<String> sets=new HashSet<>();
for (String tag:tags){
sets.add(tag);
}
condition.setValues(sets);
condition.setOptType("and");
audience.addCondition(condition);
pushDTO.setAudience(audience);
PushApi pushApi = myApiHelper.creatApi(PushApi.class);
ApiResult<TaskIdDTO> apiResult = pushApi.pushByTag(pushDTO);
rb.setCode(apiResult.getCode());
rb.setMsg(apiResult.getMsg());
rb.setData(apiResult.getData());
return rb;
}
}
En fait, le contenu de la classe d'outils peut en deviner approximativement la signification. Pour plus de détails, vous pouvez vous référer à Push Server Documentation Push API-Tui Document Center
En fait, il s'agit de construire des paramètres, de demander, puis de demander à un serveur push de fonctionner.
Huit, test d'emballage
Si vous souhaitez exécuter directement sur l'émulateur ou le téléphone mobile, cela n'aura aucun effet, car l'exécution d'uniapp est divisée en un dock standard et un dock personnalisé.
La brève description est que la base standard est utilisée pour un débogage simple. Lorsque la couche native reste inchangée, le nouveau code peut être chargé dynamiquement et exécuté avec un rechargement à chaud. Mais si vous modifiez la couche native, vous devez l'empaqueter dans un apk android ou un package ios ipa. De cette façon, vous ne pouvez même pas surveiller les journaux, et ce sera très gênant pour l'étape de débogage et de développement, vous avez donc une base personnalisée.
Cliquez sur Exécuter -> Exécuter sur un téléphone mobile ou un émulateur -> Créer une base de débogage personnalisée
La déclaration officielle est également très claire, avec la base personnalisée, ces configurations de SDK tiers prendront également effet et ne devront être empaquetées qu'une seule fois, à moins que vous ne modifiiez à nouveau la configuration.
La production est relativement simple. Je recommande d'utiliser votre propre certificat ici, donc il n'y a pas de limite. Le certificat généré se trouve dans l'article en bas du blog, qui est le fichier jks. Certaines personnes utilisent d'autres formats. Ce n'est pas le cas importe, c'est juste un certificat Android. Ensuite, choisissez d'ouvrir une base de débogage personnalisée, un emballage traditionnel, puis confirmez pour attendre l'emballage.
Cliquez ensuite sur Exécuter, choisissez d'exécuter la base personnalisée, et vous pouvez l'exécuter directement sur l'émulateur ou la machine réelle connectée à l'ordinateur, et effectuer un débogage conjoint pour voir l'effet.
9. Emballez localement uniapp en tant qu'apk (si utilisé, veuillez lire ci-dessous)
Si vous utilisez le studio Android local pour empaqueter l'apk, vous devez importer le paquet jar/aar en plus des opérations ci-dessus. Comment utiliser l'empaquetage local uniapp a été expliqué dans le blog précédent, donc je ne dirai pas grand-chose ici.
Il existe des packages jar/aar correspondants dans le dossier SDK du projet de projet précédemment téléchargé
Ramassez-le au besoin, ne les mettez pas tous dedans, je mets ceux-ci
Ensuite, sous le build.gradle du projet (pas le build.gradle le plus externe), ajoutez le code manifestPlaceholders sous android comme suit, un total de quatre valeurs, l'appid de votre uniapp, puis la configuration de unipush, et enfin votre projet android Nom du package, l'applicationId est le nom du package, vous devez remplir le même que l'applicationId
Enfin, pensez à vous rendre dans le Developer Center pour modifier le nom et la signature de votre package
Remplissez le nom du package dans votre studio Android et la valeur sha1 de votre certificat apk packagé. Ceci est également expliqué dans le blog qui a été packagé auparavant. Je n'entrerai pas dans les détails ici. Jusqu'à présent, tout est fini.
Adresse du blog sur l'emballage : Hbuilderx uniapp local packaging android project
mots supplémentaires
Enfin, il y a un autre point à noter que le téléphone mobile Mi masquera le push dans les notifications sans importance (pas que le message de notification n'a pas été reçu) .Pour résoudre ce problème, vous devez demander un canal sur la plate-forme de développement Mi pour régler le niveau du message, réglez-le sur le niveau important. Je mettrai à jour ici quand j'aurai le temps. Lisez d'abord ce document : Centre de documentation
Ma création personnelle, s'il y a une similitude, c'est purement fortuite, ou contactez-moi pour apporter des modifications. Veuillez réimprimer ou combiner votre CV pour indiquer la source, merci ! (Si vous avez des questions ou des erreurs, veuillez les signaler, mon QQ : 752231513)