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

Swift 4:如何在Multipeer Connectivity中识别数据发送设备

嘿,我之前在做基于Multipeer Connectivity的iOS应用时刚好遇到过这个需求,给你分享几个靠谱的实现方法!

识别Multipeer Connectivity数据/图片来源设备的方案

1. 直接利用代理方法返回的MCPeerID

这是最直接的方式——Multipeer Connectivity的所有数据接收代理方法,都会把发送方的MCPeerID对象传递给你,通过它就能精准识别来源设备。

接收普通数据时:

func session(_ session: MCSession, didReceive data: Data, fromPeer peerID: MCPeerID) {
    // peerID就是发送方的设备标识,displayName是你初始化时设置的名称
    print("收到来自设备「\(peerID.displayName)」的数据")
    // 后续可以根据peerID做针对性的业务处理
}

接收图片/资源文件时:

如果你是通过资源传输的方式接收图片,对应的代理方法同样会返回发送方的MCPeerID:

// 接收流式资源(比如实时图片流)
func session(_ session: MCSession, didReceive stream: InputStream, withName streamName: String, fromPeer peerID: MCPeerID) {
    print("收到来自「\(peerID.displayName)」的流资源:\(streamName)")
    // 这里可以处理流数据转换成图片
}

// 接收完整资源文件(比如本地图片文件)
func session(_ session: MCSession, didFinishReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, at localURL: URL?, withError error: Error?) {
    guard let localURL = localURL, error == nil else {
        print("接收资源失败:\(error?.localizedDescription ?? "未知错误")")
        return
    }
    print("来自「\(peerID.displayName)」的图片资源已保存到:\(localURL.path)")
    // 读取localURL的内容即可获取图片
}

2. 自定义设备信息映射表

如果需要更丰富的设备标识(比如自定义的设备ID、玩家昵称),可以在设备建立连接时,互相发送自定义信息,并把MCPeerID和这些信息存在字典里做映射:

// 定义字典存储peerID与自定义设备信息的映射
var peerDeviceMap: [MCPeerID: [String: Any]] = [:]

// 当有新设备连接时,主动发送自身的自定义信息
func session(_ session: MCSession, peer peerID: MCPeerID, didChange state: MCSessionState) {
    if state == .connected {
        let myDeviceInfo = [
            "nickname": "玩家小A",
            "customDeviceID": UIDevice.current.identifierForVendor?.uuidString ?? "未知ID"
        ]
        do {
            let infoData = try JSONSerialization.data(withJSONObject: myDeviceInfo)
            try session.send(infoData, toPeers: [peerID], with: .reliable)
        } catch {
            print("发送设备信息失败:\(error.localizedDescription)")
        }
    } else if state == .disconnected {
        // 设备断开连接时,移除对应的映射信息
        peerDeviceMap.removeValue(forKey: peerID)
    }
}

// 在接收数据时,先判断是否是设备信息,再处理业务数据
func session(_ session: MCSession, didReceive data: Data, fromPeer peerID: MCPeerID) {
    if let deviceInfo = try? JSONSerialization.jsonObject(with: data) as? [String: Any],
       deviceInfo["nickname"] != nil {
        // 存储设备信息映射
        peerDeviceMap[peerID] = deviceInfo
    } else {
        // 处理普通业务数据,用自定义昵称显示来源
        let senderName = peerDeviceMap[peerID]?["nickname"] ?? peerID.displayName
        print("收到来自「\(senderName)」的业务数据")
    }
}

3. 合理设置MCPeerID的displayName

初始化MCPeerID时,你可以直接用设备名称、玩家昵称等易识别的字符串作为displayName,这样在接收数据时,通过peerID.displayName就能快速知道来源:

// 初始化自己的PeerID,用玩家昵称作为标识
let myPeerID = MCPeerID(displayName: "玩家小B")
let mcSession = MCSession(peer: myPeerID, securityIdentity: nil, encryptionPreference: .required)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:55:27