Searching for Peer Devices
これでプロジェクトの枠組みができたので、次は他のBluetoothデバイスにアクセスするためのAPIについて見ていきます。
BluetoothViewController.hファイル内でGKPeerPickerController
オブジェクトを宣言します。
#import "BluetoothViewController.h" #import @implementation BluetoothViewController @synthesize currentSession; @synthesize txtMessage; @synthesize connect; @synthesize disconnect; GKPeerPickerController *picker;
GKPeerPickerController
クラスは、他のBluetoothデバイスを検索して接続する機能の標準UIを提供します。他のBluetoothデバイスに接続するときにはこれを使うのが1番簡単です。
他のBluetoothデバイスを検索して接続するには、btnConnect:
メソッドを次のように実装します。
-(IBAction) btnConnect:(id) sender { picker = [[GKPeerPickerController alloc] init]; picker.delegate = self; picker.connectionTypesMask = GKPeerPickerConnectionTypeNearby; [connect setHidden:YES]; [disconnect setHidden:NO]; [picker show]; }
connectionTypesMask
プロパティは、ユーザーが選択できる接続の種類を表します。GKPeerPickerConnectionTypeNearby
とGKPeerPickerConnectionTypeOnline
の2種類が使用でき、Bluetooth通信ではGKPeerPickerConnectionTypeNearby
定数を使用します。GKPeerPickerConnectionTypeOnline
定数はインターネットベースの接続を表します。
リモートBluetoothデバイスが複数検出され、ユーザーがそのうち1つを選択して接続したときは、peerPickerController:didConnectPeer:toSession:
メソッドが呼び出されます。そのため、このメソッドは次のように実装します。
- (void)peerPickerController:(GKPeerPickerController *)picker didConnectPeer:(NSString *)peerID toSession:(GKSession *) session { self.currentSession = session; session.delegate = self; [session setDataReceiveHandler:self withContext:nil]; picker.delegate = nil; [picker dismiss]; [picker autorelease]; }
ユーザーがピアBluetoothデバイスに接続したら、GKSession
オブジェクトをcurrentSession
プロパティに保存します。これにより、GKSession
オブジェクトを使用してリモートデバイスと通信できるようになります。
ユーザーがBluetooth Pickerをキャンセルした場合は、peerPickerControllerDidCancel:
メソッドが呼び出されます。このメソッドは次のように定義します。
- (void)peerPickerControllerDidCancel:(GKPeerPickerController *)picker { picker.delegate = nil; [picker autorelease]; [connect setHidden:NO]; [disconnect setHidden:YES]; }
接続したデバイスから切断するには、GKSession
オブジェクトからdisconnectFromAllPeers
メソッドを使用します。btnDisconnect:
メソッドを次のように定義します。
-(IBAction) btnDisconnect:(id) sender { [self.currentSession disconnectFromAllPeers]; [self.currentSession release]; currentSession = nil; [connect setHidden:NO]; [disconnect setHidden:YES]; }
デバイスが接続または切断されると、session:peer:didChangeState:
メソッドが呼び出されます。このメソッドは次のように実装します。
- (void)session:(GKSession *)session peer:(NSString *)peerID didChangeState:(GKPeerConnectionState)state { switch (state) { case GKPeerStateConnected: NSLog(@"connected"); break; case GKPeerStateDisconnected: NSLog(@"disconnected"); [self.currentSession release]; currentSession = nil; [connect setHidden:NO]; [disconnect setHidden:YES]; break; } }
このイベントを処理すると、接続が確立または終了したタイミングを検出できます。例えば、接続が確立されたらすぐに相手デバイスに向けてデータの送信を開始したいときなどに利用できます。