GKTurnBasedEventHandler委托没有收到任何消息

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

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

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

我听说过,GameCenter Sandbox可能在提交通知时不太可靠……但我真的不能冒这个风险。 我需要测试我的代码!

我尝试过的事情:

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

更新这个问题很有趣: 沙盒游戏中心转动事件通知 [[GKLocalPlayer localPlayer] registerListener:self]它导致我尝试使用[[GKLocalPlayer localPlayer] registerListener:self]而不是GKTurnBasedEventHandler委托方法。 不幸的是,问题仍然没有解决。 我甚至尝试使用设置为7.0的最低版本SDK进行编译(因为这是一个7+function添加)。

我目前的信念是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 

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

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

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