为什么 Multipeer Connectivity Framework 发现自己既是外国同行又是不存在的外国同行?

Why is Multipeer Connectivity Framework finding itself as a foreign peer as well as nonexistent foreign peers?

我一直在开发实现多点连接 (MC) 框架的应用程序。当 运行 应用程序第一次通过 Xcode 在两个不同的 phones,phoneBob 和 phoneJack 上,我初始化一个 MCSession对于 phoneBob 在 displayName 'BobA' 下,MCSession 对于 phoneJack 在 displayName 'JackA' 下。 phoneBob 的 MC 发现 'JackA' 很好,反之亦然,两者可以毫无问题地连接。

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

我从以前安装的应用程序无法连接到'ghost peers'调用这些外国同行。我通过 Xcode 卸载并重新运行应用程序的次数越多,MC 发现的这些 ghost peers 的数量就越大。请注意,这些 ghost peer 仅在应用程序删除后第二次和后续运行时出现。重新启动 phone 和 运行 应用程序摆脱了这些幽灵同行,但我完全不明白为什么 MC 会发现 ITSELF 是外国同行以及实际上并不存在的同行。是否有可能在第二次安装该应用程序时,MC 正在从第一次安装该应用程序时开始一个 ghost 会话,该会话由于某种原因从未终止?我们在第一次安装时初始化的会话是否有可能在应用程序被删除后仍然存在?

Xamarin iOS 中发生了类似的问题 - 我每次都在我的 StartSession 方法中生成新会话。我现在将它存储为一个单例 - 这样我可以获得相同的会话并且我的设备不会发现自己是外国对等体。

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

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

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