d***@qq.com
d***@qq.com
  • 发布:2024-10-31 23:33
  • 更新:2024-11-18 11:01
  • 阅读:310

【报Bug】鸿蒙系统里的WebSocket.send不支持ArrayBuffer?

分类:uni-app

产品分类: uniapp/App

PC开发环境操作系统: Mac

PC开发环境操作系统版本号: 14.7 (23H124)

HBuilderX类型: 正式

HBuilderX版本号: 4.32

手机系统: HarmonyOS NEXT

手机系统版本号: HarmonyOS NEXT Developer Beta2

手机厂商: 华为

手机机型: HarmonyOS NEXT Release

页面类型: vue

vue版本: vue3

打包方式: 离线

项目创建方式: HBuilderX

操作步骤:

WebSocket.send({data:ArrayBuffer})

预期结果:

发送成功

实际结果:

{"name":"UniError","errSubject":"","errCode":0,"errMsg":"Parameter error"}

bug描述:

鸿蒙系统里的WebSocket.send({data:xx}),只能发string, 不支持ArrayBuffer?

2024-10-31 23:33 负责人:DCloud_uniCloud_WYQ 分享
已邀请:

最佳回复

DCloud

DCloud

HBuilderX 4.33.2024111702-alpha 已修复。

d***@qq.com

d***@qq.com (作者)

这个问题应该是存在的,请官方核实,下面是一个进行修正的例子:

在鸿蒙里,直接传ArrayBuffer,会导致参数错误,这里直接传数组

//#ifdef APP-HARMONY  
    let buffer = Array.from(allArr)  
    //#endif  

    let toSend = {  
        data: buffer,  
        fail: function (e) {  
            console.log("send fail", JSON.stringify(e))  
        }  
    }  
    ws.send(toSend);

在uni.api.ets中,对SocketTask1.send里重新构造ArrayBuffer, 这种方式可以成功发送ArrayBuffer

send(options: SendSocketMessageOptions) {  
            let data : string | ArrayBuffer  
            if(typeof(options.data)==='string'){  
                data = options.data as string  
            }else{  
                data = new Uint8Array(options.data as ArrayBufferLike).buffer;  
            }  
            this._ws.send(data).then((success: boolean)=>{  
                if (success) {  
                    tryExec(options.success, {} as GeneralCallbackResult);  
                } else {  
                    tryExec(options.fail, new UniError('send message failed'));  
                }  
            }, (err: Error)=>{  
                tryExec(options.fail, new UniError(err.message));  
            });  
        }
DCloud_uniCloud_WYQ

DCloud_uniCloud_WYQ

感谢反馈,已确认bug

  • d***@qq.com (作者)

    谢谢回复,修复的话预计是什么时候呢?

    2024-11-12 19:23

  • DCloud_uniCloud_WYQ

    回复 d***@qq.com: 待定,下个alpha或者下下个alpha,鸿蒙的ohpm需要审核有点耽误发版进度

    2024-11-12 20:06

  • d***@qq.com (作者)

    回复 DCloud_uniCloud_WYQ: 了解了,耐心等待,谢谢。

    2024-11-12 21:25

  • DCloud_uniCloud_WYQ

    回复 d***@qq.com: 有可复现问题的项目吗?有的话附件发一下

    2024-11-15 15:45

  • d***@qq.com (作者)

    回复 DCloud_uniCloud_WYQ: 抱歉,项目的代码比较多。打日志跟踪了一下,应该是在执行uni.connectSocket的时候会崩溃。

    2024-11-15 18:02

  • DCloud_uniCloud_WYQ

    回复 d***@qq.com: 我这用我的测试项目试了下connectSocket不会崩溃,还是尽可能提供一个demo吧

    2024-11-15 20:59

  • d***@qq.com (作者)

    回复 DCloud_uniCloud_WYQ: connectSocket大概的逻辑如下

    let wssURL = "wss://xxx?param1=v1&param2=v2"

    let protocols = []

    let token = "xxxxx"

    ws = uni.connectSocket({

    url: wssURL,

    header: {

    'content-type': 'application/json',

    'X-Token': token,

    },

    protocols: protocols,

    method: 'GET',

    tcpNoDelay: true,

    fail: function (e) {

    console.log(e)

    uni.showToast({

    title: '创建连接失败:' + e.errMsg,

    duration: 2000,

    icon: 'none',

    })

    },

    })

    2024-11-15 22:23

  • d***@qq.com (作者)

    回复 DCloud_uniCloud_WYQ: 如果在connectSocket传入了header参数,即使是空的会崩溃

    2024-11-15 22:45

  • DCloud_uniCloud_WYQ

    回复 d***@qq.com: 了解了,runtime版本2.3.15会修复这个问题,下个版本的alpha带的也是这个版本。目前这个版本还在ohpm审核

    2024-11-16 12:01

  • DCloud_uniCloud_WYQ

    回复 d***@qq.com: 2.3.15还遗留了一个问题,传header控制台会打印一行警告,这个不影响实际效果,下下个alpha再去除

    2024-11-16 12:02

  • d***@qq.com (作者)

    回复 DCloud_uniCloud_WYQ: 好的,谢谢,有了新版本我们再测试

    2024-11-16 18:55

要回复问题请先登录注册