Не думаю, что вам нужно вырывать волосы.
Я думаю, что базовая модель такова:
(a) Независимо от Game Center, ваша игра имеет сохраненное состояние (которое вам всегда нужно в любом случае, чтобы вернуть игрока туда, где он находился, когда ваша игра выходит из игры). Это состояние должно включать все обычные вещи, необходимые для восстановления игрового состояния, а также флаги всех достижений в вашей игре.
(b) Game Center также хранит все достижения в вашей игре. При подключении к Game Center вы загружаете достижения зарегистрированного игрока. (Осложнения возникают в отношении , кто является зарегистрированным игроком, но ваш вопрос не об этом, поэтому давайте предположим, что "один настоящий игрок" всегда является зарегистрированным игроком Game Center.)
(c) Каждый раз, когда игрок делает достижение, сначала обновите соответствующий флаг достижения в сохраненных данных состояния вашей игры. Во-вторых, попробуйте рассказать Game Center об этом достижении. Если это работает, обновите свою копию достижений игровых центров новыми данными.
(d) Если это не работает, у вас есть достижение, отмеченное в вашем постоянном состоянии, которое не отмечено в вашей копии состояния Game Center. В разное удобное время (например, всякий раз, когда зарабатывается другое достижение, когда вы заканчиваете уровень, когда ваше приложение запускается, когда вы закрываете приложение и т. Д.), Проверяйте, есть ли какие-либо расхождения между тем, что находится в вашем собственном состоянии, и тем, что находится в Игровой центр гос. Расхождение - это обновление, которое нужно повторно отправить в Game Center. Попробуйте отправить, но если это не удастся снова, просто подождите до следующей возможности (например, при получении другого достижения, при завершении уровня, при запуске приложения, при выходе из приложения и т. Д.), Чтобы повторить попытку. Вы никогда не потеряете данные, потому что они соответствуют вашей локальной истинной картине состояния пользователя. (Единственный способ потерять его - это если пользователь удалит ваше приложение до того, как вы сможете успешно загрузить его в Game Center, но что тогда вы можете сделать?)