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的hash值NSString会有所不同,因此使用该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真正希望我们做什么,但我已尝试使用单个会话发送和接受邀请,并为接受/发送的每个邀请创建新会话,但这做事的特殊方式给了我最大的成功.
对于任何有兴趣的人,我创建了MCSessionP2P,这是一个演示应用程序,用于说明其特殊的网络功能MCSession.该应用程序都在本地网络上进行通告,并以编程方式连接到可用的对等方,建立对等网络.帽子向@ChrisH提示他比较哈希值以便邀请同伴的技巧.
当设备尝试同时相互连接时,我遇到同样的问题,并且我不知道如何找到原因,因为MCSessionStateNotConnected没有任何错误。
我们可以使用一些巧妙的方法来解决这个问题:将时间[[NSDate date] timeIntervalSince1970]放入txt记录(发现信息)中我们可以使用一些巧妙的方法来解决这个问题:在应用程序启动时谁先开始 - 向其他人发送邀请。
但我认为这不是正确的方法(如果应用程序同时启动,不太可能......:))。我们需要找出原因。
| 归档时间: |
|
| 查看次数: |
9959 次 |
| 最近记录: |