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

时间:2015-03-23 21:12:02

标签: ios xcode ios7 multipeer-connectivity

我一直致力于实现Multipeer Connectivity(MC)框架的应用程序。在两个独立的手机,phoneBob和phoneJack上第一次通过Xcode运行应用时,我在MCSession' BobA'下初始化了displayName的phoneBob。以及MCSession' JackA'下的displayName用于phoneJack。 MC for phoneBob发现了JackA'很好,反之亦然,两者可以毫无问题地连接起来。

但是,在删除应用并通过Xcode重新运行后,我会在MCSession' BobB'下初始化displayName以获取phoneBob。以及MCSession' JackB'下的displayName用于phoneJack。除了phoneBob发现外国同行' JackB'谁可以成功连接,它也找到了外国同行的JackA'在日志中,即使是JackA'无法连接到以前版本的应用程序并与之关联。反过来也是如此,其中phoneJack不仅找到了外国同行的BobB'而且外国同行的BobA'同样。不仅如此,而且phoneBob实际上会为应用程序的两个安装找到ITSELF,BobA'和BobB'作为外国同行,而phoneJack会发现自己,JackA'和' JackB'作为外国同行。

我从以前安装的应用程序中调用这些外国同行,这些应用程序无法连接到“幽灵同伴”。我通过Xcode卸载和重新运行应用程序的次数越多,MC发现的这些重对等点的数量就越大。请注意,这些ghost对象仅在删除应用程序后第二次和后续运行应用程序时出现。重新启动手机并运行应用程序摆脱了这些幽灵同伴,但我完全混淆了为什么MC会将ITSELF作为外国同行以及实际不存在的同伴。是否有可能在第二次安装应用程序时,MC正在从应用程序的第一次安装中获取一个ghost会话,由于某种原因从未终止?即使在删除应用程序之后,我们在第一次安装中初始化的会话是否仍然可以保留?

2 个答案:

答案 0 :(得分:3)

我认为这些幽灵对等体的原因通常是因为多重拼接建立在Bonjour协议之上,其通过让客户端向路由器注册自己来工作。当你强行关机时,没有机会取消注册,这些客户在他们超时之前就会闲逛。

对此的修复是,第一次创建MCPeerID时,应该序列化并保存它。然后在后续运行中加载并重用同一个对等体,这将阻止您将自己视为幽灵,因为当您自己注册时,您现在将替换旧的鬼版本。

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

答案 1 :(得分:1)

Xamarin iOS发生了类似的问题 - 我每次都在StartSession方法中生成新会话。我现在将它存储为单身 - 这样我得到相同的会话,我的设备不会发现自己是外国同行。