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
相关产品推荐
相关产品推荐

