重新连接到断开连接的对等体

时间:2013-10-19 19:13:00

标签: ios iphone bluetooth multipeer-connectivity

我在我的应用程序中使用iOS 7 Multipeer框架,但我遇到设备断开连接的问题。如果我在两个设备中打开应用程序:设备A和设备B,这两个设备会自动相互连接。但是,几秒钟后设备A与设备B断开连接,即首先连接如下:

A ---> B
A <--- B

几秒钟后:

A ---> B
A      B

设备A维护它的连接,但设备B得到一个MCSessionStateNotConnected。

这意味着A可以向B发送数据但B无法回复。我试图通过检查设备是否已连接来解决这个问题,如果不是,请使用以下方法重新启动连接:

[browser invitePeer:peerID toSession:_session withContext:Nil timeout:10];

但是,使用MCSessionStateNotConnected调用didChangeState回调。

奇怪的是,如果我将应用程序A发送到后台,然后重新打开它,B重新连接到它并保持连接。

Multipeer API(和文档)看起来有点稀疏,所以我假设它会起作用。在这种情况下,我应该如何重新连接设备?

7 个答案:

答案 0 :(得分:22)

我遇到了同样的问题,似乎与我的应用浏览和广告同时有关,并且发送/接受了两个邀请。当我停止这样做并让一个同伴推迟到另一个接受邀请时,设备保持连接。

在我的浏览器委托中,我正在检查发现的对等方的displayName的哈希值,并且只有在我的对等方具有更高的哈希值时才发送邀请:

修改

正如@Masa所指出的,hash的{​​{1}}值在32位和64位设备上会有所不同,因此在{{1}上使用NSString方法会更安全}。

compare:

正如你所说,文档稀疏,所以谁知道Apple真正希望我们做什么,但我已尝试使用单个会话发送和接受邀请,并为接受/发送的每个邀请创建新会话,但这种特殊的做事方式给了我最大的成功。

答案 1 :(得分:5)

对于任何有兴趣的人,我创建了MCSessionP2P,这是一个演示应用程序,用于说明MCSession的ad-hoc网络功能。该应用程序都在本地网络上进行通告,并以编程方式连接到可用的对等方,建立对等网络。请向@ChrisH提示他的比较哈希值的技巧,以便邀请同行。

答案 2 :(得分:4)

我喜欢ChrisH的解决方案,它揭示了只有一个对等体应该连接到另一个对等的关键洞察力,而不是两者。相互连接尝试导致相互断开(虽然不是单边连接实际 ,反直觉,在状态和通信方面相互联系,因此工作正常)。

但是,我认为比一个对等邀请更好的方法是两个对等方邀请但只有一个对等方接受。我现在使用这种方法并且效果很好,因为两个同伴都有机会通过邀请的context参数将丰富的信息传递给另一个,而不是依赖{{1}中的可用信息。委托方法。

因此,我推荐这样的解决方案:

foundPeer

答案 3 :(得分:3)

当设备试图同时连接到彼此并且我不知道如何找到原因时,我遇到同样的问题,因为我们没有 MCSessionStateNotConnected 的任何错误。< / p>

我们可以使用一些狡猾的方法来解决这个问题: 应用程序启动时,将时间 [[NSDate date] timeIntervalSince1970] 放入txt记录(发现信息)。谁先开始 - 向其他人发送邀请。

但我认为这不是一种正确的方法(如果应用程序同时启动,不太可能...... :))。我们需要找出原因。

答案 4 :(得分:2)

这是我向Apple报告的一个错误的结果。我在回答另一个问题时已经解释了如何修复它:Why does my MCSession peer disconnect randomly?

我没有将这些问题标记为合并,因为虽然底层错误和解决方案是相同的,但这两个问题描述了不同的问题。

答案 5 :(得分:1)

保存对等体的哈希值。如果没有连接,使用计时器连续检查连接状态,尝试重新连接每个给定的时间段。

答案 6 :(得分:0)

根据苹果文件Choosing an inviter when using Multipeer Connectivity “在iOS 7中,同时发送邀请会导致两个邀请都失败,导致两个对等方无法相互通信。”

但是iOS 8修复了它。