【问题标题】:Gamekit API error when accepting incoming request接受传入请求时出现 Gamekit API 错误
【发布时间】:2012-07-10 15:49:37
【问题描述】:

我做了一个蓝牙模式的iPhone游戏,你可以通过蓝牙玩1对1。我对选择器的实现如下:

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。我认为这与警报视图本身有关。我在此视图中设置了其他警报视图。

希望你们能帮帮我。

提前致谢。

【问题讨论】:

  • 你为什么打电话给[super viewDidDisappear:YES];
  • 我犯了一个小错误,我已经删除了它,但它并没有解决问题。

标签: iphone xcode ipad gamekit gkpeerpickercontroller


【解决方案1】:

您需要设置一些断点并调试代码崩溃的位置,任何人都无法确定您的代码崩溃的位置,我们能做的最好的就是通过指出代码中的异常来猜测。该错误甚至可能不在您提供的代码中。

正如其他人提到的,您绝对不应该在非viewDidAppear: 方法中使用声明[super viewDidDisappear:YES];。

我还猜测,如果您正在调试,那么控制台中的错误消息会比 wait_fences: failed to receive reply: 10004003 更有帮助。确保您已对所有异常启用断点。如果你不知道怎么做,here are some instructions。逐步检查异常,找出它在哪一行,并找出抛出了什么错误。

你的[picker autorelease]; 电话也有点奇怪。如果您想自动释放选择器,只需执行picker = [[[GKPeerPickerController alloc] init] autorelease];。将 autorelease 语句放在 GameKit 委托方法中很奇怪。

【讨论】:

    【解决方案2】:

    尝试将您的 UIAlertView 调用包装在块中以在主线程上调用,例如

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

    虽然我以前没有像这样使用过 GK,但我猜它(就像许多基于网络的库一样)可以触发来自除主 GUI 线程之外的其他线程的回调。在大多数 GUI 库中,从主 GUI 线程之外呈现甚至操作用户界面是一个很大的禁忌,Cocoa 也不例外(尽管它通常令人惊讶地宽容)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-13
      • 2021-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      相关资源
      最近更新 更多