UniPush + Java 实现个推。

zzzzchen 的个人博客 记录精彩的程序人生 本文由博客端 https://www.dczzs.com 主动推送

一、uni-app 端设置

1、打开 HBuilder X,在项目的 manifest.json 中找到 APP 模块配置,右侧将 Push(消息推送)勾选,会自动勾选 uniPush 服务。

image.png

2、点击 uniPush 下方的配置按钮(登录),点击 Uni Push 下的修改应用信息,将右侧内容填好,如果安卓使用的是公共测试证书的话,直接填 B0:1D:06:18:0D:00:3E:79:C7:B9:08:89:93:B8:E5:AE:7A:19:B0:DA:11:61:AA:09:7C:7F:39:8A:6F:51:4F:A7 即可。如果是自有证书,可以去搜查看证书的 sha256,将自己证书的 sha256 填入即可(一定要是 sha256,不要用 sha1)

image.png

输入完成后在 Uni Push 下的 Uni Push,右侧选择配置管理,应用配置,就可以看到所需的一些东西。

image.png

注:ios 需要去重新创建一个推送证书,太繁琐了,后续会发出发布 iosAPP 的教程。

到了这一基本就可以不用靠 Java 来进行简单的推送了,前提是 APP 必须是自定义基座或者云打包的 APP。不能使用公共基座的 APP。

3、点击 Uni Push 右侧“创建推送”下的“通知消息”,平台选择安卓(IOS 需要使用透传消息),输入通知标题和通知内容,目标用户选择 CID 用户,输入 CID 后点击预览。

image.png

CID 获取方式为:在 uni-app 端,使用自定义调试基座获取手机 CID。

// #ifdef APP-PLUS
let clientId = plus.push.getClientInfo().clientId;
console.log(clientId);
// #endif

获取到 cid 后输入上方图片 CID 的位置,然后点击预览,在测试预览中使用刚刚拿到的 cid 进行测试,点击预览,先不用点击确定。

image.png

查看手机状态栏是否出现通知消息。

4、收到消息通知后在 uniapp 项目的 app.vue 中需要监听消息通知。

onLaunch: function() {
			// #ifdef APP-PLUS
			let _this = this;
			let clientInfo = plus.push.getClientInfo();
			plus.push.addEventListener("click", function(msg) {
				uni.getStorage({
					key: 'ttoken',
					success() {

						if (msg.hasOwnProperty("aps")) {
							if (msg.aps == null) {
								let payloadJSON = JSON.parse(msg.payload);
								if (payloadJSON.id != 0) {
									uni.navigateTo({
										url: '/subPackage/pages/houses/newDetails?id=' + payloadJSON.id +
											'&houseName=' + encodeURI(payloadJSON.houseName) +
											'&planId=' + payloadJSON.planId
									})
								} else {
									uni.switchTab({
										url: '/pages/floor/index'
									})
								}
							} else {
								if (msg.payload.id != 0) {
									uni.navigateTo({
										url: '/subPackage/pages/houses/newDetails?id=' + msg.payload.id +
											'&houseName=' + encodeURI(msg.payload.houseName) +
											'&planId=' + msg.payload.planId
									})
								}
							}
						} else {
							if (msg.payload.hasOwnProperty("id")) {
								if (msg.payload.id != 0) {
									uni.navigateTo({
										url: '/subPackage/pages/houses/newDetails?id=' + msg.payload.id +
											'&houseName=' + encodeURI(msg.payload.houseName) +
											'&planId=' + msg.payload.planId,
									})
								} else {
									uni.switchTab({
										url: '/pages/floor/index'
									})
								}
							}
						}
					},
					fail() {
						uni.showToast({
							title: '请先登录',
							icon: 'none',
							duration: 800
						})
					}
				})
			}, false);

			plus.push.addEventListener("receive", function(msg) {
				if (msg.hasOwnProperty("type") && msg.payload != null) {
					var options = {
						cover: false
					};
					plus.push.createMessage(msg.content, JSON.stringify(msg.payload), options);
				}
			}, false);

二、Java 端设置

1、pom.xml

添加

<repositories>
        <repository>
            <id>getui-nexus</id>
            <url>http://mvn.gt.getui.com/nexus/content/repositories/releases/</url>
        </repository>
    </repositories>
<dependency>
            <groupId>com.gexin.platform</groupId>
            <artifactId>gexin-rp-sdk-http</artifactId>
            <version>4.1.2.0</version>
        </dependency>

懒得解释直接贴代码

package com.fuyoust.base.utils.AppPush;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.fuyoust.base.model.TbAppClientInfo;
import com.fuyoust.base.model.TbOfShanheHostBox.TbPlan;
import com.gexin.rp.sdk.base.IPushResult;
import com.gexin.rp.sdk.base.impl.ListMessage;
import com.gexin.rp.sdk.base.impl.Target;
import com.gexin.rp.sdk.base.notify.Notify;
import com.gexin.rp.sdk.base.payload.APNPayload;
import com.gexin.rp.sdk.dto.GtReq;
import com.gexin.rp.sdk.http.IGtPush;
import com.gexin.rp.sdk.template.StartActivityTemplate;
import com.gexin.rp.sdk.template.TransmissionTemplate;
import com.gexin.rp.sdk.template.style.Style0;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author ZhangXiaoYu
 * @date 2021/4/1 10:47
 */
public class SensorPush {
    private final String appId = "";
    private final String appKey = "";
    private final String masterSecret = "";
    private final String url = "http://sdk.open.api.igexin.com/apiex.htm";
    private final String appName = "";
    private final String packageName = "";

    private List<TbAppClientInfo> clientInfos;
    private String message;
    private TbPlan tbPlan;
    private String deviceName;

    public SensorPush(List<TbAppClientInfo> clientInfos, String message, TbPlan tbPlan, String deviceName) {
        this.clientInfos = clientInfos;
        this.message = message;
        this.tbPlan = tbPlan;
        this.deviceName = deviceName;
    }

    /**
     * 善禾传感器触发推送手机状态栏通知
     *
     * @param:  clientInfos:发送人群
     *          message:推送的消息
     *          tbPlan:设备所在房间
     *          deviceName:设备名称
     *
     * @return  contentId:消息唯一ID
     *          pushType:推送的类型,toSingle为单推,toList为批量推,toApp为给全部用户推送
     *          expireTime:消息到期时间
     */
    public Map<String, Object> sensorMsgPushApp() {
        IGtPush push = new IGtPush(url, appKey, masterSecret);
        //1、设置消息主内容
        String content = deviceName + ":" + message + "! 点此查看 >";
        //2、获取模板
        TransmissionTemplate template = getTemplate(tbPlan, content, getAPNPayload(tbPlan, content));
        //3、创建消息
        ListMessage message = getMessage(template);
        //4、筛选发送人群
        List<Target> targets = getTargets(clientInfos);
        //5、发送
        String contentId = push.getContentId(message);
        IPushResult iPushResult = push.pushMessageToList(contentId, targets);

        String resultStr = iPushResult.getResponse().toString();
        Map<String, Object> resultMap = new HashMap<>();
        resultMap.put("contentId", contentId);
        resultMap.put("pushType", "toList");
        resultMap.put("expireTime", message.getOfflineExpireTime());
        resultMap.put("result",resultStr);
        return resultMap;

    }

    /**
     *
     * @param clientInfos 发送人群
     * @return  Target列表
     */
    public List<Target> getTargets(List<TbAppClientInfo> clientInfos){
        List<Target> targets = new ArrayList<>();
        for (TbAppClientInfo client : clientInfos) {
            Target target = new Target();
            target.setAppId(appId);
            target.setClientId(client.getClientId());
            targets.add(target);
        }
        return targets;
    }

    /**
     * 创建消息
     *
     * @param template 透传模板
     * @return  消息
     */
    public ListMessage getMessage(TransmissionTemplate template){
        ListMessage message = new ListMessage();
        message.setData(template);
        message.setOffline(true);//消息是否离线
        message.setOfflineExpireTime(3600000 * 24);//消息到期时间一天
        return message;
    }

    /**
     * 创建模板
     *
     * @param tbPlan    房间信息
     * @param content   消息主体内容
     * @param payload   ios离线通知
     * @return 透传模板
     */
    public TransmissionTemplate getTemplate(TbPlan tbPlan, String content, APNPayload payload) {
        TransmissionTemplate template = new TransmissionTemplate();
        template.setAppkey(appKey);
        template.setAppId(appId);
        template.setTransmissionType(2);

        Map<String, Object> payloadMap = new HashMap<>();
        Map<String, Object> contentMap = new HashMap<>();

        if (tbPlan == null) {
            payloadMap.put("id", "0");
        } else {
            payloadMap.put("id", tbPlan.getIdx());
            payloadMap.put("houseName", tbPlan.getName());
            payloadMap.put("planId", tbPlan.getId());
        }

        String title = "";
        contentMap.put("title", title);
        contentMap.put("content", content);
        contentMap.put("payload", payloadMap);
        JSONObject contentStr = new JSONObject(contentMap);

        template.setTransmissionContent(contentStr.toString());
        template.setAPNInfo(payload);

        Notify notify = new Notify();
        notify.setTitle("");
        notify.setContent(content);

        String payloadStr = new JSONObject(payloadMap).toString();

        notify.setPayload(payloadStr);
        notify.setType(GtReq.NotifyInfo.Type._intent);

        String intent = "intent:#Intent;action=android.intent.action.oppopush;launchFlags=0x14000000;component=" + packageName + "/io.dcloud.PandoraEntry;" +
                "S.UP-OL-SU=true;S.title=" + appName + ";S.content=" + message + ";S.payload=" + payloadStr + ";end";

        notify.setIntent(intent);
        template.set3rdNotifyInfo(notify);

        return template;
    }

    /**
     * 创建ios离线APN通知
     *
     * @param tbPlan    房间信息
     * @param content   消息主体内容
     * @return  APNPayload
     */
    public APNPayload getAPNPayload(TbPlan tbPlan, String content) {
        APNPayload payload = new APNPayload();
        if (tbPlan == null) {
            payload.addCustomMsg("id", "0");
        } else {
            payload.addCustomMsg("id", tbPlan.getIdx());
            payload.addCustomMsg("houseName", tbPlan.getName());
            payload.addCustomMsg("planId", tbPlan.getId());
        }
        payload.setContentAvailable(0);
        payload.setSound("default");
        payload.setAutoBadge("0");

        payload.setAlertMsg(getAlertMsg(content));

        return payload;
    }

    public APNPayload.DictionaryAlertMsg getAlertMsg(String content) {
        APNPayload.DictionaryAlertMsg alertMsg = new APNPayload.DictionaryAlertMsg();
        alertMsg.setTitle("");
        alertMsg.setBody(content);
        return alertMsg;
    }
}

注:

1、模板选择

安卓和 ios 统一使用一个模板“TransmissionTemplate”,上方的 appid、appKey、masterSecret,在 UniPush 中获取。

image.png

2、APNPayload 是 ios 专用离线推送。

3、Notify 是配置安卓离线推送的,

三、厂家配置

依此申请各个平台的开发者账号,这里使用华为和 oppo 来举例。注意,需要 APP 上线在华为应用市场中。

image.png

1、华为

打开华为推送后台

https://developer.huawei.com/consumer/cn/devunion/openPlatform/html/memberCenter.html#/serviceCards/

选择“开发服务下的 PUSH”,进去后选择自己的 APP 项目,点击左上角的项目设置。框选中的就是华为推送需要的必须项。

image.png

image.png

注意将 agconnect-services.json 文件从华为推送那里下载出来,appId、appSecret 拿到。SHA256 证书指纹就是上面用到的 SHA256 证书指纹。

2、OPPO

https://open.oppomobile.com/newservice/capability?pagename=push

点击申请接入,一样需要自己的 APP 已经上线,这里说一下 OPPO 这边,如果你在华为应用商城上线的话,即使没有在 oppo 中上线,也是可以在 oppo 应用市场搜索到你的 APP 的,然后可以在 OPPO 开发者平台中使用包名和证书啥的将 APP 认领在自己的开发者账户下。

认领流程:https://open.oppomobile.com/wiki/doc#id=10182

image.png

点击消息推送,然后点击自己的 APP,将所需要的的秘钥拿到。

image.png

这边说的需要申请开通消息推送权限,跟着 oppo 的文档走就行,审核速度很快。

  • uni-app
    8 引用 • 1 回帖
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    2920 引用 • 8120 回帖 • 671 关注
5 操作
zzzzchen 在 2021-04-28 17:40:10 更新了该帖
zzzzchen 在 2021-04-23 09:28:15 更新了该帖
zzzzchen 在 2021-04-23 09:18:21 更新了该帖
zzzzchen 在 2021-04-23 09:13:38 更新了该帖 zzzzchen 在 2021-04-23 09:08:58 更新了该帖

广告 我要投放

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...