我一直在开发实现Multipeer Connectivity(MC)框架的应用程序。当在两个单独的电话phoneBob和phoneJack上首次通过Xcode运行应用程序时,我在MCSession
“BobA”下初始化了phoneBob的displayName
,在MCSession
“JackA”下初始化了phoneJack的displayName
。 phoneBob的MC发现'JackA'很好,反之亦然,并且两者可以毫无问题地连接。
但是,删除应用程序并重新运行Xcode之后,我在MCSession
'BobB'下初始化了phoneBob的displayName
,并在MCSession
'JackB'下初始化了phoneJack的displayName
。除了phoneBob可以找到可以成功连接的外部对等方'JackB'之外,它还可以在日志中找到该外部对等方'JackA',即使'JackA'无法连接并与该应用程序的先前版本相关联。反之亦然,phoneJack不仅找到外国对等体“BobB”,而且还发现外国对等体“BobA”。不仅如此,phoneBob还将在应用程序的两种安装中找到ITSELF,“BobA”和“BobB”为外国同伴,而phoneJack会发现自己为“JackA”和“JackB”为外国同伴。
我将这些以前无法安装到“幽灵对等体”的应用程序的外部对等体称为“外部对等体”。我通过Xcode卸载并重新运行该应用程序的次数越多,MC发现的这些幽灵对等体的数量就越大。请注意,这些幽灵对等体仅在删除应用程序后出现在应用程序的第二次和后续运行中。重新启动电话并运行应用程序摆脱了这些幽灵同行,但是我对于MC为什么将ITSELF视为外国同行以及实际上不存在的同行完全感到困惑。是否有可能在第二次安装该应用程序时,MC从第一次安装该应用程序的虚假 session 中恢复了,由于某种原因该 session 从未终止?即使在删除应用程序之后,我们在第一次安装中初始化的 session 是否可能仍然存在?
最佳答案
我相信这些幽灵对等点的原因通常是因为多对等体是建立在Bonjour协议之上的,该协议通过让客户端向路由器注册自己来工作。当您强行关闭时,就没有取消注册的机会,这些客户端会闲逛直到超时。
解决此问题的方法是,首次创建MCPeerID时,应该序列化并保存它。然后,在随后的运行中,您将加载并重用相同的对等方,这将防止您将自己视为幻影,因为当您注册自己时,现在将替换旧的幻影版本。
旧的Apple开发人员论坛上有一个带有示例代码的线程,并由Apple工程师回复,确认这是推荐的方法:https://devforums.apple.com/message/1002886#1002886
关于ios - 为什么“Multipeer Connectivity Framework”会发现自己既是外国同行又是不存在的外国同行?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29220497/