2010-02-19 8 views
6

GKSession을 사용하여 두 개의 장치를 연결하고 하나는 서버로 시작하고 다른 하나는 클라이언트로 시작하려고합니다. 이 구성을 사용하면 GKPeerPickerController를 사용할 수 없습니다.GameKit : GKSession 설명서

나는 두 장치를 연결하는 데 문제가 :

  • 에만 블루투스를 사용 : 불가능
  • 사용하여 무선 랜을 적어도 일부 데이터 장치 간의 교류 있지만 성공적으로 conection에있다. 인터페이스 파일에서

내가 구현에서

GKSessionDelegate 
GKSession *session; 

이,이 코드를 사용하여 서버를 시작합니다

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

클라이언트는이 코드를 사용하여 시작합니다

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

어떻게 t 대신 Bluetooth 사용을 강제 할 수 있습니까? 와이파이?

또한 내가 구현 한 그 전화는 : 나는 시작하면

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

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

, 나는 디버거로이 얻을 :

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

그리고 다른 장치 찾을 시작할 때,이 얻을 :

~ 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 

내가 여기에 있습니다.

두 장치 모두 블루투스가 가능하고 동일한 WiFi에 연결되어 있어야합니다.

감사합니다.

r.

+1

FYI, GKSessionModeClient 및 GKSessionModeServer가 서로 바뀝니다. – Jeff

답변

-1

나는 비슷한 문제가 있었다, 그러나 설명에서 나는 당신이 어떤 오류를하고있다 생각 이상 :

GKSession는 BT 구현을; 피커를 사용하는 경우 WiFi 연결을 처리하기위한 별도의 방법을 제공 할 수 있습니다.

은 "didReceiveConnectionRequestFromPeer"방법해야 호출 세션 개체에 "acceptConnectionFromPeer"방법 - 당신이 이 대리인에 "acceptConnectionFromPeer"를 구현하지 않습니다.

디버깅의 경우 대리자 메서드의 상태 변화를 기록한다 "세션 : 피어 : didChangeState을" (http://developer.apple.com/iPhone/library/documentation/GameKit/Reference/GKSessionDelegate_Protocol/Reference/Reference.html 참조). 피어가 "사용 가능"이면 은 "connectToPeer :"를 호출 할 수 있습니다. "연결됨"일 때 "sendData : toPeers :"를 사용할 수 있습니다.

연결을 설정 한 후 을 세션에서 "setDataReceiveHandler : withContext :"메서드라고 부르고 싶습니다.

이전에 코드에 오타가 있었지만 현재 작동 중입니다.

행운을 빈다.

+0

Hello, 위임 메서드를 구현했지만 코드에 작성하지 않았습니다. 내 세션 : peer : didChangeState는 GKSession을 사용할 때 전화를받지 못하지만 피커를 사용할 때 호출됩니다. 내가 잘못 될 수 있습니다 또는 작동하지 않는 이유는, 내가 GKPicker ... 감사를 사용하고 있습니다에 대한 자세한 정보를 찾을 때까지 , 적어도 내가 유일한 사람이 아니에요 알고 ... :-) 안부, r. – mongeta

+3

"GKSession 만 BT 구현"... 이것은 사실이 아닙니다. – typeoneerror

+0

@type 지금은 사실이지만,이 대답을받은 시점에'GameKit'은 블루투스 연결 만 지원했고 WiFi를 통해 장치를 연결하려면'CFNetwork '를 사용해야했습니다. "GameKit이 WiFi 연결을 지원할 때 더 이상 사실이 아닙니다."라고 말하는 것이 더 정확할 것입니다. –

1

클라이언트와의 연결을 수락하지 않을 것으로 생각됩니다. 당신이 "didReceiveConnectionRequestFromPeer"콜백을받은 후,이 같은 클라이언트와의 연결을 허용해야합니다이 후

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

당신이 여기 "GKPeerStateConnected"을 받게됩니다

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

내가이 도움을 바랍니다.