2009-06-26 11 views
7

Do I Peer Pickerを使用して新しいiPhone SDK 3.0のピアを見つけるには?iPhone SDK 3.0のGameKit

私は本当にそれを使いたくないですが、私はピアツーピアBluetooth接続を使いたいと思います。ピアピッカーを使用せずにBluetooth接続を示すサンプルコードはありますか? Appleが提供するゲームGKTankはピアピッカーを使用するので、私はそれを使用できません。

答えて

12

これには2通りの方法があります。

最初の方法では、GameKit APIを使用します。まず、GKSessionDelegateプロトコルを実装し、GameKit/Bluetoothの "ハンドラ"として動作するクラスと、プレゼンテーションUI(ほとんどの場合、テーブルビューを持つ何らかの種類のviewcontroller)として動作する2つのクラスがあります。あなたがそれをワイヤリングする方法は、ハンドラが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);   
} 

それを行うための第二の方法は、標準のBonjourサービスの選択メカニズムを使用することです。 GameKitはBonjourの上に実装されていますが(WiFiの代わりにBluetooth経由で)、双方がネットワークの到達可能性を持ち、接続されるとBonjourに登録され、Bonjourサービスのように動作します。 GameKitの方法はおそらくもう少し簡単ですが、すでにWiFi用のコードがあれば、Bluetooth用に再利用することもできます。

+0

こんにちは、ありがとうございました。もう1つの質問ですが、私はsession:peer:didChangeStateメソッドがdelegate.h/.mファイルにどのように入るのかを見ることができますが、他のメソッドはどうですか? startPeerとstopPeerは私のviewcontroller.h/.mファイルに入っていますか、テンプレート全体がデリゲートファイルに入りますか? –

+0

この場合、これらはすべて基本のGameKit配管を扱うため、デリゲートハンドラにあるとみなされます。 ViewController内にすべてを置くことができない理由はありませんが、UIコードをネットワークコードから切り離しておくことをお勧めします。ピアの配列を更新した後、 'handler'オブジェクトは独自のカスタムデリゲートメソッド "peerListChanged"を呼び出し、ビューコントローラにそのリストが変更されたことを通知し、テーブルリロードを呼び出して新しいリストをユーザに表示できるようにします。 – Ramin

+0

これはWifi上でのみ機能するのですか、それともBluetooth経由で同僚を見つけるでしょうか?あなたはブルートゥースを使用するピアピッカーを使用する必要がありますか? – typeoneerror

-2

なぜあなたはそれを使いたくないですか?

自分自身で直接Bluetooth接続を行う方法がありません。それは、他の方法で接続を見つけるための選択肢を提示しています。多くのiPod/Touch間でネットワークを設定することができます。また、関係が本当にピアかマスタかスレーブかを定義できます。

+0

私はデータマイニング技術を使って分散コンピューティングタスクを実行するモバイルアドホックBluetoothネットワークを設計しています。私は選択されたピアに接続することをユーザー(私)に心配させたくありません。すべてのiPod Touchが利用可能なすべてのiPhone/iPod Touchデバイスをスキャンしてから、それぞれにタスクをオフロードするように設定する予定です。ピアになると、ピアがすでにタスクを実行中である場合は、自動的に次のピアに移動する必要があります。 –

+2

その場合、招待を自動受け入れて、すべてをマスターとスレーブの関係として扱うようにクライアントを構築します。 これは動作させるには誰でもアプリを実行している必要があります(既に実行中でない場合は通知からアプリの起動を自動的に受け入れる方法はありませんが、 。 –

+0

ええ、これはアイデアだった...接続を自動的に受け入れるには、最初に2つのiPodタッチの間に接続を確立した後に次のステップに進んでください。すべてが稼動したら、私は合計8つの作業をするつもりです。 –

関連する問題