iOS多点连通性显示同一设备名称两次

4
我正在使用iOS 7多点技术连接我的iPad和iPod touch。但是每当iPod touch或iPad进入睡眠模式时,它都会断开连接,这很正常,因为多点不在后台模式下工作,但是当我重新发现时,它在MCBrowserViewController列表中显示iPod的名称两次。尝试了每个示例代码并且每个代码都有同样的问题,有人知道如何修复此错误。
此外,MCBrowserViewController还存在一个奇怪的问题,如果我连接一个设备,其他设备接受它,即使它已经连接,MCBrowserViewController仍将显示为连接状态,并且“完成”按钮被禁用。我正在使用MCBrowserViewController而没有自定义代码,所以我猜这是苹果公司的问题。
还有人知道如何在应用程序从睡眠模式返回活动状态时直接连接到设备吗?
2个回答

2
发现你的同名出现两次是因为每次初始化会话时都会“init” peerID(withDisplayName)。根据苹果文档,这是一个已知的 bug,你不应该这样做。相反,将你的 peerID 保存在某个地方(例如 NSUserDefaults),当你初始化会话时,验证 peerID 是否存在,如果存在则加载它,否则创建/保存它。
最简单的代码如下: 在会话的 init 中,替换:
_peerID = [[MCPeerID alloc] initWithDisplayName:XXX];

by:

//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"]];
}

当然,你可以编写更复杂的代码,例如释放它并从动态变量中创建它,以便在想要更改名称等情况下使用。

这段代码运行良好,但是当你用 Swift 写的时候会出现问题。 - zaheer

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接