2010-02-19 14 views
6

Chcę podłączyć dwa urządzenia za pomocą GKSession, zaczynając jeden jako serwer, a drugi jako klient. Korzystając z tej konfiguracji, nie mogę używać GKPeerPickerController.GameKit: GKSession manual

Mam problemy z podłączeniem dwóch urządzeń:

  • Używając tylko bluetooth: Impossible
  • użyciu WiFi: przynajmniej istnieją pewne wymiana danych pomiędzy urządzeniami, ale nie udało Łącze.

W pliku interfejsu Mam

GKSessionDelegate 
GKSession *session; 

wprowadzanie w życie, ja uruchomić serwer przy użyciu tego kodu:

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

Klient zaczyna używać tego kodu:

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

Jak mogę wymusić użycie Bluetooth zamiast t on WiFi?

Również wdrożyły te rozmowy:

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

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

Kiedy zacznę, dostaję to do debuggera:

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

A gdy inne urządzenie uruchamia się znaleźć, otrzymuję to:

~ 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 

Czego tu mi brakuje?

Jestem pewien, że oba urządzenia mają włączoną bluetooth i są podłączone do tego samego Wi-Fi.

dziękuję,

r.

+1

FYI, twój GKSessionModeClient i GKSessionModeServer są zamieniane. – Jeff

Odpowiedz

-1

miałem podobne problemy, ale z opisu powyżej myślę robicie jakieś błędy:

GKSession tylko implementuje BT; jeśli korzystasz z selektora, możesz udostępnić oddzielne metody obsługi połączeń Wi-Fi.

W „didReceiveConnectionRequestFromPeer” metoda powinna wezwanie W „acceptConnectionFromPeer” metoda na obiekcie sesji - robisz nie realizować „acceptConnectionFromPeer” na delegata.

Do debugowania, należy zalogować zmiany stanu w metodzie delegata "sesji: rówieśniczej: didChangeState:" (patrz http://developer.apple.com/iPhone/library/documentation/GameKit/Reference/GKSessionDelegate_Protocol/Reference/Reference.html). Gdy peer jest "Dostępny", możesz zadzwonić "connectToPeer:"; kiedy "Połączono", możesz użyć "sendData: toPeers:".

Dla IO po nawiązaniu połączenia, chcesz wywołać metodę "setDataReceiveHandler: withContext:" w sesji.

Wcześniej miałem kilka literówek w moim kodzie, ale teraz działa.

Powodzenia.

+0

Witaj, Mam wdrożone metody delegatów, ale nie zapisałem ich w kodzie. Również moja sesja: peer: didChangeState nigdy nie otrzymywa połączeń podczas używania GKSession, ale zostaje wywołana, gdy używam selektora. aż znalazłem więcej informacji na temat tego, co może być nie tak lub dlaczego nie działa, używam GKPicker ... dzięki, przynajmniej wiem, że nie jestem jedyny ... :-) pozdrowienia, r. – mongeta

+3

"GKSession implementuje tylko BT" ... nie jest to prawdą. – typeoneerror

+0

@type Chociaż jest to teraz prawdą, uważam, że w momencie udzielania tej odpowiedzi 'GameKit' miał tylko obsługę połączeń bluetooth i musiałeś używać' CFNetwork' do łączenia urządzeń przez WiFi. Bardziej trafne byłoby powiedzenie "To nie jest już prawdą, ponieważ GameKit obsługuje teraz połączenia WiFi". –

1

Myślę, że brakuje Ci połączenia z klientem. Po otrzymaniu „didReceiveConnectionRequestFromPeer” zwrotnego, trzeba zaakceptować połączenie z klientem tak:

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

po to otrzymasz „GKPeerStateConnected” tutaj:

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

Mam nadzieję, że to pomoże.

Powiązane problemy