新しいiPhoneSDK3.0でピアを見つけるには、ピアピッカーを使用する必要がありますか?
あまり使いたくないのですが、ピアツーピアのBluetooth接続を使いたいです。ピアピッカーを使用せずにBluetooth接続を示すサンプルコードはありますか?Appleが提供するゲームGKTankはPeerPickerを使用しているので、私はそれを使用できません。
新しいiPhoneSDK3.0でピアを見つけるには、ピアピッカーを使用する必要がありますか?
あまり使いたくないのですが、ピアツーピアのBluetooth接続を使いたいです。ピアピッカーを使用せずにBluetooth接続を示すサンプルコードはありますか?Appleが提供するゲームGKTankはPeerPickerを使用しているので、私はそれを使用できません。
これを行うには2つの方法があります。
最初の方法はGameKitAPIを使用します。まず、2つの別々のクラスを用意します。1つはGKSessionDelegate
プロトコルを実装し、GameKit / Bluetoothの「ハンドラー」として機能し、もう1つはプレゼンテーションUI(テーブルビューを備えたある種のビューコントローラー)として機能します。配線する方法は、ハンドラーがGameKit通知などを管理し、UIのデリゲートメソッドを呼び出して、ピアが接続/ドロップオフしたときにテーブルビューを更新することです。これにより、デバイスが出入りするときに、ピッカーリストが表示されます。周りにいる人を表示するように更新する必要があります。
以下はあなたが始めるためのいくつかのコードです:
- (BOOL) startPeer
{
BOOL result = NO;
if (!_session) {
_session = [[GKSession alloc] initWithSessionID:BLUETOOTHSESSION
displayName:nil
sessionMode:GKSessionModePeer];
_session.delegate = self;
[_session setDataReceiveHandler:self withContext:nil];
_session.available = YES;
result = YES;
}
return result;
}
- (void) stopPeer
{
// Set up the session for the next connection
//
[_session disconnectFromAllPeers];
_session.available = YES;
[self cleanupProgressWindow];
}
- (void) loadPeerList
{
self.peerList = [[NSMutableArray alloc] initWithArray:[_session peersWithConnectionState:GKPeerStateAvailable]];
}
- (void)session:(GKSession *)session peer:(NSString *)peerID didChangeState:(GKPeerConnectionState)state
{
BOOL peerChanged = NO;
switch(state) {
// When peer list changes, we adjust the available list
//
case GKPeerStateAvailable:
if (_peerList) {
[_peerList addObject:peerID];
peerChanged = YES;
}
break;
// When peer list changes, we adjust the available list
//
case GKPeerStateUnavailable:
if (_peerList) {
[_peerList removeObject:peerID];
peerChanged = YES;
}
break;
// Called when the peer has connected to us.
//
case GKPeerStateConnected:
// start reading and writing
break;
case GKPeerStateDisconnected:
{
if (_isWriter) {
_isConnected = NO;
_deviceToSend = nil;
[self cleanupProgressWindow];
} else {
// Other side dropped, clean up local data and reset for next connection
self.dataRead = nil;
}
}
break;
}
// Notify peer list delegate that the list has changed so they can update the UI
//
if (peerChanged)
CALLDELEGATE(_peerListDelegate, peerListChanged);
}
これを行う2番目の方法は、標準のBonjourサービス選択メカニズムを使用することです。GameKitはBonjour上に実装されているため(ただし、WiFiではなくBluetoothを介して)、2つの側が相互にネットワーク到達可能性を通過して接続されると、Bonjourに登録され、他のBonjourサービスと同じように動作します。GameKitの方法はおそらく少し簡単ですが、WiFiのコードが既にある場合は、Bluetoothにも再利用できます。
なぜ使いたくないのですか?
Bluetooth接続を自分で直接行う方法があるかどうかはわかりません。これは、他の方法で接続を見つけるための代替手段を提供します。これは、多数のiPod / Touchの間にネットワークをセットアップするための非常に優れたシステムを提供し、関係が本当にピアかマスター/スレーブかを定義できます...