浏览 SDKs · uni-app / uni-app x
SDKsuni-app商业版

发送自定义信令

商业版向房间发送业务自定义信令,并安全解析接收事件。

复制

signalingSendCustomSignaling() 用于向指定通话房间发送轻量级业务协商数据,例如举手、切换布局提示或业务侧状态同步。它不是聊天消息接口,也不能替代媒体引擎的数据通道。

发送信令

customInfo 是字符串。需要传递结构化数据时,先定义稳定的数据格式并序列化为 JSON。

import {
  off,
  onReceiveCustomSignal,
  onReceiveCustomSignaling,
  signalingSendCustomSignaling,
} from '@/uni_modules/unix-openim-sdk'

const signal = {
  version: 1,
  eventID: createBusinessEventID(),
  type: 'hand-raised',
  userID: currentUserID,
  sentAt: Date.now(),
}

await signalingSendCustomSignaling({
  roomID,
  customInfo: JSON.stringify(signal),
})

Promise 成功表示 OpenIMServer 已接受本次发送,不等于其他参与者已经处理该数据。customInfo 应保持精简,并包含协议版本和业务幂等 ID。大文件、聊天记录、长期状态和敏感凭据不应放入其中。

接收信令

onReceiveCustomSignalonReceiveCustomSignaling 是兼容不同 Core/商业服务版本的 raw JSON 事件。实际部署只订阅其中真实产生的一种;若为了兼容同时订阅,必须按 roomID:eventID 去重。

function handleValidatedSignal(payload : string) {
  try {
    const event = JSON.parseObject<UTSJSONObject>(payload)
    if (event == null) return

    const eventRoomID = event.getString('roomID')
    const customInfo = event.getString('customInfo')
    if (eventRoomID != activeRoomID || customInfo == null) return

    const signal = JSON.parseObject<UTSJSONObject>(customInfo)
    if (signal == null) return
    applyValidatedCallSignal(eventRoomID, signal)
  } catch (_) {
    console.warn('无法解析通话自定义信令')
  }
}

const signalSubscription = onReceiveCustomSignal(handleValidatedSignal)
const signalingSubscription = onReceiveCustomSignaling(handleValidatedSignal)

function removeCustomSignalListeners() {
  off(signalSubscription)
  off(signalingSubscription)
}

解析函数应检查 JSON 结构、协议版本、eventIDtype 和业务字段,再返回已验证的应用内对象。本页是两个兼容事件的完整监听示例归属页。离开通话页、退出登录或切换账号时调用 removeCustomSignalListeners()

自定义信令不承担权限认证。不要信任客户端信令来授予主持人、付费或隐私权限;需要权威校验的状态应由可信后端保存和判断。连接恢复后,通过房间查询或业务后端校准长期状态,不要把自定义信令当作可重放的权威记录。