11

我正在创建一个带有GKTurnBasedMatch比赛的游戏中心游戏。我遇到了一个问题,a 上的readonly matchData属性GKTurnBasedMatch似乎没有正确存储在 Game Center 服务器上。

我正在使用这个 StackOverflow 答案在 上生成一个 md5 校验和matchData NSData,无论是在发送到游戏中心服务器还是从游戏中心服务器接收时。

当我使用实例方法发送时,我注意到我的NSData游戏数据对象的校验和。matchDataGKTurnBasedMatchendTurnWithNextParticipants:turnTimeout:matchData:completionHandler:

然后对手使用GKTurnBasedMatch的类方法检索匹配项loadMatchesWithCompletionHandler:,当匹配项到达时(没有错误),我再次记录校验和。

两个校验和不匹配,基于重构的游戏,结果数据显然不完全相同。我已经检查了两个帐户,matchID我的对象上的属性GKTurnBasedMatch是相同的。

我还进行了以下测试:

NSLog(@"matchID: %@ matchData checksum: %@",
                    match.matchID, 
                    [Utilities md5StringFromData:match.matchData]);

// match is a valid `GKTurnBasedMatch` object.
[match endTurnWithNextParticipants: @[ opponent ] // My `GKTurnBasedParticipant` opponent
                       turnTimeout:600
                         matchData:data // This is a valid NSData object
                 completionHandler:^(NSError *error) {
                      if (nil != error) {

                          NSLog(@"%@", error);

                      } else {

NSLog(@"Successfully ended turn.");

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

    if (nil != error) {

        NSLog(@"Error getting matches: %@", [error localizedDescription]);

    } else {

        for (GKTurnBasedMatch *match in matches) {

            NSLog(@"matchID: %@ matchData checksum: %@", 
                        match.matchID, 
                        [Utilities md5StringFromData:match.matchData]);

        }

    }
}];

                      }
}];

在这个示例中,我以数据结束回合并立即从 Game Center 检索匹配,即数据匹配。但是,当我matchData从对手的 Game Center 帐户和设备访问时,它们会有所不同。

有人遇到过这样的事情吗?

4

1 回答 1

11

我在Apple 的 Dev Forums上发现了解决方案。

事实证明,loadMatchesWithCompletionHandler:并不总是抓住最新的matchData. 为确保您拥有最新版本,请确保在对象上调用该loadMatchDataWithCompletionHandler:方法。GKTurnBasedMatch

于 2013-02-06T19:27:11.423 回答