iOS多对等连接显示两次相同的设备名称

时间:2014-04-23 05:28:44

标签: ios objective-c cocoa-touch ios7 multipeer-connectivity

我正在使用iOS 7多对等技术连接我的iPad和iPod touch。但是,每当iPod touch或iPad进入睡眠状态时,它就会断开连接,这很好,因为多个对等设备不能在后台模式下工作,但当我再次发现时,它会在MCBrowserViewController列表中显示两次iPod的名称。尝试使用每个示例代码并且每个代码都有相同的问题,任何人都知道如何修复此错误。

如果我连接设备并且其他设备接受它,MCBrowserViewController也会出现一个奇怪的问题,即使它已连接MCBrowserViewController仍会显示连接且"Done"按钮被禁用。我正在使用MCBrowserViewController并且没有自定义代码,所以我想这是Apple的问题。

当应用程序从睡眠模式恢复到活动状态时,任何人都知道如何直接连接到设备吗?

2 个答案:

答案 0 :(得分:2)

两次发现相同的名称是因为每次初始化会话时都会“初始化”peerID(withDisplayName)。 从苹果的文档来看,这是一个已知的错误,你不应该这样做。相反,将peerID保存在某处(例如NSUserDefaults),并在初始化会话时验证peerID是否存在,加载它,否则创建/保存它。

最简单的代码如下所示: 在会话的init中,替换:

_peerID = [[MCPeerID alloc] initWithDisplayName:XXX];

由:

//If there is no PeerID save, create one and save it
if ([[NSUserDefaults standardUserDefaults] dataForKey:@"PeerID"] == nil)
{
    _peerID = [[MCPeerID alloc] initWithDisplayName:XXX];
    [[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:_peerID] forKey:@"PeerID"];
}
//Else, load it
else
{
    _peerID            = [NSKeyedUnarchiver unarchiveObjectWithData:[[NSUserDefaults standardUserDefaults] dataForKey:@"PeerID"]];
}

当然,您可以创建更复杂的代码,例如解除分配并从动态变量创建它,以防您想要更改名称等。

答案 1 :(得分:0)

我有同样的问题,这就是我解决它的方法, 在我的情况下,我使用UIViewController来处理连接,每次打开视图时我都会分配并初始化视图-viewDidLoad每次都会调用 - 然后在viewDidLoad中我初始化MCPeerID& MCSession,这就是问题所在,这就是为什么我们看到多对等连接显示两次,所以我通过初始化MCPeerID&来解决它。在AppDelegate或全局类中只有一次MCSession。