2012-07-10 2 views
3

블루투스 모드로 iPhone 게임을 만들었으므로 블루투스를 통해 1 대 1을 재생할 수 있습니다. 나는 또한 선택기와 함께 할 수있는 뭔가가 다른 모든 방법을 내 코드를 붙여거야 그래서 오류를 제공하는 코드를 모르는수신 요청을 수락 할 때 Gamekit API 오류가 발생했습니다.

picker = [[GKPeerPickerController alloc] init]; 
picker.delegate = self; 
picker.connectionTypesMask = GKPeerPickerConnectionTypeNearby; 
[picker show]; 

:

피커에 대한 나의 구현은 다음과 같다
- (void) receiveData:(NSData *)data fromPeer:(NSString *)peer inSession: (GKSession *)session context:(void *)context { 
    NSString *dataString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
    NSDictionary *dataDictionary = [NSDictionary dictionaryWithObjects: [NSArray arrayWithObjects:dataString, peer, session, nil] forKeys:[NSArray arrayWithObjects:@"data", @"peer", @"session", nil]]; 
    [dataString release]; 
    [self performSelectorOnMainThread:@selector(receivedData:) withObject:dataDictionary waitUntilDone:YES]; 
} 
- (GKSession *)peerPickerController:(GKPeerPickerController *)picker 
    sessionForConnectionType:(GKPeerPickerConnectionType)type { 
    // Create a new session if one does not already exist 
    if (!self.currentSession) { 
     self.currentSession = [[[GKSession alloc] initWithSessionID:@"Session" displayName:nil sessionMode:GKSessionModePeer] autorelease]; 
     self.currentSession.delegate = self; 
    } 
    return self.currentSession; 
    } 
    -(void)peerPickerController:(GKPeerPickerController *)pk didConnectPeer:(NSString *)peerID toSession:(GKSession *)session { 
    self.currentSession = session; 
    session.delegate = self; 
    [session setDataReceiveHandler:self withContext:nil]; 
    picker.delegate = nil; 
    [picker dismiss]; 
    [picker autorelease]; 
    } 
    -(void)peerPickerControllerDidCancel:(GKPeerPickerController *)pk { 
    picker.delegate = nil; 
    [picker autorelease]; 
    [self.navigationController popViewControllerAnimated:YES]; 
    } 
    // FAIL 
    - (void)session:(GKSession *)session didFailWithError:(NSError *)error { 
    NSLog(@"error : %@", [error description]); 
    } 
    // SESSION VIND ANDERE SESSION -> CONNECT 
    -(void)session:(GKSession *)session peer:(NSString *)peerID didChangeState:(GKPeerConnectionState)state { 
    switch (state) { 
     case GKPeerStateConnected: 
     NSLog(@"connect met peer %@", [currentSession displayNameForPeer:peerID]); 
     [self generateRandomNumberAndSendIt]; 
     break; 
     case GKPeerStateDisconnected: 
     NSLog(@"disconnected"); 
     [self.currentSession disconnectFromAllPeers]; 
     currentSession = nil; 
     [self.navigationController popViewControllerAnimated:YES]; 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Whoopsie" message:@"The connection failed" delegate:nil cancelButtonTitle:@"Okido" otherButtonTitles:nil]; 
     [alert show]; 
     [alert release]; 
     [super viewDidDisappear:YES]; 
     break; 
     } 
    } 

수신 요청을 수락 할 때 피커가 한 장치에서 자체를 제거하고 다른 장치에서 오류 : wait_fences: failed to receive reply: 10004003이 표시되는 경우가 있습니다. 나는 그것이 alertview 자체와 관련이 있다고 생각한다. 나는이 관점에서 다른 alertviews를 설정했다.

여러분이 저를 도울 수 있기를 바랍니다. 사전에

감사합니다.

+0

왜 [super viewDidDisappear : YES];를 부르십니까? –

+0

약간의 실수를했는데 이미 제거했지만 문제를 해결하지 못했습니다. – coderjoe

답변

1

일부 중단 점을 설정하고 코드가 충돌하는 곳을 디버그해야합니다. 코드가 충돌하는 곳을 누군가가 확신 할 수 없기 때문에 코드에서 이상한 점을 지적하면됩니다. 제공 한 코드에 오류가 없을 수도 있습니다.

다른 사람이 언급했듯이 방법이 아닌 [super viewDidDisappear:YES]; 성명을 사용하지 않아야합니다.

또한 디버깅 중이라면 wait_fences: failed to receive reply: 10004003보다 콘솔에 훨씬 유용한 오류 메시지가 있다고 생각합니다. 모든 예외에서 중단 점을 사용하도록 설정했는지 확인하십시오. 그 방법을 모른다면 here are some instructions. 예외를 통해 단계를 밟아 어떤 행이 있는지 파악하고 어떤 오류가 발생하는지 계산합니다.

귀하의 [picker autorelease]; 통화도 조금 이상합니다. 피커를 자동으로 내 보내려는 경우 picker = [[[GKPeerPickerController alloc] init] autorelease];을 수행하십시오. autorelease 문을 GameKit 대리자 메서드에 넣는 것은 이상한 일입니다.

1

UIAlertView 호출을 블록으로 감싸 주 스레드에서 호출하도록하십시오 (예 : 내가 전에 같이 GK를 사용하지 않은 반면

dispatch_async(dispatch_get_main_queue(), ^{ 
    // Show UIAlertView 
} 

는, 나는 (많은 네트워크 기반 라이브러리와 같은) 메인 GUI 스레드가 아닌 다른 스레드에서 콜백을 트리거 할 수있는 것 같아요. 메인 GUI 스레드가 아닌 다른 인터페이스에서 사용자 인터페이스를 제시하거나 조작하는 것은 대부분의 GUI 라이브러리에서 큰 문제가 아니며 코코아도 예외는 아닙니다 (대개의 경우 용서할 만하지만).

관련 문제