我使用过[[GKTurnBasedEventHandler sharedTurnBasedEventHandler] setDelegate:self];
,但我没有收到委托电话。这在某一点上起作用,我无法弄清楚我的生活发生了什么变化。
应用程序已正确标记(在设备主屏幕上,它会显示一个徽章,其中包含轮到我的游戏数量)。此外,使用GKTurnBasedMatch loadMatchesWithCompletionHandler:
能够检测玩家何时轮到(或不)。事实上,在其他任何可以想象的方式中,GameCenter似乎都运行得很好。我甚至可以发送(并接受)挑战,但同样不会调用委托方法:没有调用GKTurnBasedEventHandlerDelegate
方法(包括handleTurnEventForMatch:
,handleInviteFromGameCenter:
等)。
它甚至更奇怪:如果我完全退出应用程序并轮到我,我看不到任何GameCenter通知。但是,我 DO 在我的应用上打上徽章!如果我只是打开GameCenter应用程序本身,我也看到轮到我了。因此,即使数据在服务器上正确更新,即使没有收到操作系统级别的通知......
我听说过,GameCenter Sandbox可能只是通知传递不可靠......但我真的不能冒这个风险。我需要测试我的代码!
我尝试过的事情:
NSAssert([GKTurnBasedEventHandler sharedTurnBasedEventHandler].delegate == self
以确保代理属性不会丢失(根据此问题:handleTurnEventForMatch:didBecomeActive: callbacks only arriving some of the time)version
是否与CFBundleShortVersionString
(info.plist
)中的0.0.1
完全相同,并且iTunesConnect将游戏中心显示为“已启用”。我甚至还将CFBundleVersion
设置为相同的值,只是为了确保没有混淆的可能性。1.0.0
和1.0
以及0.1
等。我还将它们打印出{{{ 1}}以确保将它们正确复制到应用程序中。NSLog
下载的显式配置文件,并且该XCode在developer.apple.com
中的所有GameCenter步骤旁边显示了复选标记。 (例如,我不使用“团队”;我已登录配置文件中心并创建了一个开发配置文件,下载了它,并在Build Settings中明确将其设置为我的Capabilities
调试模式)。 更新
这个问题很有意思:Sandbox Game Center Turn Event Notifications Not Consistent
这导致我尝试使用Provisioning Profile
而不是[[GKLocalPlayer localPlayer] registerListener:self]
委托方法。不幸的是,问题仍然没有解决。我甚至尝试使用设置为GKTurnBasedEventHandler
的SDK的最低版本进行编译(因为这是一个7+以上的功能添加)。
答案 0 :(得分:1)
我目前的信念是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
答案 1 :(得分:1)
我也有同样的问题。我大约有25%的时间收到通知,我无法正确测试应用程序。
根据文档,在iOS7上不推荐使用GKTurnBasedEventHandler。如果这是真的 - 这可能是造成这些问题的原因吗?