2010-02-19 19 views
6

Quiero conectar dos dispositivos usando GKSession, comenzando uno como servidor y el otro como cliente. Usando esta configuración no puedo usar el GKPeerPickerController.GameKit: manual de GKSession

Tengo problemas para conectar los dos dispositivos:

  • Usando sólo bluetooth: imposible
  • usando WiFi: al menos hay algún intercambio de datos entre los dispositivos de conexión, pero sin éxito.

En el archivo de interfaz tengo el

GKSessionDelegate 
GKSession *session; 

En la implementación, que inicie el servidor utilizando este código:

session = [[GKSession alloc] initWithSessionID:@"iFood" displayName:nil sessionMode:GKSessionModeClient]; 
session.delegate = self; 
session.available = YES; 

El cliente comienza a utilizar este código:

session = [[GKSession alloc] initWithSessionID:@"iFood" displayName:nil sessionMode:GKSessionModeServer]; 
session.delegate = self; 
session.available = YES; 

Cómo puedo forzar el uso de Bluetooth en lugar de t ¿WiFi?

También he implementado esas llamadas:

-(void)session:(GKSession *)session didReceiveConnectionRequestFromPeer:(NSString *)peerID { 
NSLog(@"Someone is trying to connect"); 
} 

- (BOOL)acceptConnectionFromPeer:(NSString *)peerID error:(NSError **)error { 
NSLog(@"acceptConnectionFromPeer"); 
} 

Cuando comienzo, me sale esto en el depurador:

Listening on port 50775 
2010-02-19 14:55:02.547 iFood[3009:5103] handleEvents started (2) 

Y cuando el otro dispositivo empieza a buscar, me sale esto:

~ DNSServiceBrowse callback: Ref=187f70, Flags=2, IFIndex=2 (name=[en0]), ErrorType=0 name=00eGs1R1A..Only by Audi regtype=_2c3mugr67ej6j7._udp. domain=local. 
~ DNSServiceQueryRecord callback: Ref=17bd40, Flags=2, IFIndex=2 (name=[en0]), ErrorType=0 fullname=00eGs1R1A\.\.Only\032by\032Audi._2c3mugr67ej6j7._udp.local. rrtype=16 rrclass=1 rdlen=18 ttl=4500 
** peer 1527211048: oldbusy=0, newbusy=0 
~ DNSServiceBrowse callback: Ref=187f70, Flags=2, IFIndex=-3 (name=[]), ErrorType=0 name=00eGs1R1A..Only by Audi regtype=_2c3mugr67ej6j7._udp. domain=local. 
GKPeer[186960] 1527211048 service count old=1 new=2 
~ DNSServiceQueryRecord callback: Ref=17bd40, Flags=2, IFIndex=-3 (name=[]), ErrorType=0 fullname=00egs1r1a\.\.only\032by\032audi._2c3mugr67ej6j7._udp.local. rrtype=16 rrclass=1 rdlen=18 ttl=7200 
** peer 1527211048: oldbusy=0, newbusy=0 
~ DNSServiceBrowse callback: Ref=187f70, Flags=2, IFIndex=-3 (name=[]), ErrorType=0 name=00TF5kc1A..Only by Audi regtype=_2c3mugr67ej6j7._udp. domain=local. 
~ DNSServiceQueryRecord callback: Ref=188320, Flags=2, IFIndex=-3 (name=[]), ErrorType=0 fullname=00tf5kc1a\.\.only\032by\032audi._2c3mugr67ej6j7._udp.local. rrtype=16 rrclass=1 rdlen=18 ttl=7200 
** peer 1723356125: oldbusy=0, newbusy=0 
~ DNSServiceQueryRecord callback: Ref=188320, Flags=2, IFIndex=2 (name=[en0]), ErrorType=0 fullname=00TF5kc1A\.\.Only\032by\032Audi._2c3mugr67ej6j7._udp.local. rrtype=16 rrclass=1 rdlen=18 ttl=4500 
** peer 1723356125: oldbusy=0, newbusy=0 

¿Qué es lo que me falta falta por aquí?

Estoy seguro de que ambos dispositivos tienen Bluetooth activado y conectado a la misma WiFi.

gracias,

r.

+1

FYI, su GKSessionModeClient y GKSessionModeServer se intercambian. – Jeff

Respuesta

-1

tuve problemas similares, pero a partir de la descripción anterior que creo que están haciendo algunos errores :

GKSession sólo se aplique y BT; si usa el selector, puede proporcionar métodos separados para tratar con conexiones WiFi.

El método "didReceiveConnectionRequestFromPeer" debería llamada el método "acceptConnectionFromPeer" en el objeto de sesión - que no implementa la "acceptConnectionFromPeer" en su delegado.

Para la depuración, debe iniciar sesión cambios de estado en el método delegado "sesión: entre iguales: didChangeState:" (ver http://developer.apple.com/iPhone/library/documentation/GameKit/Reference/GKSessionDelegate_Protocol/Reference/Reference.html). Cuando un par está "Disponible", usted puede llamar a "connectToPeer:"; cuando está "Conectado", puede usar "sendData: toPeers:".

Para IO después de haber establecido una conexión, debe haber llamado el método "setDataReceiveHandler: withContext:" en la sesión.

Antes tenía algunos errores tipográficos en mi código, pero ahora está funcionando.

Buena suerte.

+0

Hola, Tengo implementados esos métodos delegados, pero no los escribí en el código. También mi sesión: peer: didChangeState nunca recibe llamadas cuando usa GKSession, pero se llama cuando uso el selector. Hasta que encontré más información sobre lo que puede estar mal o por qué no está funcionando, estoy usando el GKPicker ... gracias, al menos sé que no soy el único ... :-) respetos, r. – mongeta

+3

"GKSession solo implementa BT" ... esto no es cierto. – typeoneerror

+0

@type Si bien esto es cierto ahora, creo que en el momento en que se dio esta respuesta, "GameKit" solo tenía soporte para conexiones bluetooth y tenía que usar 'CFNetwork' para conectar dispositivos a través de WiFi. Sería más exacto decir "Esto ya no es cierto ya que 'GameKit' ahora es compatible con conexiones WiFi". –

1

Creo que echas de menos aceptar la conexión con el cliente. Después de recibir la devolución de llamada "didReceiveConnectionRequestFromPeer", tiene que aceptar la conexión con el cliente de la siguiente manera:

-(void)session:(GKSession *)session didReceiveConnectionRequestFromPeer:(NSString *)peerID { 
    NSLog(@"Someone is trying to connect"); 
    NSError *error; 
    [gkSession acceptConnectionFromPeer:peerID error:&error]; 
    if(error) 
    NSLog(@"Error on accept connection with peer: ", error); 
} 

Después de esto usted recibirá "GKPeerStateConnected" aquí:

- (void)session:(GKSession *)session peer:(NSString *)peerID didChangeState:(GKPeerConnectionState)state{} 

espero que esto ayude.