0

GKSession, GKSessionDelegate多数のiX(iPod、iPad、iPhoneなど)デバイス間のピアツーピアBluetooth接続を実装するために使用しています。現在利用可能な/接続されている範囲内のデバイスのリストを表示したい。

現在頼りにしている

- (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 は Bluetooth 経由の Bonjour で構築されています。問題は、ピアがネットワークから切断されたときに Bonjour がサービス アドバタイズメントを無効にしないため、bonjour サービスがまだアクティブとして表示されていることだと思います。mDNS レコードが期限切れになるのは、mDNS キャッシュのタイムアウトが発生したとき (微調整できるものではない) か、広告ピアが手動でサービスを無効にしたときだけだと思います。

私は、GKSession が広告によってここであなたが望むことを簡単に実行できるとは思いません。ただし、接続されているピアは、Bluetooth の範囲外になると切断する必要があります。

于 2013-03-13T20:34:29.340 に答える