You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Multipeer Connectivity 框架数据收发异常问题求助

问题根因

崩溃由两处逻辑缺陷共同触发:

  • MCSession连接状态回调是双向触发的:当新用户A接入房主B的会话时,不仅A端会收到B的.connected状态回调,B端也会同步收到A的.connected回调。你当前的逻辑是只要收到任意peer的连接成功事件,就无条件向对方发送大厅信息请求,这就导致房主B在感知到A连入时,也会反过来向A发起大厅信息请求。你误以为收到了自己发出的请求,实际是收到了房主反向发的请求——MultipeerConnectivity框架默认不会将本地发送的消息投递给自身。
  • 收到lobbyInfoRequest类型消息时,没有校验当前用户身份,直接调用sendLobbyInfo(to:)。刚加入的普通用户A从未设置过lobby属性,触发fatalError直接崩溃。
修复步骤

1. 连接事件分支增加角色判断

仅非房主用户需要在连接建立后请求大厅信息,房主本身持有全量成员数据,不需要发起请求,还可以在新用户连入时主动推送成员列表,减少一次请求交互。修改session(_:peer:didChange:)中的.connected分支代码:

case .connected:
    print("From \(peerID.displayName): Connected to \(peer.displayName)")
    // 房主侧:新用户连入时主动推送全量大厅成员信息
    if role == .host {
        sendLobbyInfo(to: peer)
        break
    }
    // 非房主侧:连接建立后向已在线peer请求大厅信息
    requestLobbyInfo(from: peer)

2. 大厅信息请求分支增加身份校验

仅房主有权限响应大厅信息请求,普通用户收到这类请求直接忽略即可,避免无意义的逻辑执行。修改session(_:didReceive:fromPeer:)中的lobbyInfoRequest分支:

case .lobbyInfoRequest:
    // 非房主不处理大厅信息请求
    guard role == .host else {
        print("Ignore lobby info request from \(peer.displayName): current user is not host")
        break
    }
    sendLobbyInfo(to: peer)
可选优化
  • 移除sendLobbyInfo中的fatalError,改为优雅容错:哪怕是房主,极端场景下也可能因为页面销毁导致lobby弱引用变为nil,直接崩溃会影响用户体验,打错误日志后返回即可。
guard let lobby = self.lobby else {
    print("Send lobby info failed: lobby reference is released")
    return
}
  • 后续如果支持大厅成员动态增减(中途加入、退出、角色变更),可以在房主侧成员列表变化时主动给所有已连接peer推送最新列表,保证多端UI实时同步,不需要等用户主动请求。

内容的提问来源于stack exchange,提问作者natSegOS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 20:09:17