GameKit( iphone SDK フレームワーク)

今製作中のアプリ、将来的には通信対戦をつけるつもりでいたのだが
どうもGameKitを使うと bluetoothだけでなくLAN環境でもネット対戦
の実装が簡単にできるとの事でいろいろ試してみた。

・GKPeerPickerController はLAN用では使えない。
connectionTypesMaskのマスク値を
GKPeerPickerConnectionTypeNearby|GKPeerPickerConnectionTypeOnline
のようにGKPeerPickerConnectionTypeOnlinを増やしてやると
左に オンライン、右に bluetoothでの接続アイコンが出現するが
実はオンライン用のアイコンはダミーで押すだけで機能しなかった。
AppleGameKitリファレンスによると
下記のように 自分でオンライン用のインターフェースはてめえで開発してねという
ようなことが書いてある。

  • (void)peerPickerController:(GKPeerPickerController *)picker didSelectConnectionType:(GKPeerPickerConnectionType)type {

if (type == GKPeerPickerConnectionTypeOnline) {

picker.delegate = nil;

[picker dismiss];

[picker autorelease];

// Implement your own internet user interface here.

}

}

そこでdelgateして ボタンが押されたらGKsessionのオブジェクトを作るように
してみる。

GKSession *aSession = [[GKSession alloc] initWithSessionID:nil
displayName:user.displayName
sessionMode:GKSessionModePeer];

self.gkSession = aSession;

self.gkSession.delegate = self;
self.gkSession.available = YES;

[self.gkSession setDataReceiveHandler:self withContext:NULL];

UIは何も作成してないので何も起きないが、これを実機に転送し
シュミレーターと同時に オンライン用のアイコンを押してみるとデバッグ
コンソールでは 何か接続している様子がわかる。
試しに 実機は初代のitouchで右側のbluetooth用のアイコンが押しても機能しないため
しか押せないのでシュミレータのほうで押してみるとなんと!
itouchの名前がリストアップされた。しかし選択してみると何もおきない。
どうもGKSessionでは
1.接続可能な相手をリストアップする
2.相手に確認のメッセージを送る
3.承諾する
というプロセスを踏まないと実際にP2Pで通信できるようにはならないらしい。
こんどはGKSessionのメソッドをdelgateして
2.のリクエストがきたら即承諾する処理を加えると GKPeerPickerController
のUIインターフェースが消えた。(たぶんこれで接続可能になったため)

                                                                                                                                            • -
  • (void)session:(GKSession*) session didReceiveConnectionRequestFromPeer:(NSString*) peerID {


[session acceptConnectionFromPeer:peerID error:nil];
}

                                                                                                                                                  • -

もしかすると 初代のitouchでなければ bluetoothのアイコンを選択できるので
なんの変更もなしでオンラインでの接続もできるのかもしれない。