2009-06-26 66 views
7

我是否需要以使用Peer Picker找到新的iPhone SDK 3.0中的對等體?iPhone SDK 3.0中的GameKit

我真的不想使用它,但我確實想使用點對點藍牙連接。有沒有示例代碼演示藍牙連接,而不使用Peer Picker? Apple提供的遊戲GKTank使用Peer Picker,所以我不能使用它。

回答

12

有兩種方法可以做到這一點。

第一種方式使用GameKit API。你開始有兩個獨立的類,一個實現GKSessionDelegate協議,充當GameKit /藍牙「處理程序」,另一個作爲演示用戶界面(很可能是某種帶有tableview的視圖控制器)。你將它連接起來的方式是處理程序管理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),所以一旦雙方已經通過網絡相互連接並相互連接,它們就在Bonjour下注冊並且像任何Bonjour服務一樣行事。 GameKit的方式可能會稍微簡單一些,但是如果您已經有了WiFi代碼,那麼它也可以用於藍牙。

-2

爲什麼你不想使用它?

我不知道有一種方法可以直接自己做藍牙連接,它提供了一種通過其他方式查找連接的替代方法。它提供了一個非常好的系統,可以在多個iPod/Touches之間建立網絡,並且可以讓您定義關係是真正的對等還是主/從...

+0

那麼,我正在設計一個移動ad-hoc藍牙網絡,我將使用數據挖掘技術進行分佈式計算任務。我不希望用戶(我)擔心選擇一個對等體進行連接。我計劃進行設置,以便所有iPod Touch都能掃描所有可用的iPhone/iPod Touch設備,然後將任務卸載到每個設備上。當談到對等體時,如果對等體已經在忙於執行任務,那麼它應該自動移動到下一個對等體。 – 2009-06-26 16:23:36

+2

在這種情況下,建立客戶端以自動接受邀請,並將整個事情視爲主從關係。 每個人都必須運行該應用程序才能工作,藍牙或WiFi(儘管實際上您可能會將它基於Notificatons,儘管如果它尚未運行,則無法從通知中自動接受應用程序的啓動) 。 – 2009-06-26 19:34:53