Разработка системы достижений Game Center (iOS)
Game Center — встроенная платформа Apple для геймификации: достижения, таблицы рекордов, матчмейкинг. Интеграция достижений занимает меньше дня — при условии правильной настройки в App Store Connect и корректной аутентификации локального игрока.
Настройка и базовая интеграция
В App Store Connect создаём достижения с уникальными идентификаторами вида com.yourapp.achievement.first_win. Каждому задаём иконку 512×512, название, описание и количество очков (1–100). Достижения могут быть разовыми или прогрессивными — прогрессивные имеют maximumPoints, и можно сообщать промежуточный прогресс (50%, 75%, 100%).
Аутентификация локального игрока — обязательный шаг, без него все вызовы Game Center падают с ошибкой:
import GameKit
func authenticatePlayer() {
GKLocalPlayer.local.authenticateHandler = { [weak self] viewController, error in
if let vc = viewController {
// Показываем UI авторизации Game Center
self?.present(vc, animated: true)
} else if GKLocalPlayer.local.isAuthenticated {
// Игрок авторизован, можно репортить достижения
self?.loadAchievements()
} else if let error = error {
// Game Center недоступен (ограничения Screen Time, нет аккаунта)
print("GC auth error: \(error.localizedDescription)")
}
}
}
authenticateHandler нужно выставить один раз при запуске. Повторный вызов с новым обработчиком — это нормально при переходе между сценами. Game Center сам кеширует статус аутентификации.
Репорт достижения:
func reportAchievement(identifier: String, percentComplete: Double = 100.0) {
guard GKLocalPlayer.local.isAuthenticated else { return }
let achievement = GKAchievement(identifier: identifier)
achievement.percentComplete = percentComplete
achievement.showsCompletionBanner = true // нативный баннер Apple
GKAchievement.report([achievement]) { error in
if let error = error {
// Сохранить в очередь для повторной отправки
print("Achievement report failed: \(error)")
}
}
}
showsCompletionBanner = true — показывает системный баннер в стиле Game Center при 100%. Можно отключить и показать собственный UI, но нативный баннер не требует лишней верстки и соответствует ожиданиям пользователей iOS.
Локальное кеширование прогресса
Если GKAchievement.report упал с ошибкой (нет сети, Game Center недоступен) — прогресс теряется. Решение: сохранять незаотправленные достижения локально через UserDefaults или CoreData и повторять отправку при следующем успешном подключении.
// При старте, после авторизации — грузим уже полученные достижения с сервера
func loadAchievements() {
GKAchievement.loadAchievements { achievements, error in
// Синхронизируем с локальным состоянием игры
let earned = Set(achievements?.compactMap { $0.percentComplete >= 100 ? $0.identifier : nil } ?? [])
AchievementManager.shared.syncWithGameCenter(earned: earned)
}
}
Ориентиры по срокам
Настройка App Store Connect + базовая интеграция (аутентификация, репорт, кеш) — 1 день. Прогрессивные достижения с локальным трекингом прогресса — в рамках тех же 2–3 дней при наличии готовой игровой логики.







