iOS Multipeer连接问题...
我的应用程序使用MCNearbyServiceBrowser
和MCNearbyServiceAdvertiser
(但不能在给定设备上同时使用)。
我的MCNearbyServiceAdvertiser
总是使用相同的PeerId ...我将它存储在NSUserDefaults
中,根据2014年WWDC会议的建议。
当另一台设备正在浏览服务时,浏览设备会按预期获得foundPeer
浏览器委托回调。
但是,如果在浏览设备上我切换离开我的应用程序(例如,通过主页按钮点击),然后切换回我的应用程序,我再次拨打foundPeer
广告设备,但这次PeerId与众不同!
这看起来很奇怪,因为我的广告客户总是使用相同的PeerId。
任何想法为什么会这样?意外?
(我打算看看一个新发现的具有给定PeerId的广告设备是否已经在我对广告商的表格视图中,但上述问题有点混淆了该计划。)
谢谢。
-All
来自apple docs:“Multipeer Connectivity框架负责创建代表其他设备的对等对象。”
按下主页按钮并切换回应用程序后,框架创建了一个新的PeerID对象来表示广告设备。这是前一个对象,即使它代表相同的广告设备。所以你不能依赖PeerID对象相等。
为了正确识别对等体,我建议您创建一个NSUUID字符串并将其存档在磁盘上并重用它。初始化MCPeerID对象时,您应该传递的显示名称将是displayName + UUID。使用UI元素的显示名称和UUID来识别对等体。
我希望它有所帮助。
从同一显示名称创建两个时,您将无法获得相同的MCPeerID。当您发生名称冲突时,这可确保唯一性。将设备名称用作显示名称是很常见的。不是每个人都对他们个性化。
如果要识别并被先前连接的对等体识别,则必须保存并检索实际的MCPeerID。
要查看我的意思,请将以下代码粘贴到游乐场并运行它。
import MultipeerConnectivity
let hostName = "TestPlaygroundHostName"
let firstPeerID = MCPeerID(displayName: hostName)
let secondPeerID = MCPeerID(displayName: hostName)
firstPeerID.hashValue == secondPeerID.hashValue