unapp中无法直接使用signalR了,使用也只能在模拟器上使用,一跑真机就直接"ReferenceError: require is not defined"。只能使用原生sk方法去进行链接通信。网上也看到了使用Rendejs的我试过不太行方法非常局限
直接上代码这些都是在vueX中的actions中的方法,算是核心代码
1、非常重要的事情,使用原生sk通信链接需要加上以下代码才能正常通信!!!
uni.sendSocketMessage({ data: `{"protocol":"json", "version":1}${String.fromCharCode( 0x1e)}`,});
// 链接signalR
getChat(context, val) {
const socketTask = uni.connectSocket({
url: `${getApp().globalData.netServiceUrl}/hubs/chathub`,
method: "GET",
header: val || context.getters.GetToken,
success: (res) => {
// 监听链接打开事件
uni.onSocketOpen((res) => {
uni.sendSocketMessage({
data: `{"protocol":"json", "version":1}${String.fromCharCode(
0x1e
)}`,
});
console.log("已连接");
// 通知链接已打开
context.commit("ONLINE", true);
});
// 接收服务端发来的消息
uni.onSocketMessage(function (res) {
var msg = res.data.replace(String.fromCharCode(0x1e), ""); //替换消息结束符
let msgData = JSON.parse(msg);
//接收指定消息(这里为服务端得ReceiveMessage得消息,msgData.type === 1 为固定值表示调用客户端的一个方法)
if (msgData.type === 1 && msgData.target == "ReceiveMessage") {
context.commit("GET_CHAT", {
isNewMessage: true,
recipientMsg: msgData.arguments,
});
}
});
},
});
// 监听错误处理
uni.onSocketError(function (res) {
console.log("链接失败正在重新链接");
if (context.state.numS <= 0) return;
let data = { accessToken: getrefreshToken() || "" };
uni.request({
url: `${getApp().globalData.netServiceUrl}/api/Login/GetRefreshToken`,
data: data,
success: function (res) {
if (res.data) {
setToken(res.data.accessToken); //需要传入accessToken字符串不能是对象
setrefreshToken(res.data.refreshToken); //需要传入refreshToken字符串不能是对象
}
},
fail() {
common.toast("链接失败请尝试重启APP");
},
});
//重新调用自己链接
context.dispatch("getChat");
// 重连次数减一次
context.commit("ERRORSocket");
});
},
2、发送消息时也需要做转码,后端接收参数放ags中数组形式存储,target为与后端约定的通信方法就是后端的接口方法,type是数据类型这里可以不用管这是我这边做消息内容区分的
发送也是需要加上以下代码才能正常通信!!!东西放在data中
data: `${JSON.stringify({ arguments: [xxx,xxx],targeXXXX",})}${String.fromCharCode(0x1e)}`
效果图