GKTurnBasedEventHandler委托没有收到任何消息

时间:2014-01-03 15:17:00

标签: ios objective-c xcode game-center

我使用过[[GKTurnBasedEventHandler sharedTurnBasedEventHandler] setDelegate:self];,但我没有收到委托电话。这在某一点上起作用,我无法弄清楚我的生活发生了什么变化。

应用程序已正确标记(在设备主屏幕上,它会显示一个徽章,其中包含轮到我的游戏数量)。此外,使用GKTurnBasedMatch loadMatchesWithCompletionHandler:能够检测玩家何时轮到(或不)。事实上,在其他任何可以想象的方式中,GameCenter似乎都运行得很好。我甚至可以发送(并接受)挑战,但同样不会调用委托方法:没有调用GKTurnBasedEventHandlerDelegate方法(包括handleTurnEventForMatch:handleInviteFromGameCenter:等)。

它甚至更奇怪:如果我完全退出应用程序并轮到我,我看不到任何GameCenter通知。但是,我 DO 在我的应用上打上徽章!如果我只是打开GameCenter应用程序本身,我也看到轮到我了。因此,即使数据在服务器上正确更新,即使没有收到操作系统级别的通知......

我听说过,GameCenter Sandbox可能只是通知传递不可靠......但我真的不能冒这个风险。我需要测试我的代码!

我尝试过的事情:

  1. 确保我在真实设备上测试(没有模拟器)。我已经在4种真实设备上进行了测试,包括iPhone + iPad和iOS6 + iOS7。
  2. 我每隔60秒执行一次NSAssert([GKTurnBasedEventHandler sharedTurnBasedEventHandler].delegate == self以确保代理属性不会丢失(根据此问题:handleTurnEventForMatch:didBecomeActive: callbacks only arriving some of the time
  3. 仔细检查我是否在设置
  4. 中为应用启用了推送通知
  5. 检查iTunesConnect version是否与CFBundleShortVersionStringinfo.plist)中的0.0.1完全相同,并且iTunesConnect将游戏中心显示为“已启用”。我甚至还将CFBundleVersion设置为相同的值,只是为了确保没有混淆的可能性。
  6. 在第3步中使用版本#s。我将它们分别设置为1.0.01.0以及0.1等。我还将它们打印出{{{ 1}}以确保将它们正确复制到应用程序中。
  7. 检查我是否使用从NSLog下载的显式配置文件,并且该XCode在developer.apple.com中的所有GameCenter步骤旁边显示了复选标记。 (例如,我使用“团队”;我已登录配置文件中心并创建了一个开发配置文件,下载了它,并在Build Settings中明确将其设置为我的Capabilities调试模式)。
  8. 明确请求推送通知权限。我能够成功检索(并使用)令牌,因此APN服务似乎没有问题。
  9. 我也试过......等等。我将调试器连接到设备轮到它了。在转弯结束10分钟后,没有任何代表被击中(我正在使用断点来确定这一点)。

  10. 更新 这个问题很有意思:Sandbox Game Center Turn Event Notifications Not Consistent 这导致我尝试使用Provisioning Profile而不是[[GKLocalPlayer localPlayer] registerListener:self]委托方法。不幸的是,问题仍然没有解决。我甚至尝试使用设置为GKTurnBasedEventHandler的SDK的最低版本进行编译(因为这是一个7+以上的功能添加)。

2 个答案:

答案 0 :(得分:1)

我目前的信念是GameCenter Sandbox有问题,因为好像很多人都遇到过问题。为了能够测试我的代码,我实际上编写了一些代码来轮询GameCenter并寻找变化。

警告这是DUMB。我只在DEBUG模式启用它,只是为了让我可以测试我的handleTurnEventForMatch代码。那说......它解决了这个问题。

此代码可以进入提供委托方法的同一个类。你需要做一些明显的逻辑修改。您应该从游戏逻辑中的适当位置调用onMultiplayerGameStartedonEndedMultiplayerTurn

#if GAMEKIT_TURN_POLLING

NSMutableDictionary *_wasLocalPlayersTurnMap = nil;

- (void)pollGameCenter {
  if(!_wasLocalPlayersTurnMap) {
    _wasLocalPlayersTurnMap = [NSMutableDictionary new];
  }
  [AMGameData loadGames:^(NSArray *games) {
    NSInteger validGameCount = 0;
    for(AMGameData *gameData in games) {
      if(gameData.isSinglePlayer) {
        continue;
      }
      if(gameData.gameState != AMGameStatePlaying) {
        continue;
      }
      validGameCount++;
      if([_wasLocalPlayersTurnMap[gameData.name] boolValue]) {
        continue;
      }
      if(!gameData.isLocalPlayersTurn) {
        _wasLocalPlayersTurnMap[gameData.name] = @(NO);
        continue;
      }
      // Hey, it's now our turn!
      _wasLocalPlayersTurnMap[gameData.name] = @(YES);
      [self handleTurnEventForMatch:gameData.match didBecomeActive:NO];
    }
    if(validGameCount) {
      // Need to do this again later...
      [self delayedPollGameCenter];
    }
  }];
}

- (void)delayedPollGameCenter {
  [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(pollGameCenter) object:nil];
  [self performSelector:@selector(pollGameCenter) withObject:nil afterDelay:10];
}

- (void)onMultiplayerGameStarted {
  [self delayedPollGameCenter];
}

- (void)onEndedMultiplayerTurn:(AMGameData*)gameData {
  _wasLocalPlayersTurnMap[gameData.name] = @(NO);
  [self delayedPollGameCenter];
}

#else
- (void)onMultiplayerGameStarted{}
- (void)onEndedMultiplayerTurn:(AMGameData*)gameData {}
#endif

答案 1 :(得分:1)

我也有同样的问题。我大约有25%的时间收到通知,我无法正确测试应用程序。

根据文档,在iOS7上不推荐使用GKTurnBasedEventHandler。如果这是真的 - 这可能是造成这些问题的原因吗?

https://developer.apple.com/library/ios/documentation/GameKit/Reference/GKTurnBasedEventHandler_Ref/Reference/Reference.html