ピアツーピア接続を可能にする iPhone アプリに取り組んでいます。私の理解では、GKPeerPicker と GKSession のどちらを使用するかを選択できます。カスタム インターフェイスを表示したいので、PeerPicker を使用するという考えは気に入らないので、GKSession を使用することにしました。おまけに、Wi-Fi でも動作しますが、Peer Picker は動作しません。
問題は、ユーザーが Bluetooth と Wi-Fi の両方をオフにしているとどうなるかということです。ピア ピッカーでは、アプリを終了せずに Bluetooth をオンにするプロンプトが表示されます。GKSessionにはそれがありません...しかし、ちょっと待ってください。Bluetoothがオンになっているかどうかをプログラムで確認することさえできないようです!
Carpe Cocoa は問題ないと主張しており、デリゲートのsession:didFailWithError:
方法を使用するだけです。しかし、コメントで説明されているように...それはもう機能していないようです! そして私の経験上、私は同意します。
Bluetoothがオンになっているかどうかをプログラムで確認する他の方法はありますか? これは、到達可能性を活用する必要があるものですか? それとも、Apple がまだ修正していない単なるバグなのでしょうか?
より具体的には、次のようにセッションを作成しています。
GKSession *aSession = [[GKSession alloc] initWithSessionID:nil
displayName:user.displayName
sessionMode:GKSessionModePeer];
self.gkSession = aSession;
[aSession release];
self.gkSession.delegate = self;
self.gkSession.available = YES;
[self.gkSession setDataReceiveHandler:self withContext:NULL];
このクラスは GKSessionDelegate を実装しています。ブルートゥースをオンにするとデリゲート メソッドが問題なく呼び出されるため、このクラスが機能していることはわかっています。私はそれらを次のように実装しました:
#pragma mark -
#pragma mark GKSessionDelegate methods
- (void)session:(GKSession *)session peer:(NSString *)peerID didChangeState:(GKPeerConnectionState)state {
if (GKPeerStateAvailable == state) {
[session connectToPeer:peerID withTimeout:10];
} else if (GKPeerStateConnected == state) {
// gets user
NSError *error = nil;
[session sendData:user.connectionData
toPeers:[NSArray arrayWithObjects:peerID,nil]
withDataMode:GKSendDataReliable error:&error];
if (error)
NSLog(@"%@",error);
}
}
- (void)session:(GKSession *)session didReceiveConnectionRequestFromPeer:(NSString *)peerID {
NSError *error = nil;
[session acceptConnectionFromPeer:peerID error:&error];
if (error)
NSLog(@"%@",error);
}
- (void)session:(GKSession *)session connectionWithPeerFailed:(NSString *)peerID withError:(NSError *)error {
NSLog(@"%@",error);
}
- (void)session:(GKSession *)session didFailWithError:(NSError *)error {
NSLog(@"%@",error);
}
ログ ステートメントは出力されず、各メソッドにブレークポイントを設定しましたが、ユーザーが Bluetooth と Wi-Fi の両方をオフにしている場合、いずれもヒットしません。session:didFailWithError: をトリガーして、ユーザーに Bluetooth をオンにするか、Wi-Fi ネットワークに接続するように促すことができるようになることを期待していました。