Uniapp的消息推送Unipush(在线离线服务端)

Posted longmenyizu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Uniapp的消息推送Unipush(在线离线服务端)相关的知识,希望对你有一定的参考价值。

基本配置

  1. Hbuild下打开PUSH,Unipush功能,并详细阅读"使用指南”。
           
  2. 打包配置安卓包名,例如pts.sh
  3. 打包选择自有证书
    自有证书生成:D:\\Java\\jdk-15\\bin>keytool -genkey -alias ptskey -keyalg RSA -keysize 2048 -validity 36500 -keystore pts.keystore
    查看证书信息:keytool -list -v -keystore pts.keystore
  4. 选择云打包,app名例如为pts1。
  5. 在dev.dcloud.net.cn的应用信息,填写应用名称、Andriod签名和证书的SHA1(通过查看证书信息得到)
  6. 重新云打包。
  7. 手机安装app并获取cid,并用dcloud平台下的Unipush的通知消息功能测试。
  8. 手机运行app,可收到发送的测试消息。

离线厂商配置(华为)

  1. 在开发者中心里developer.huawei.com,新建项目,新建应用,填写app的应用名称、Andriod签名、并配置SHA256证书指纹(通过查看以上证书信息得到),并打开PUSH服务
  2. 配置应用后,将得到的.json文件、APP ID和Client Secret复制并填写到dcloud厂商配置的华为标签下。

  3. 保存dcloud配置,重新云打包,并手机安装。
  4. 在华为开发平台下测试厂商离线发送。手机停止运行app也能收到该推送。


    如需获取Token:手机运行app后,在dcloud里测试输入cid来获取Device Token。
  5. 在dcloud下测试离线消息发送。注意透传内容格式"title": "xxx","content": "xxx","payload": "xxx"和intent:intent:#Intent;launchFlags=0x04000000;action=android.intent.action.oppopush;component=pts.sh/io.dcloud.PandoraEntry;S.UP-OL-SU=true;S.title=xxx;S.content=xxx;S.payload=xxx;end
    需替换成自己Android包名的intent。在app离线状态下根据cid发送。

服务端代码(java)

  1. 下载个推下的getui-pushapi-java-client-v2-main的demo代码。
  2. 配置app参数。从dcloud下获取。

  3. 测试pushToSingleByCid()。在手机在线和离线状态下都能收到推送消息。

websocket 加layim实现在线聊天系统

实现流程:

  1.浏览器连接服务器时保存所有用户id以及对应的唯一session(session用户用户消息推送)。

    1.1:判断登录用户是否有离线消息(个人消息以及群消息),有则将离线消息进行推送给登录用户。

 

  2.前端layim监听消息发送,监听到通过websocket send方法将消息对象发送至服务器

  3.服务器接收到消息,通多消息对象获取接收者id,通过接收者id获取唯一session。

    3.1: 个人聊天可先判断用户是否在线,如果在线可直接通过接受者id进行消息推送,如果不在线就保存消息,待接收者上线时将此消息推送给接受者。

    3.2: 群消息通过群id获取所有群成员,循环如果在线则发送消息,不在线保存消息。待接收者上线时将消息推送给消息接收者。

  4.服务器通过session进行消息推送

java

package com.healta.controller;

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


import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import com.healta.chat.vo.User;
import com.jfinal.plugin.activerecord.Record;

//与js代码 new ReconnectingWebSocket("ws://IP地址:端口号/项目根路径/websocket配置的路径/" + 传的参数,可多个)对应
@ServerEndpoint("/websocket/{userId}")
public class WebSocketController {
	
	public static Map<Integer, User> userMap = new HashMap<>();//保存在线用户

	public static List<Integer> onLineUserIdList = new ArrayList<>();//保存在线的用户id
	public static User user;
	
	
	/**
	 * 浏览器连服务器时触发此方法
	 * @param session
	 * @param userId
	 */
	@OnOpen
	public void onOpen(Session session, @PathParam("userId") Integer userId) {
		/**
		 * 判断当前连接用户是否在线
		 */
		if(!checkOnLineState){//用户上线保存用户唯一session以及保存用户id,可通过用户id获取session
			user = new User();
			user.setUserSession(session);
			user.setUserOnLineType(true);
			userMap.put(userId, user);
			onLineUserIdList.add(userId);
		}
		
		//往下可根据不同的需求写相应的逻辑代码,比如离线消息就可以在用户连接服务器时去进行消息推送。或者用户上线提醒。
		
	}

	/**
	 * 连接关闭会触发此事件
	 * @param session
	 * @param userId
	 */
	@OnClose
	public void onClose(Session session, @PathParam("userId") Integer userId) {
          //用户下线需要将对于的在线用户进行调整。 onLineUserIdList.remove(userId); userMap.remove(userId); //用户下线可以给前端推送一个下线消息,前端接收把好友置灰 } /** * 服务器收到消息时触发此方法 * @param requestJson * @param session * @param userId */ @OnMessage public void onMessage(String requestJson, Session session, @PathParam("userId") Integer userId) { //此处通过requestJson消息对象可获取收信人id或者群id JSONObject messageObject = JSONObject.parseObject(requestJson); String jsonCollectUserId = messageObject.getString("collectUserId");//消息接收者可以是群id也可以是用户id String jsonContent = messageObject.getString("content");//消息内容 try { //通过收件人id获取连接session进行消息推送 userMap.get(收信人id或者群id).getUserSession().getBasicRemote().sendText("消息字符串,用layim的话需要和layim的消息接收类型一致。"); } catch (IOException e) { e.printStackTrace(); } } }

  

js

<script>
    layui.use(‘layim‘, function(layim){
        var copyLayim = layim;
        var websocket = null; 
        //判断当前浏览器是否支持WebSocket
        if (‘WebSocket‘ in window) {
            websocket = new ReconnectingWebSocket("ws://IP地址:端口号/项目根路径/websocket配置的路径/" + 传的参数,可多个);
        } else {
            alert(‘当前浏览器 Not support websocket‘)
        }
        //连接发生错误的回调方法
                websocket.onerror = function() {}; 
        //连接成功建立的回调方法
                websocket.onopen = function() {}
        //接收到消息的回调方法
        websocket.onmessage = function(event) {
            var data = event.data;//服务器返回的消息,前端页面可以根据不同的消息做不同的操作。
                    
        }
        //连接关闭的回调方法
        websocket.onclose = function() {
        //    setMessageInnerHTML("WebSocket连接关闭");
        }
        //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
        window.onbeforeunload = function() {
            closeWebSocket();
        } 
        //将消息显示在网页上
        function setMessageInnerHTML(innerHTML) {
        //    document.getElementById(‘message‘).innerHTML += innerHTML + ‘<br/>‘;
        }
        //关闭WebSocket连接
        function closeWebSocket() {
            websocket.close();
        } 
        //发送消息
        function send(msg) {
            websocket.send(msg);
        }
        
        layim.config({
            brief: false, //是否简约模式(如果true则不显示主面板)
            init: {
                url: ‘基本数据获取接口(格式layui官网有提供)‘
                ,data: {‘userId‘: userId}
            },
            members: {
                url: ‘返回群成员接口‘,
            }, 
            uploadImage: {
                  url: ‘图皮上传接口‘
            } ,
            chatLog:  ‘跳转至聊天界面url‘ ,
        });
        
        //layim消息发送监听器
        layim.on(‘sendMessage‘, function(res) {
            var mine = res.mine; //包含我发送的消息及我的信息
            var to = res.to; //对方的信息
            var msg = {
                    ‘collectUserId‘: to.id,
                    ‘content‘: mine.content
            }
            send(JSON.stringify(msg));
        });
        
        //监听修改签名
        layim.on(‘sign‘, function(value){
            此处可以ajax修改签名
        });     
    });
</script>                                       

 

以上是关于Uniapp的消息推送Unipush(在线离线服务端)的主要内容,如果未能解决你的问题,请参考以下文章

uniapp 消息推送

unipush 小米厂商推送不好用?

uniapp APP消息推送方案

想知道安卓、iOS消息推送用哪家比较好?

uniapp个推服务端推送,离线收不到,检测步骤,服务端PHP

Spring Boot 集成 个推 和 UniPush 两种消息推送方式