возможностью социального взаимодействия ✤ Компоненты GameKit: ✤ Game Center – централизованный сетевой сервис (iOS 4.1) ✤ P2P-соединения – поиск и передача данных между устройствами через Wi-Fi или Bluetooth (iOS 3.0) ✤ Голосовое общение – простой API для голосового общения (iOS 3.0)
ко всей социальной информации ✤ Сервис для хранения, передачи, обработки социальных данных и установки сетевых P2P-соединений ✤ Фреймворк, предоставляющий API для доступа к социальным и сетевым функциям
механизм для авторизации пользователей, прозрачный для конечного приложения ✤ Таблицы результатов (leaderboards) – публикация рейтинга пользователей ✤ Достижения (achievements) – публикация достижений в игре с поддержкой скрытых достижений и прогресса по конкретным достижениям
игроков для сетевой игры (с поддержкой работы через серверы Game Center или собственные) ✤ Приглашения на сетевую игру позволяют приглашать друзей поиграть, при этом уведомление проходит через механизм APSN, приложение не обязательно должно быть запущено для получения приглашения ✤ P2P-соединения – API, который предоставляет возможность передавать данные между участниками созданной сетевой игры
требуют авторизированного локального пользователя. Если пользователь не авторизирован (или Game Center недоступен) – отключайте доступ к функциям Game Center. ✤ Приложение должно использовать стек UIViewController (Game Center требует отображения своих контроллеров модально) ✤ Большинство API работает асинхронно через блоки ✤ При проблеме с сетью во время отправки данных сохраняйте их для повторной отправки позже ✤ При проблеме с сетью во время получения данных Game Center может вернуть закешированные данные (вместе с кодом ошибки)
в iTunes Connect ✤ У приложения должен быть указан правильный Bundle ID ✤ Если приложение не может работать без Game Center – необходимо указать это в зависимостях приложения (UIRequiredDeviceCapabilities) ✤ Если приложение может работать частично без Game Center – необходимо использовать слабую линковку и проверять наличие классов Game Center на устройстве и версию iOS >=4.1
при наличии аккаунта в iOS Developer Program, независимо от того, тестируется оно на симуляторе, или устройстве Сборка Целевая аудитория Окружение Game Center Симулятор Разработчик Песочница Устройство (Debug) Разработчик Песочница Устройство (Ad-Hoc) Тестер Песочница Устройство (AppStore) Пользователи Основные серверы
Game Center ✤ Данные таблиц результатов и достижений автоматически сохраняются для текущего пользователя ✤ У каждого пользователя свой уникальный список друзей ✤ Пользователь идентифицируется по playerID и alias: ✤ playerID – уникальная строка, определяющая пользователя ✤ alias – псевдоним пользователя, подходящий для отображения
*error) { ! ! if(!error) { ! ! ! // обработка данных пользователя ! ! } else { ! ! ! // сообщение об ошибке, блокирование доступа к Game Center ! ! } ! }]; } ✤ Авторизация должна быть выполнена как можно раньше (в didFinishLaunchingWithOptions:) ✤ В случае недоступности локального пользователя любой доступ к функциям Game Center должен быть заблокирован
время жизни приложения (используя функции многозадачности iOS) ✤ В таком случае необходимо заблокировать доступ к Game Center и предложить повторную авторизацию [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(authenticationChanged) name:GKPlayerAuthenticationDidChangeNotificationName object:nil]; ... - (void)authenticationChanged { ! if([GKLocalPlayer localPlayer].isAuthenticated) { ! ! // локальный пользователь потенциально изменился } else { ! ! // локальный пользователь недоступен ! } }
*players, NSError *error) { ! ! if(!error) { ! ! ! // обработка массива объектов GKPlayer ! ! } else { ! ! ! // обработка ошибки ! ! } ! }]; } Список друзей ✤ Для получений объектов GKPlayer на базе списка идентификаторов необходимо выполнить еще один запрос
критерию (набранные очки, заработанные деньги и т.д.) ✤ Параметры таблиц: ✤ Единицы измерения ✤ Порядок сортировки (по возрастанию или убыванию) ✤ Форматирование значений ✤ Вывод в общей таблице, или отдельные таблицы в зависимости от режима игры
alloc] initWithCategory:category] autorelease]; ! scoreReporter.value = score; ! [scoreReporter reportScoreWithCompletionHandler:^(NSError *error) { ! ! if(error) { ! ! ! // сохранение scoreReporter для повторной попытки ! ! } ! }]; } Отправка результата ✤ Результат сохраняется в объекте класса GKScore как значение int64_t (64-битное целое со знаком) ✤ В случае проблемы при отправке, объект GKScore должен быть сохранен (например с помощью протокола NSCoding) для повторной попытки отправки позднее
стандартный контроллер GKLeaderboardViewController ✤ Настраиваемые свойства: ✤ category – идентификатор категории (заданный в iTunes Connect) ✤ timeScope – период отображения результатов (за день, неделю, все время)
отобразить собственный интерфейс для таблицы результатов, Game Center API предоставляет возможность получения массива объектов GKScore по заданным критериям: ✤ playerScope – все игроки или только друзья ✤ range – диапазон возвращаемых объектов ✤ category и timeScope – аналогично, как и для стандартного контроллера ✤ Также, можно сделать запрос по конкретным идентификаторам игроков с помощью метода initWithPlayerIDs:
*titles, NSError *error) { ! ! if(error) { ! ! ! // обработка ошибки ! ! } ! ! if(categories) { ! ! ! // обработка ID категорий и их заголовков ! ! } ! }]; } Получение данных из таблиц результатов ✤ Не используйте свой код форматирования вместо score.formattedValue, иначе данные будут выглядеть по-разному в приложении и в Game Center ✤ Для использования данных локализации необходимо получать данные из iTunes Connect
режимов игры на разных уровнях сложности ✤ Параметры достижений: ✤ Название достижения ✤ Описание, отображаемое пока достижение не получено ✤ Описание, отображаемое когда достижение получено ✤ Изображение (отображается только у полученых достижений) ✤ «Стоимость» достижения (до 1000 баллов на приложение) ✤ Изначальное отображение достижения
до 100.0 ✤ Если достижение было создано как скрытое по умолчанию – оно отображается (даже при изменении состояния в 0.0) ✤ Понизить состояние нельзя ✤ При достижении значения 100.0 достижение отмечается как полученное
[[[GKAchievement alloc] initWithIdentifier:identifier] autorelease]; ! if(achievement) { ! ! achievement.percentComplete = percent; ! ! [achievement reportAchievementWithCompletionHandler:^(NSError *error) { ! ! ! if(error) { ! ! ! ! // сохранение achievement для повторной попытки ! ! ! } ! ! }]; ! } } Обновление состояния достижения ✤ Аналогично как и с GKScore, при проблемах с сетью объект GKAchievement необходимо сохранить и отправить еще раз позже
! ! if(error) { ! ! ! // обработка ошибки ! ! } ! ! if(achievements) { ! ! ! // обработка списка достижений ! ! } ! }]; } Обновление состояния достижения ✤ Обновлять таким образом необходимо только новые достижения, список текущих достижений необходимо получить как можно раньше (сразу после авторизации)
if(error) { ! ! ! // обработка ошибки ! ! } ! }]; } Сброс списка достижений ✤ При необходимости, список достижений можно сбросить ✤ Все скрытые по умолчанию достижения снова станут скрытыми
функции для передачи данных по надежному и по быстрому каналам ✤ Рекомендуемые размеры пакетов: ✤ До 87Кб при использовании надежного транспорта ✤ До 1000Кб при использовании ненадежного транспорта