Game Center Sandbox:“无法创建游戏”问题

时间:2012-06-04 10:43:22

标签: ios cocos2d-iphone game-center gamekit

我目前正在使用Game Center开发一款基于回合制的游戏来处理在线功能(用于配对和转弯处理)。

我使用了两个沙盒帐户 - 一个在我的3gs上,另一个在ios模拟器上。 我一直在使用GKTurnBasedMatchMakerViewController测试我的应用程序一段时间没有任何问题进行匹配,但我现在遇到了一个问题:

每次我想邀请其他玩家参加新游戏时(使用其中一个或其他玩家),GKTurnBasedMatchMakerViewController会显示一个UIAlertView,说明:

  

无法创建游戏 - 请删除现有游戏,然后重试。

事实是,我已经删除了每个玩家的所有比赛(他们没有一个比赛在他的名单中(甚至不是一个封闭的比赛)。所以目前没有任何一个用户参与任何比赛。

在我的GKTurnBaseMatchMakerViewControllerDelegate中,未调用 turnBasedMatchmakerViewController:didFailWithError:。 委托中调用的唯一被调用函数 - 当我单击UIAlertView上的OK按钮时 - 是 turnBasedMatchmakerViewControllerWasCancelled:

我唯一能想到的是我的游戏实际上并没有从GameCenter中移除,但是当我使用GKMatchMakerViewController UI删除它们时,我几乎不这么认为。


从基于回合的匹配中退出时,我已经实现了 turnBasedMatchmakerViewController:playerQuitForMatch:,如下所示:

- (void)turnBasedMatchmakerViewController:(GKTurnBasedMatchmakerViewController *)viewController playerQuitForMatch:(GKTurnBasedMatch *)match
{
  if ( [self isLocalPlayerCurrentPlayerForMatch:match] ) {

    NSData* endData = match.matchData;

    for (GKTurnBasedParticipant* participant in match.participants) {
      participant.matchOutcome = GKTurnBasedMatchOutcomeWon;
    }
    match.currentParticipant.matchOutcome = GKTurnBasedMatchOutcomeLost;

    [match endMatchInTurnWithMatchData:endData 
                     completionHandler:^(NSError *error) {
                       if (error) {
                         NSLog(@"%@",error.description);
                       }
                     }];
  }  

}

(注意:我在游戏中只有两个玩家)

其中isLocalPlayerCurrentPlayerForMatch是:

- (BOOL) isLocalPlayerCurrentPlayerForMatch:(GKTurnBasedMatch*)match
{
  return [[[GKLocalPlayer localPlayer] playerID] isEqualToString:match.currentParticipant.playerID];
}

是否有人遇到并找到了解决此问题的方法? 我在这里做错了什么,或者它是如此明显我无法看到它?

非常感谢您提供的任何评论,以帮助我找到问题的根源。

更新

感谢@ kaan-dedeoglu,我设法知道两个用户都有一个空的匹配列​​表(与显示的状态一致)。

我还创建了第三个Sandbox帐户。 命名两个第一个帐户A和B,C为第三个帐户。

州1:

  
      
  1. A和B未与任何比赛相关联。
  2.   
  3. A和B都得到了#34;无法创造游戏"创建任何游戏时出错(A邀请B,A || B邀请其他玩家,A || B创建新的自动匹配)。
  4.   

州2:

  
      
  1. C(工作帐户)可以邀请B并且通常与B一起参加派对。
  2.   
  3. C(工作)可以邀请B参加另一个同时举办的派对
  4.   
  5. C(工作)邀请A来玩。
  6.   
  7. 无法播放(无法访问当前比赛列表,GKTurnBasedMatchMakerViewController会直接创建新游戏)。
  8.   
  9. C不再工作了。
  10.   
  11. A,B和C现在卡在"无法创建游戏"错误。
  12.   

作为补充,这里是我如何初始化我的GKTurnBasedMatchMakerViewController,但我不知道这是错误的。

- (void) displayMatchMakerVC
{

  if (! [[GKLocalPlayer localPlayer] isAuthenticated] ) return;

  GKMatchRequest* request = [[[GKMatchRequest alloc] init] autorelease];
  int nbPlayers = 2;
  request.minPlayers = nbPlayers;
  request.maxPlayers = nbPlayers;


  GKTurnBasedMatchmakerViewController*  matchMakerVC = [[[GKTurnBasedMatchmakerViewController alloc] initWithMatchRequest:request] autorelease];
  matchMakerVC.turnBasedMatchmakerDelegate = self;
  matchMakerVC.showExistingMatches = YES;

  [[CCDirector sharedDirector] presentModalViewController:matchMakerVC animated:YES];
}

注意:我没有使用ARC,这是否与内存问题有关?我不是一个真正的内存管理大师,但似乎对我的理解是正确的。

知道这可能与我的代码有关而不是游戏中心吗? 非常感谢您提供的任何可以帮助我走得更远的答案。

更新2:turnbasedMatchmakerViewController:didFindMatchMethod:

这是我的turnbasedMatchmakerViewController:didFindMatchMethod:方法。

- (void)turnBasedMatchmakerViewController:(GKTurnBasedMatchmakerViewController *)viewController didFindMatch:(GKTurnBasedMatch *)match
{
  BLTheme* theme = [[[BLGameConfig sharedConfig] localPlayer] userTheme];
  GameSceneRemoteGCLoader* loader = [[GameSceneRemoteGCLoader alloc] initWithGKMatch:match andTheme:theme];
  [viewController dismissViewControllerAnimated:NO completion:^{}];
  [[CCDirector sharedDirector] replaceScene:loader];

}

当我发布自动匹配时,它会发出完全相同的错误"无法创建游戏 - 请删除现有游戏并重试。"。

4 个答案:

答案 0 :(得分:1)

只是为了确保:在这两个设备中,在身份验证完成处理程序中添加这些行并运行一次。 (然后你可以评论出来)。

[GKTurnBasedMatch loadMatchesWithCompletionHandler:(^)(NSArray *matches, NSError *error) {

   for (GKTurnbasedMatch *match in matches) {

       [match removeWithCompletionHandler:NULL];

    }
}];

这将确保从您的播放器ID中删除所有游戏。

答案 1 :(得分:1)

这可能是也可能不是您问题的解决方案,但我遇到了类似的问题,并通过以下方式解决了这个问题。

似乎默认情况下,或者不知何故,Game Center将具有不同CFBundleVersion(内部版本号,不是版本号或CFBundleShortVersionString)值的应用视为彼此不兼容,因此不会使用递增的内部版本号显示应用之间的匹配。 (通常,开发人员会在开发期间分发新的临时版本或稳定版本时增加此编号,因此这非常不幸。)

要查找并删除“缺失”游戏,我会减少CFBundleVersion值(显示游戏),然后删除违规游戏。

或者,调整iTunes Connect中的某些设置似乎已删除此CFBundleVersion不兼容性。传播需要一段时间,但我认为点击我的应用程序是什么,点击查看详细信息,确保Game Center开关设置为“已启用”,并确保“多人游戏兼容性”中有一个项目表。您还可以在原始应用程序屏幕的“管理游戏中心”按钮中玩这些可能性,但我认为“多人兼容性”设置最终允许我查看之前隐藏的所有“旧”匹配。

祝你好运!

答案 2 :(得分:0)

太荒谬了。您不必删除现有匹配项来创建新匹配项。我正在开发这样的游戏,它确实有效。

答案 3 :(得分:0)

以下对我有用。首先,我在设备上为每个玩家运行应用程序,调用quitAllMatches。然后我在每台设备上再次运行应用程序,调用removeAllMatches。

从长远来看,你必须更好地清理它们。但这解决了当前的问题。

-(void) quitAllMatches {
    [GKTurnBasedMatch loadMatchesWithCompletionHandler:^(NSArray* matches, NSError* error)  {
        for (GKTurnBasedMatch* match in matches) {
            GKTurnBasedParticipant* participant = match.currentParticipant;
            NSString* playerID = participant.playerID;
            NSString* localPlayerID = [GKLocalPlayer localPlayer].playerID;
            if ([playerID isEqualToString: localPlayerID]) {
                NSArray* participants = match.participants;
                for (GKTurnBasedParticipant* participant in participants) {
                    participant.matchOutcome = GKTurnBasedMatchOutcomeTied;
                }
                NSData* data = [NSData data];
                [match endMatchInTurnWithMatchData: data completionHandler:^(NSError* error) {
                    if (error) {
                        WJLog(@"did not end -- error %@", [error localizedDescription]);
                    }
                    else {
                        WJLog(@"match ended!");
                    }
                }];
            }
        }
    }];
}

-(void) removeAllMatches {
    [GKTurnBasedMatch loadMatchesWithCompletionHandler:^(NSArray* matches, NSError* error)  {
        for (GKTurnBasedMatch* match in matches) {
            [match removeWithCompletionHandler:^(NSError* error) {
                if (error) {
                    WJLog(@"error: %@", [error localizedDescription]);
                }
                else {
                    WJLog(@"removed match");
                }
            }];
        }
    }];
}