Розробка системи досягнень 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 днів при наявності готової ігрової логіки.







