ios - 为什么多点连接框架发现自己是一个外国同行以及不存在的外国同行?

标签 ios xcode ios7 multipeer-connectivity

我一直在开发一个实现多点连接(MC)框架的应用程序。当第一次通过 Xcode 在两部独立的手机(phoneBob 和phoneJack)上运行应用程序时,我在 displayName“BobA”下为phoneBob 初始化一个MCSession,并在 displayName“JackA”下的phoneJack 的MCSession。 phoneBob 的 MC 发现“JackA”很好,反之亦然,两者可以毫无问题地连接。

但是,删除应用程序并通过 Xcode 重新运行后,我在 displayName 'BobB' 下为phoneBob 初始化一个 MCSession 和一个 MCSession displayName“JackB”下的phoneJack。除了phoneBob找到可以成功连接的外部对等点“JackB”之外,它还在日志中找到了外部对等点“JackA”,即使“JackA”无法连接到并且与应用程序的先前版本相关联。反之亦然,phoneJack 不仅找到外国对等点“BobB”,而且还找到外国对等点“BobA”。不仅如此,phoneBob 实际上会为应用程序的两个安装找到自己,“BobA”和“BobB”作为外国对等点,phoneJack 会发现自己,“JackA”和“JackB”作为外国对等点。

我将以前安装的应用程序中无法连接到“幽灵对等点”的这些外部对等点称为“幽灵对等点”。我通过 Xcode 卸载并重新运行应用程序的次数越多,MC 找到的这些幽灵对等点的数量就越多。请注意,这些幽灵对等点仅在删除应用程序后第二次及后续运行应用程序时出现。重新启动手机并运行应用程序可以摆脱这些幽灵对等点,但我完全困惑为什么 MC 会发现自己是外国对等点以及实际上不存在的对等点。是否有可能在第二次安装应用程序时,MC 从第一次安装应用程序时开始出现幽灵 session ,而该 session 由于某种原因从未终止?我们在第一次安装时初始化的 session 是否有可能在应用程序被删除后仍然存在?

最佳答案

我相信这些幽灵对等点的原因一般是因为多点是建立在 Bonjour 协议(protocol)之上的,该协议(protocol)的工作原理是让客户端向路由器注册自己。当您强行关闭时,就没有机会取消注册,并且这些客户端会一直徘徊直到超时。

解决这个问题的方法是,第一次创建 MCPeerID 时,您应该序列化并保存它。然后在后续运行中,您加载并重用同一个对等点,这将防止您将自己视为幽灵,因为当您注册自己时,您现在将替换旧的幽灵版本。

旧的 Apple 开发论坛上有一个帖子,其中包含示例代码和 Apple 工程师的回复,确认这是推荐的方法:https://devforums.apple.com/message/1002886#1002886

关于ios - 为什么多点连接框架发现自己是一个外国同行以及不存在的外国同行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29220497/

相关文章:

iOS mailto 带有换行符 (%0A) 的链接被转换为 <BR>

ios - 核心数据目录(树)结构

ios - Swift 中的运算符优先级

iphone - iOS7 - 在状态栏下查看 - edgesForExtendedLayout 不工作

ios - 使用 Swift 获取 SKScene 的宽度和高度

ios - 应用程序在 ios 的启动屏幕或启动屏幕中被击中

xcode - 如何制作带有图像的按钮并在 Sprite 套件中快速确定CGSize

iphone - Xcode plist 文件 - 注释消失,文件重新格式化

objective-c - UIMenuController sharedMenuController - uicollectionview 的自定义菜单项不显示在 ios 7 中

ios7 - 无法在 iOS 上将 CIImage 保存到文件而不发生内存泄漏