2009-06-26 8 views
7

Do I necessario per utilizzare lo Peer Picker per trovare i peer nel nuovo iPhone SDK 3.0?GameKit in iPhone SDK 3.0

Non voglio davvero usarlo, ma voglio usare la connessione Bluetooth peer-to-peer. C'è qualche codice di esempio che dimostra la connessione Bluetooth senza utilizzare Peer Picker? Il gioco GKTank fornito da Apple utilizza Peer Picker, quindi non posso utilizzarlo.

risposta

12

Ci sono due modi per farlo.

Il primo modo utilizza l'API GameKit. Si inizia con due classi separate, una che implementa il protocollo GKSessionDelegate e funge da "gestore" di GameKit/Bluetooth e l'altra come interfaccia utente della presentazione (molto probabilmente una sorta di viewcontroller con una vista tabella). Il modo in cui lo collegheresti è che il gestore gestisce le notifiche di GameKit, ecc. Quindi chiama i metodi delegati sull'interfaccia utente per aggiornare la vista tabella quando un peer si connette/scende, ecc. In questo modo, quando i dispositivi vanno e vengono, l'elenco di selezione dovrebbe aggiornare per mostrare chi c'è in giro.

Di seguito è riportato un codice per iniziare:

- (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);   
} 

Il secondo modo per farlo è quello di utilizzare meccanismi di selezione del servizio standard di Bonjour. GameKit è implementato su Bonjour (ma tramite Bluetooth anziché WiFi), quindi una volta che le due parti hanno raggiunto la raggiungibilità della rete tra loro e connesse, sono registrate sotto Bonjour e si comportano come farebbe qualsiasi servizio Bonjour. Il modo GameKit è probabilmente un po 'più semplice, ma se hai già il codice per il WiFi puoi riutilizzarlo anche per il Bluetooth.

+0

Ehi, grazie mille per questo modello da cui partire. Un'altra domanda, posso vedere come la sessione: peer: il metodo didChangeState sarebbe andato nel file delegate.h/.m, ma per quanto riguarda gli altri metodi? StartPeer e stopPeer andrebbero nei miei file viewcontroller.h/.m o l'intero modello andrà nel file delegato? –

+0

In questo caso, si presume che tutti questi siano nel gestore delegato poiché si occupano del sottostante impianto idraulico GameKit. Non c'è motivo per cui non puoi mettere tutto dentro il viewcontroller ma è una buona idea mantenere il codice UI disgiunto dal codice di rete.Dopo aver aggiornato l'array di peer, l'oggetto 'handler' richiama il proprio metodo delegato personalizzato "peerListChanged" che notifica al viewcontroller che l'elenco è stato modificato in modo che possa richiedere una ricarica della tabella e mostrare il nuovo elenco all'utente. – Ramin

+0

Funziona solo su Wi-Fi o troverà anche peer tramite Bluetooth? Devi usare il peer picker per usare bluetooth? – typeoneerror

-2

Perché non vuoi usarlo?

Non so che c'è un modo per eseguire direttamente una connessione Bluetooth e presenta un'alternativa per trovare le connessioni con altri mezzi. Fornisce un sistema molto carino per impostare una rete tra un numero di iPod/Touches e consente di definire se la relazione è realmente peer o master/slave ...

+0

Bene, sto progettando una rete bluetooth ad-hoc mobile in cui condurrò attività di calcolo distribuito con tecniche di data mining. Non voglio che l'utente (me) si preoccupi di selezionare un peer a cui connettersi. Ho in programma di configurarlo in modo che tutto l'iPod Touch esegua la scansione di tutti i dispositivi iPhone/iPod Touch disponibili e quindi scarichi l'attività su ognuno di essi. Quando si tratta di un peer, se il peer è "occupato" già facendo un compito, allora dovrebbe passare automaticamente al prossimo peer. –

+2

In tal caso, costruisci i client per accettare automaticamente gli inviti e considerare l'intera cosa come una relazione master-slave. Ognuno deve eseguire l'app affinché funzioni, bluetooth o WiFi (anche se in realtà è possibile basare le informazioni su eventuali notifiche, anche se non è possibile accettare automaticamente un avvio della propria app da una notifica se non è già in esecuzione) . –

+0

Sì, era l'idea ... di accettare automaticamente le connessioni, che sarà il mio prossimo passo dopo aver stabilito una connessione tra due iPod touch. Avrò un totale di otto con cui lavorare una volta che tutto è attivo e funzionante. –