Какой смысл звонить ...
GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
Насколько я могу судить, это всегда возвращает объект, если все поля будут установлены в ноль, независимо от начала текущего игрока в системе. Пока не позвонишь ...
[localPlayer authenticateWithCompletionHandler:^(NSError *error)
... что вы получаете игрока. Является ли этот вызов только для получения объекта, чтобы затем вызвать authenticateWithCompletionHandler: from?
Можно ли предположить, что при первом же вызове у него никогда не будет действительной информации об игроке? Я предполагал, что в нем есть информация об игроке, зарегистрированном в Game Center на устройстве, но это не так (это было бы слишком удобно).
Что должна делать игра во время ожидания действительного идентификатора игрока? При плохой связи игроки могли выполнить достижения и даже получить счет. Я знаю, что вы должны сохранять информацию до тех пор, пока не будет установлено соединение, но без идентификатора игрока я не могу сохранить ее с тегом для конкретного игрока, как вы это сделали бы во время простого сбоя при отправке счета.
В приведенном выше примере игрок A запускает игру, получает счет и выходит из игры до того, как он когда-либо будет аутентифицирован. Затем игрок B входит в систему и начинает игру и получает счет от игрока A.
Если я сохраню последний идентификатор игрока и просто воспользуюсь им, вы попадете в ситуацию, когда игрок В начинает игру после игрока А, и все результаты переходят к игроку А или теряются для игрока А, когда игрок Б. начинает игру.
Или не стоит беспокоиться о подобных вещах, потому что вероятность <1% когда-либо случится? </p>
Или я просто упускаю простое решение для всего этого?
Game Center - это полный беспорядок. Apple могла бы гораздо лучше справиться с этим API.