Проблемы Game Center GKTurnBasedMatch со свойством matchData

Я создаю игру Game Center с GKTurnBasedMatch совпадениями. У меня возникла проблема, когда свойство readonly matchData на GKTurnBasedMatch не сохраняется должным образом на серверах Game Center.

Я использую этот ответ StackOverflow для создания контрольной суммы md5 на matchData NSData как при отправке, так и при получении и от сервера Game Center.

Я записываю контрольную сумму моего объекта игровых данных NSData, когда отправляю matchData с помощью метода экземпляра GKTurnBasedMatch endTurnWithNextParticipants:turnTimeout:matchData:completionHandler:.

Затем противник извлекает совпадения, используя метод класса loadMatchesWithCompletionHandler: GKTurnBasedMatch, и когда совпадения приходят (без ошибок), я снова записываю контрольную сумму.

Две контрольные суммы не совпадают, и полученные данные явно не идентичны на основе реконструированной игры. Я проверил в двух учетных записях, что свойство 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 противника, они различаются.

Кто-нибудь сталкивался с подобным?


person Tim Arnold    schedule 06.02.2013    source источник


Ответы (1)


Я нашел решение на форумах разработчиков Apple.

Оказывается, loadMatchesWithCompletionHandler: не всегда берет самую последнюю версию matchData. Чтобы убедиться, что у вас самая последняя версия, обязательно вызовите метод loadMatchDataWithCompletionHandler: для вашего объекта GKTurnBasedMatch.

person Tim Arnold    schedule 06.02.2013
comment
Вы хоть представляете, что стоит за этой реализацией? - person Paul Hunter; 13.04.2013
comment
Я предполагаю, что причина в том, что они хотели бы минимизировать сетевые запросы и обеспечить оптимальное кэширование, но, чувак, это сводило меня с ума, пока я не нашел решение. - person Tim Arnold; 15.04.2013
comment
Мне кажется, что кеширование сломано. Даже в документации нет уведомления о том, что игровые объекты могут быть неактуальны. Я тоже с ума сходил по этому поводу. - person Paul Hunter; 16.04.2013
comment
В документах явно не упоминаются эти возможные устаревшие объекты, но если вы ищете эти методы в Руководстве по программированию Game Center, кажется немного вероятным, что то, что они написали, соответствует тому, как это работает. Но да, я с вами, надо было уточнить. - person Tim Arnold; 16.04.2013
comment
привет, Когда я получу значение Take Turn. значения предыдущего совпадения перекрываются текущим совпадением. как я могу это решить. - person Vineesh TP; 14.06.2013
comment
Винеш ТП: Я не уверен, что понял твой вопрос! - person Tim Arnold; 19.06.2013