uniapp使用signalR插件开发环境模拟器没问题,真机环境就会报错:“ReferenceError: require is not defined“解决方法

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)}`

效果图

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值