0

我正在使用GKSession, GKSessionDelegate在多个 iX(iPod、iPad、iPhone 等)设备之间实现对等蓝牙连接。我想显示range中当前可用/连接的设备的列表。

我目前依赖

- (void)session:(GKSession *)session peer:(NSString *)peerID didChangeState:(GKPeerConnectionState)state

去做这个。不幸的是,当设备超出范围时,似乎无法可靠地调用此方法。是否有“更好”的方法来确定设备是否在范围内?

一些代码:

- (void)session:(GKSession *)session peer:(NSString *)peerID didChangeState:(GKPeerConnectionState)state {

    NSString* connectionStateString=
    (state==GKPeerStateAvailable)?@"available":
    (state==GKPeerStateUnavailable)?@"unavailable":
    (state==GKPeerStateConnected)?@"connected":
    (state==GKPeerStateDisconnected)?@"disconnected":@"connecting";
    // Add the peer to the Dictionary
    NSArray* details=[NSArray arrayWithObjects:[session displayNameForPeer:peerID],connectionStateString,nil];
    [connectionPeers setObject:details forKey:peerID];

    if (state == GKPeerStateAvailable) {
        NSLog(@"Adding peerID:%@",peerID);
        [session connectToPeer:peerID withTimeout:60];//'connect' to everything, so data can be sent
    }
    else if (state == GKPeerStateUnavailable || state==GKPeerStateDisconnected) {
        [connectionPeers removeObjectForKey:peerID];
    }
    [self listPlayers];
}
4

1 回答 1

1

GKSession 建立在 Bonjour over Bluetooth 之上,我相信您的问题是 bonjour 服务仍显示为活动状态,因为当对等方与网络断开连接时,Bonjour 不会使服务广告无效。我认为 mDNS 记录仅在发生 mDNS 缓存超时(您无法调整)或广告对等方手动使服务无效时才会过期。

我认为 GKSession 不会轻易地通过广告在这里做你想做的事。但是,一旦超出蓝牙范围,已连接的对等方应断开连接。

于 2013-03-13T20:34:29.340 回答