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

Ben*_*ley 30 iphone bluetooth ios multipeer-connectivity

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

A ---> B
A <--- B
Run Code Online (Sandbox Code Playgroud)

几秒钟后:

A ---> B
A      B
Run Code Online (Sandbox Code Playgroud)

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

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

[browser invitePeer:peerID toSession:_session withContext:Nil timeout:10];
Run Code Online (Sandbox Code Playgroud)

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

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

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

Chr*_*isH 22

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

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

编辑

正如@Masa所指出的,在32位和64位设备上,a的hashNSString会有所不同,因此使用该compare:方法更安全displayName.

- (void)browser:(MCNearbyServiceBrowser *)browser foundPeer:(MCPeerID *)peerID withDiscoveryInfo:(NSDictionary *)info {

    NSLog(@"Browser found peer ID %@",peerID.displayName);       

    //displayName is created with [[NSUUID UUID] UUIDString]

    BOOL shouldInvite = ([_myPeerID.displayName compare:peerID.displayName]==NSOrderedDescending);

    if (shouldInvite){
        [browser invitePeer:peerID toSession:_session withContext:nil timeout:1.0]; 
    }
    else {
        NSLog(@"Not inviting");
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 非常有帮助,谢谢.请注意,NSString上的哈希返回NSUInteger.因此,在32位和64位系统上的结果是不同的.所以我只是遇到没有人发送邀请的情况.我只是在displayNames上进行字符串比较而不是使用hash来解决它.(除此之外,还要注意NSString上的哈希值应谨慎使用:http://www.abakia.de/blog/2012/12/05/nsstring-hash-is-bad/) (4认同)

Mar*_*rco 5

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


Max*_*lov 3

当设备尝试同时相互连接时,我遇到同样的问题,并且我不知道如何找到原因,因为MCSessionStateNotConnected没有任何错误。

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

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