GKTurnBasedEventHandler委托没有收到任何消息
我用[[GKTurnBasedEventHandler sharedTurnBasedEventHandler] setDelegate:self];
但我没有收到代表电话。 这在某一点上起作用,我无法弄清楚我的生活发生了什么变化。
该应用程序已正确标记(在设备主屏幕上,它会显示一个徽章,其中包含轮到我的游戏数量)。 此外,使用GKTurnBasedMatch loadMatchesWithCompletionHandler:
能够检测到玩家是否轮到(或不回合)。 实际上,在其他任何可以想象的方式中,GameCenter似乎都运行得很好。 我甚至可以发送(并接受)挑战,但是再次调用委托方法:没有调用GKTurnBasedEventHandlerDelegate
方法(包括handleTurnEventForMatch:
, handleInviteFromGameCenter:
等)
它甚至更奇怪:如果我完全退出应用程序并轮到我,我看不到任何GameCenter通知。 但是,我在我的应用程序上做了徽章! 如果我只是打开GameCenter应用程序本身,我也看到轮到我了。 因此,即使数据在服务器上正确更新,即使没有收到操作系统级别的通知……
我听说过,GameCenter Sandbox可能在提交通知时不太可靠……但我真的不能冒这个风险。 我需要测试我的代码!
我尝试过的事情:
- 确保我在真实设备上测试(没有模拟器)。 我已经在4个真实设备上进行了测试,包括iPhone + iPad和iOS6 + iOS7。
- 我每隔60秒做一次
NSAssert([GKTurnBasedEventHandler sharedTurnBasedEventHandler].delegate == self
以确保委托属性不会丢失(根据这个问题: handleTurnEventForMatch:didBecomeActive:回调只在某些时候到达 ) - 仔细检查我是否在“设置”中为应用启用了推送通知
- 检查iTunesConnect
version
是否与info.plist
(0.0.1
)中的CFBundleShortVersionString
完全相同,并且iTunesConnect将GameCenter显示为游戏“已启用”。 我甚至还将CFBundleVersion
设置为相同的值,只是为了确保没有混淆的可能性。 - 在步骤3中使用版本#s。我将它们分别设置为
1.0.0
和1.0
和0.1
等。我还使用NSLog
将它们打印出来以确保它们被正确地复制到应用程序中。 - 检查我是否使用了从
developer.apple.com
下载的显式配置文件,并且XCode在Capabilities
所有GameCenter步骤旁边显示了复选标记。 (例如,我没有使用“团队”;我已登录到配置文件中心并创建了一个开发配置文件,下载了它,并在Build Settings for Debug模式下将其显式设置为我的Provisioning Profile
)。 - 明确请求推送通知权限。 我能够成功检索(并使用)令牌,因此APN服务似乎没有问题。
- 我也试过……等待。 我将调试器连接到设备轮到它了。 在转弯结束10分钟后,没有任何代表被击中(我正在使用断点来确定这一点)。
更新这个问题很有趣: 沙盒游戏中心转动事件通知 [[GKLocalPlayer localPlayer] registerListener:self]
它导致我尝试使用[[GKLocalPlayer localPlayer] registerListener:self]
而不是GKTurnBasedEventHandler
委托方法。 不幸的是,问题仍然没有解决。 我甚至尝试使用设置为7.0
的最低版本SDK进行编译(因为这是一个7+function添加)。
我目前的信念是GameCenter Sandbox有问题,因为好像很多人都有问题。 为了能够测试我的代码,我实际上编写了一些代码来轮询GameCenter并寻找变化。
警告这是DUMB。 我只在DEBUG
模式下启用它,只是为了我可以测试我的handleTurnEventForMatch
代码。 那说……它解决了这个问题。
此代码可以进入提供委托方法的同一个类。 你需要做一些明显的逻辑修改。 您应该在游戏逻辑的适当位置调用onMultiplayerGameStarted
和onEndedMultiplayerTurn
。
#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。 如果这是真的 – 这可能是造成这些问题的原因吗?