endMatchInTurnWithMatchData导致“与名为com.apple.gamed的服务的连接被中断”

时间:2016-07-19 20:19:18

标签: xcode game-center gkturnbasedmatch

我对endMatchInTurnWithMatchData的调用导致与服务中断错误的连接。什么寻找诊断这个问题的提示? Xcode 7.3.1,部署目标9.3

-(void)sendGameOver {
    GKTurnBasedMatch *currentMatch = [[GameKitHelper sharedGameKitHelper] currentMatch];

    // set the game outcome property for the current participant
    GKTurnBasedMatchOutcome otherOutcome;
    if (self.youAre == game.winningPlayer) {
        [currentMatch.currentParticipant setMatchOutcome:GKTurnBasedMatchOutcomeWon];
        otherOutcome = GKTurnBasedMatchOutcomeLost;
    } else {
        [currentMatch.currentParticipant setMatchOutcome:GKTurnBasedMatchOutcomeLost];
        otherOutcome = GKTurnBasedMatchOutcomeWon;
    }

    // all other (only one other) participants get opposite outcome
    for (GKTurnBasedParticipant *nextParticipant in currentMatch.participants) {
        if (![nextParticipant isEqual:currentMatch.currentParticipant]) {
            [nextParticipant setMatchOutcome:otherOutcome];
        }
    }

    // prepare match data
    NSDictionary *turn = [NSDictionary dictionaryWithObjects:@[game]
                                                 forKeys:@[gameKey]];
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:turn];

    NSArray *achievements = [self achievementsToReport:currentMatch];
    NSArray *scores = [self scoresToReport:currentMatch];

    [currentMatch endMatchInTurnWithMatchData:data scores:scores achievements:achievements completionHandler:^(NSError * _Nullable error) {
        if (error) {
            NSLog(@"%@", error);
            [self setGamePopUpMessage:@"Oops, there was a problem.  Try that again."];
        }
    }];

}

2 个答案:

答案 0 :(得分:0)

不知何故,这个问题似乎在成就的报道中。如果我为成就发送一个空数组,则错误消失。但是一旦我尝试使用endMatch传递成就信息,错误就会恢复。

所以我继续收到错误"连接到名为com.apple.gamed的服务被中断"如果我使用

endMatchInTurnWithMatchData: scores: achievements: completionHandler:

但是,如果我使用(作为解决方法)

endMatchInTurnWithMatchData: completionHandler:

紧接着是:

GKAchievement reportAchievements: withCompletionHandler:

然后一切似乎都正常。

答案 1 :(得分:0)

最初的问题是我在自己创建了一系列成就,在所有情况下都使用GKAchievement initWithIdentifire,即使是之前比赛中已经为玩家报告的成就。正确的方法是首先调用loadAchievementsWithCompletionHandler来获取播放器已知的所有成就,然后更新相关的成就。如果需要,可以向该阵列添加新的GKAchievement。但关键是要正确初始化数组。一旦我修复了所有这些,我就能够使用endMatchInTurnWithMatchData正确发送成就数组:得分:成就:completionHandler:并且不再接收我的原始错误“名为com.apple.gamed的连接服务被中断”。

...无论其

我的游戏是一个双人游戏,有人可能被迫转弯(或意外转弯),导致他们立即失败。在那种情况下,我希望增加对手(刚刚获胜)的成就。然而,看起来你不能增加对手的成就,因为你无法知道他们之前的成就水平。

我的解决方案,这是不理想的,是在轮到他们输掉游戏的玩家报告他们可能获得的任何成就(目前不是任何成就,但你永远不会知道......)。获胜的玩家将在收到“matchEnded”消息时报告他们的成就。不幸的是,这意味着如果他们从未打开游戏,他们就不会增加他们的成就。不理想。