代码之家  ›  专栏  ›  技术社区  ›  Roman Scher

为什么Multipeer Connectivity Framework发现自己是一个外国同行,而不是不存在的外国同行?

  •  2
  • Roman Scher  · 技术社区  · 9 年前

    我一直在开发一款实现多人连接(MC)框架的应用程序。当第一次通过Xcode在两个不同的手机上运行应用程序时,我初始化了一个 MCSession 电话Bob在 displayName “BobA”和一个 MC会话 电话插孔位于 显示名称 “JackA”。MC for phoneBob发现“JackA”很好,反之亦然,两者可以毫无问题地连接。

    然而,在删除应用程序并通过Xcode重新运行后,我初始化了 MC会话 电话Bob在 显示名称 “BobB”和一个 MC会话 电话插孔位于 显示名称 “JackB”。除了phoneBob找到可以成功连接到的外国对等方“JackB”之外,它还在日志中找到外国对等方的“JackA”,即使“JackA“无法连接到并与应用程序的早期版本相关联。反之亦然,phoneJack不仅找到了外国同行“BobB”,还找到了外国同伴“BobA”。不仅如此,phoneBob实际上会为应用程序的两个安装找到ITSELF,“BobA”和“BobB”是外国同行,而phoneJack会发现自己,“JackA”和”JackB“是外国同行。

    我把以前安装的无法连接到“幽灵同行”的应用程序中的这些外国同行称为“幽灵同行(ghost peers)”。我通过Xcode卸载并重新运行应用程序的次数越多,MC发现的这些幽灵对等点的数量就越多。请注意,这些幽灵对等体仅在删除应用程序后第二次和后续运行应用程序时出现。重新启动手机并运行应用程序可以消除这些幽灵同行,但我完全不明白为什么MC会将ITSELF视为外国同行以及实际上不存在的同行。是否有可能在第二次安装应用程序时,MC正在从第一次安装的应用程序中恢复一个幽灵会话,但由于某种原因,该会话从未终止?我们在第一次安装时初始化的会话是否可能在应用程序被删除后仍然存在?

    2 回复  |  直到 9 年前
        1
  •  3
  •   Columbo    9 年前

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

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

    在旧的苹果开发论坛上有一条线索,上面有示例代码和一位苹果工程师的回复,确认这是推荐的方法: https://devforums.apple.com/message/1002886#1002886

        2
  •  1
  •   Milen    9 年前

    在中也有类似的问题 Xamarin iOS 发生了什么-我在 StartSession 方法。我现在将它存储为一个单独的会话,这样我就可以获得相同的会话,而且我的设备不会发现自己是一个外来的对等设备。