MCNearbyServiceBrowserDelegate foundPeer在切换时报告给定广告商设备的不同PeerId,然后切换回浏览设备

时间:2014-06-30 08:01:11

标签: ios ios7 multipeer-connectivity

iOS Multipeer Connectivity问题......

我的应用使用MCNearbyServiceBrowserMCNearbyServiceAdvertiser(但不能同时使用给定设备)。

我的MCNearbyServiceAdvertiser始终使用相同的PeerId ...我将其存储在NSUserDefaults中,符合2014年WWDC会议的建议。

当其他设备正在浏览服务时,浏览设备会按预期获得foundPeer浏览器委托回调。

但是,如果在浏览设备上我切换离开我的应用程序(例如,通过主页按钮点击),然后切换回我的应用程序,我再次拨打foundPeer广告设备,但是这个PeerId的时间不同了!

这看起来很奇怪,因为我的广告客户总是使用相同的PeerId。

为什么会发生这种情况的任何想法?意想不到?

(我打算看看一个新发现的具有给定PeerId的广告设备是否已经在我的广告客户的桌面视图中,但上述问题有点混淆了该计划。)

谢谢。

-Allan

3 个答案:

答案 0 :(得分:0)

来自apple docs:“Multipeer Connectivity框架负责创建代表其他设备的对等对象。”

按下主页按钮并切换回应用程序后,框架创建了一个新的PeerID对象来表示广告设备。这是前一个对象,即使它代表相同的广告设备。所以你不能依赖PeerID对象相等。

答案 1 :(得分:0)

为了正确识别对等体,我建议您创建一个NSUUID字符串并将其存档在磁盘上并重复使用。初始化MCPeerID对象时,您应该传递的显示名称将是displayName + UUID。使用UI元素的显示名称和UUID来识别对等元素。

我希望它有所帮助。

答案 2 :(得分:0)

当您使用相同的显示名称创建两个时,您将不会获得相同的MCPeerID。这样可以确保名称冲突时的唯一性。通常使用设备名称作为显示名称。并非每个人都将其个性化。

如果要识别先前连接的对等方并被其识别,则必须保存并检索实际的MCPeerID。

要了解我的意思,请将以下代码粘贴到操场上并运行它。

import MultipeerConnectivity

let hostName = "TestPlaygroundHostName"

let firstPeerID = MCPeerID(displayName: hostName)
let secondPeerID = MCPeerID(displayName: hostName)

firstPeerID.hashValue == secondPeerID.hashValue