2010-02-19 8 views
6

Ich möchte zwei Geräte mit der GKSession verbinden, von einem als Server und dem anderen als Client. Mit dieser Konfiguration kann ich den GKPeerPickerController nicht verwenden.GameKit: GKSession Handbuch

ich Probleme habe die beiden Geräte zum Anschluss:

  • nur Bluetooth: unmöglich
  • mit WiFi: zumindest gibt einigen Datenaustausch zwischen den Geräten sind aber nicht erfolgreich conection.

In der Schnittstellendatei habe ich die

GKSessionDelegate 
GKSession *session; 

Bei der Implementierung, starte ich den Server mit diesem Code:

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

Der Client startet mit diesem Code:

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

Wie kann ich die Verwendung von Bluetooth statt t erzwingen er WiFi?

Auch habe ich implementiert diese Anrufe:

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

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

Wenn ich beginne, hat sich dies in den Debugger:

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

Und wenn das andere Gerät zu finden beginnt, erhalte ich diese:

~ 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 

Was fehlt mir hier?

Ich bin sicher, dass beide Geräte Bluetooth aktiviert haben und in das gleiche WiFi verbunden sind.

danke,

r.

+1

FYI, Ihr GKSessionModeClient und GKSessionModeServer sind vertauscht. – Jeff

Antwort

-1

ich ähnliche Probleme gehabt, aber aus der obigen Beschreibung Ich glaube, Sie werden einige Fehler machen:

GKSession nur implementiert BT; Wenn Sie den Picker verwenden, können Sie separate Methoden für den Umgang mit WiFi-Verbindungen bereitstellen.

Die „didReceiveConnectionRequestFromPeer“ Methode soll Aufruf die „acceptConnectionFromPeer“ Methode auf dem Session-Objekt - Sie implementieren nicht den „acceptConnectionFromPeer“ auf Ihrem delegieren.

Zum Debuggen, sollten Sie Statusänderungen in der Delegatmethode log "Sitzung: Peer: didChangeState:" (siehe http://developer.apple.com/iPhone/library/documentation/GameKit/Reference/GKSessionDelegate_Protocol/Reference/Reference.html). Wenn ein Peer "Verfügbar" ist, können Sie aufrufen "connectToPeer:"; Bei "Verbunden" können Sie "sendData: toPeers:" verwenden.

Für IO nachdem Sie eine Verbindung hergestellt haben, möchten Sie die Methode "setDataReceiveHandler: withContext:" für die Sitzung aufgerufen haben.

Früher hatte ich einige Tippfehler in meinem Code, aber es funktioniert jetzt.

Viel Glück.

+0

Hallo, Ich habe diese Delegierten Methoden implementiert, aber ich habe sie nicht in den Code geschrieben. Auch meine Sitzung: Peer: DidChangeState nie Anrufe bei der Verwendung von GKSession, aber es wird aufgerufen, wenn ich den Picker verwenden. Bis ich weitere Informationen über gefunden, was falsch sein kann oder warum es nicht funktioniert, ich bin mit dem GKPicker ... dank zumindest ich weiß, ich bin nicht der einzige ... :-) grüße, r. – mongeta

+3

"GKSession implementiert nur BT" ... das ist nicht wahr. – typeoneerror

+0

@type Während dies jetzt wahr ist, glaube ich zu der Zeit, als diese Antwort gegeben wurde 'GameKit' hatte nur Unterstützung für Bluetooth-Verbindungen und Sie mussten' CFNetwork' verwenden, um Geräte über WiFi zu verbinden. Es wäre genauer zu sagen: "Das ist nicht mehr wahr, da' GameKit 'jetzt WLAN-Verbindungen unterstützt. " –

1

Ich denke, Sie vermissen Verbindung mit Client zu akzeptieren. Nachdem Sie den „didReceiveConnectionRequestFromPeer“ Rückruf erhalten, müssen Sie die Verbindung mit Client so akzeptieren:

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

Danach werden Sie „GKPeerStateConnected“ erhalten hier:

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

ich diese Hilfe Sie hoffen.