Надежный игровой центр Код достижения - PullRequest
4 голосов
/ 28 августа 2011

Примерно в каждом примере отправки достижений в Game Center я вижу этот код

[achievement reportAchievementWithCompletionHandler:^(NSError *error)
{
    if (error != nil)
    {
         // Retain the achievement object and try again later (not shown).
    }
}];

Проблема в том, что один небольшой комментарий составляет около 99% работы.Я провел последние несколько часов, пытаясь выяснить это, и, похоже, это бесконечный набор крайних случаев отправки, повторной отправки, сохранения и загрузки данных.

Кто-нибудь знает хороший учебник (или примеркод) на этом, что на самом деле объясняет сложную часть?

Это не так просто, как просто сохранить их в файл и загрузить их позже.У вас возникают проблемы, когда вы начинаете сохранять несколько достижений и отправлять их позже, а затем все они возвращаются с ошибками (в блоках!), И вам приходится сохранять их снова ... быстро / безопасно ... потому что приложение может выйти иты не хочешь их потерять.

Я вырываю свои волосы.

1 Ответ

6 голосов
/ 31 марта 2012

Не думаю, что вам нужно вырывать волосы.

Я думаю, что базовая модель такова:

(a) Независимо от Game Center, ваша игра имеет сохраненное состояние (которое вам всегда нужно в любом случае, чтобы вернуть игрока туда, где он находился, когда ваша игра выходит из игры). Это состояние должно включать все обычные вещи, необходимые для восстановления игрового состояния, а также флаги всех достижений в вашей игре.

(b) Game Center также хранит все достижения в вашей игре. При подключении к Game Center вы загружаете достижения зарегистрированного игрока. (Осложнения возникают в отношении , кто является зарегистрированным игроком, но ваш вопрос не об этом, поэтому давайте предположим, что "один настоящий игрок" всегда является зарегистрированным игроком Game Center.)

(c) Каждый раз, когда игрок делает достижение, сначала обновите соответствующий флаг достижения в сохраненных данных состояния вашей игры. Во-вторых, попробуйте рассказать Game Center об этом достижении. Если это работает, обновите свою копию достижений игровых центров новыми данными.

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

...