已知问题及处理建议
更新时间: 2024/07/18 16:27:56
IM 含圈组版目前兼容小程序环境,但仍存在一些问题和限制。本文列举已知的问题和限制,并提供相应的处理建议。
- 不支持动态 LBS 地址
- xxx不在以下 request 合法域名中
- WebSocket 连接限制
- 不支持分片上传
- 微信小程序编译报错 Function(...) is not a function
- 微信小程序编译报错 Converting circular structure to JSON
- 微信小程序开启"将 JS 编译成 ES5"选项后,编译报错
- 集成 Web SDK 时 TypeError 报错
不支持本地数据库
限制描述
网易云信 IM 对小程序应用提供云端存储功能,不支持本地数据库,需要依赖漫游同步消息。
不支持动态 LBS 地址
限制描述
实例在小程序环境中运行,会受到域名白名单限制,无法使用 LBS 服务动态调配的长连接地址。
处理建议
初始化时,初始化参数lbsUrls
只传入一个固定的 LBS 地址。
示例如下:
import NIMSDK from 'nim-web-sdk-ng/dist/NIM_MINIAPP_SDK
const nim = new NIMSDK({
appkey: "YOUR_APPKEY",
token: "YOUR_TOKEN",
account: "YOUR_ACCOUNT",
lbsUrls: [
"https://lbs.netease.im/lbs/wxwebconf.jsp"
],
linkUrl: "wlnimsc0.netease.im"
})
uni-app 运行在小程序环境中也需进行上述初始化配置。
xxx 不在以下 request 合法域名中
问题描述
实例在微信或支付宝小程序环境中运行时,会受到域名白名单限制导致报错“xxx不在以下 request 合法域名中”。
处理建议
开始集成前,请确保已在微信公众平台中进入小程序后台 > 开发 > 开发设置 > 服务器域名,将以下域名填入指定的 “request 合法域名” / “socket 合法域名” / “uploadFile 合法域名” / “downloadFile 合法域名” 中。
微信小程序必须使用下面lbs
地址: https://lbs.netease.im/lbs/wxwebconf.jsp
。
更多相关说明,请参见配置服务器域名。
如果您需要在支付宝运行小程序,请在支付宝开发平台配置服务器域名。
配置分类 | 域名 | 说明 |
---|---|---|
request 合法域名 | https://lbs.netease.im | 请求 LBS 地址 |
https://wlnimsc0.netease.im | IM 必需 | |
https://wlnimsc0.netease.im:443 | IM 必需 | |
https://wlnimsc1.netease.im | 聊天室必需 | |
https://wlnimsc1.netease.im:443 | 聊天室必需 | |
https://statistic.live.126.net | 数据上报 | |
https://abt-online.netease.im | 用于 A/B Test | |
socket 合法域名 | wss://wlnimsc0.netease.im | IM 必需 |
wss://wlnimsc1.netease.im | 聊天室必需 | |
uploadFile 合法域名 | https://nos.netease.com https://fileup.chatnos.com https://oss.chatnos.com |
文件上传,如发送文件类消息 |
downloadFile合法域名 | https://nim-nosdn.netease.im https://nim.nosdn.127.net |
文件下载,如下载语音 |
WebSocket 连接限制
限制描述
微信小程序 1.7.0 及以上版本,最多可同时存在 5 条 WebSocket 连接,其中同域名的 WebSocket 连接最多 2 条。 如需在切换账号或聊天室时使用新实例,为保证不超过小程序 WebSocket 连接限制,请务必先调用 NIM / Chatroom 实例的 destroy 方法,并在 promise 完成后以后再去创建新的实例。
处理建议
云信 IM (NIM)和 Chatroom 为两个互为独立的实例,两者各自建立与云信服务端之间的长连接。因此如果您的应用同时使用这两个实例,请自行管理长连接数量。
您可分别通过NIMInterface.destroy
方法和ChatroomInterface.destroy
方法销毁 NIM 实例和聊天室实例,进而销毁其与云信服务端的长连接,保证长连接数量不超限。
不支持分片上传
限制描述
由于读取文件有着诸多限制,无法以一种兼容性比较好的方式根据 filePath 拿到本地文件信息。单线程在上传大文件不仅体验差,而且会因为手机终端性能而出现意想不到的问题。
处理建议
在使用选择文件 API (例如chooseImage
和choosevideo
)时自行判断文件大小,建议 100 MB 以上的文件不传。
微信小程序编译报错 Function(...) is not a function
报错信息
uni-app 编译成微信小程序时,微信小程序上报错 Function(...) is not a function
。
报错原因
微信基础库版本过低。
处理建议
将微信基础库切换为 v2.21.0 以上的版本。
微信小程序编译报错 Converting circular structure to JSON
报错信息
TypeError: Converting circular structure to JSON
--> starting at object with constructor 'i'
| property '_events' -> object with constructor 'n'
| property 'logined' -> object with constructor 'Array'
| index 0 -> object with constructor 'a'
--- property 'context' closes the circle
at JSON.stringify (<anonymous>)
at cloneWithData (mp.runtime.esm.js?66fd:5620)
报错原因
uni-app 编译微信小程序时注入的 mp.runtime.esm.js 里,对 vue 的 data 进行序列化使用的序列化方法是 return JSON.parse(JSON.stringify(ret))
,即在 vue 组件的 data 里挂载 nim 实例。然而实例继承自 EventEmitter3 对象,无法被这样序列化。
处理建议
建议将 nim 实例挂载在全局变量、vuex 的 prototype,或者参考如下示例代码在应用的globalData
中挂载:
const app = getApp()
if (app && app.globalData && app.globalData.nim) {
app.globalData.nim = new NIMSDK()
}
微信小程序开启"将 JS 编译成 ES5"选项后,编译报错
报错信息
WAServiceMainContext.js:2 TypeError: t is not a function
at oe.connect (NIM.js? [sm]:15)
at Li.connect (im.js? [sm]:17)
at Object.i.safeCallback (WASubContext.js?t=wechat&s=1642128708420&v=2.21.3:2)
at WASubContext.js?t=wechat&s=1642128708420&v=2.21.3:2
at br (WASubContext.js?t=wechat&s=1642128708420&v=2.21.3:2)
at WASubContext.js?t=wechat&s=1642128708420&v=2.21.3:2
at g (WASubContext.js?t=wechat&s=1642128708420&v=2.21.3:2)
at WASubContext.js?t=wechat&s=1642128708420&v=2.21.3:2
at WASubContext.js?t=wechat&s=1642128708420&v=2.21.3:2
at WAServiceMainContext.js:2(env: Windows,mp,1.05.2111300; lib: 2.21.3)
报错原因
微信小程序环境编译到 ES5 过程中产生未知错误。
处理建议
目前请勿勾选"将 JS 编译成 ES5"选项。
集成 Web SDK 时 TypeError 报错
报错信息
TypeError: Cannot read property 'localStorage' of undefined
报错原因
未集成与环境匹配的 SDK
处理建议
- 使用小程序开发,请集成 (NIM|CHATROOM|QCHAT)_MINIAPP_SDK.js
- 使用 uni-app 开发,请集成 (NIM|CHATROOM|QCHAT)_UNIAPP_SDK.js
- 使用浏览器或者 h5 开发,请集成 (NIM|CHATROOM|QCHAT)_BROWSER_SDK.js
支付宝小程序无法登录 IM
报错信息
控制台打印如下错误:
Promise.all(this.traceMsgCache[t].asyncPromiseArray).finally' is undefined)
报错原因
IM Elite SDK 使用了 Promise.finally 语法,该语法在 2.16.1 之前的支付宝基础库中不支持。
处理建议
在 app.js
的 onLaunch
方法中,扩展 Promise 原型链:
Promise.prototype.finally =function (callback) {
let P =this.constructor;
return this.then(
value => P.resolve(callback()).then(() => value),
reason => P.resolve(callback()).then(() => {throw reason })
);
};