确定GKSession蓝牙设备何时超出范围

时间:2013-02-12 06:39:36

标签: iphone bluetooth p2p gksession

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

我目前正依赖

- (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];
}

1 个答案:

答案 0 :(得分:1)

GKSession是基于Bonjour通过蓝牙构建的,我相信你的问题是bonjour服务仍然显示为活跃,因为当对等方与网络断开连接时,Bonjour不会使服务通告无效。我认为mDNS记录只在mDNS缓存超时发生时(不是你可以调整的东西)或广告对等体手动使服务无效时到期。

我认为GKSession不会通过广告轻松做到你想要的。但是,一旦连接的对等设备超出蓝牙范围,它们就会断开连接。