С помощью Game Center можно входить в игры для платформ Apple, созданные на основе Firebase. Чтобы использовать вход через Game Center с Firebase, сначала убедитесь, что локальный игрок вошел в Game Center, а затем используйте объект GameCenterAuthProvider, чтобы создать учетные данные Firebase, которые можно использовать для аутентификации в Firebase.
Подготовка
Для установки зависимостей Firebase и управления ими используйте Swift Package Manager.
- Откройте проект приложения в Xcode и перейдите в меню File (Файл) > Add Packages (Добавить пакеты).
- Когда появится запрос, добавьте хранилище Firebase SDK для платформ Apple:
- Выберите библиотеку Firebase Authentication.
- Добавьте флаг
-ObjCв раздел Other Linker Flags (Другие флаги компоновщика) в настройках сборки целевого объекта. - После этого Xcode автоматически начнет распознавать и скачивать зависимости в фоновом режиме.
https://github.com/firebase/firebase-ios-sdk.git
Затем выполните настройку:
- Зарегистрируйте приложение Apple в Firebase. Это означает, что в разделе регистрации нужно указать идентификатор пакета приложения и дополнительную информацию, например идентификатор App Store и идентификатор команды. Это необходимо для безопасной проверки аудитории учетных данных Game Center пользователя перед завершением входа.
- Включите Game Center в качестве поставщика учетных данных для проекта Firebase:
- В консоли Firebase выберите Безопасность > Аутентификация.
- На вкладке Способ входа включите поставщика для входа через Game Center.
Как интегрировать вход через Game Center в игру
Если ваша игра ещё не поддерживает Game Center, следуйте инструкциям в статьях Incorporating Game Center into Your Game и Authenticating a Local Player on the Device на сайте для разработчиков Apple.
Убедитесь, что идентификатор пакета, указанный в iTunes Connect, совпадает с идентификатором, который вы использовали при подключении приложения к проекту Firebase.
В рамках интеграции с Game Center вы определяете обработчик аутентификации, который вызывается в нескольких точках процесса аутентификации Game Center. В этом обработчике проверьте, вошел ли игрок в Game Center. Если да, вы можете продолжить вход в Firebase.
Swift
let localPlayer = GKLocalPlayer.localPlayer() localPlayer.authenticateHandler = { (gcAuthViewController?, error) in if let gcAuthViewController = gcAuthViewController { // Pause any activities that require user interaction, then present the // gcAuthViewController to the player. } else if localPlayer.isAuthenticated { // Player is signed in to Game Center. Get Firebase credentials from the // player's Game Center credentials (see below). } else { // Error } }
Objective-C
__weak GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer]; localPlayer.authenticateHandler = ^(UIViewController *gcAuthViewController, NSError *error) { if (gcAuthViewController != nil) { // Pause any activities that require user interaction, then present the // gcAuthViewController to the player. } else if (localPlayer.isAuthenticated) { // Player is signed in to Game Center. Get Firebase credentials from the // player's Game Center credentials (see below). } else { // Error } };
Как пройти аутентификацию с помощью Firebase
После того как вы определите, что местный игрок вошел в аккаунт Game Center, войдите в игру, создав объект AuthCredential с GameCenterAuthProvider.getCredential() и передав этот объект в signIn(with:):
Swift
// Get Firebase credentials from the player's Game Center credentials GameCenterAuthProvider.getCredential() { (credential, error) in if let error = error { return } // The credential can be used to sign in, or re-auth, or link or unlink. Auth.auth().signIn(with:credential) { (user, error) in if let error = error { return } // Player is signed in! }
Objective-C
// Get Firebase credentials from the player's Game Center credentials [FIRGameCenterAuthProvider getCredentialWithCompletion:^(FIRAuthCredential *credential, NSError *error) { // The credential can be used to sign in, or re-auth, or link or unlink. if (error == nil) { [[FIRAuth auth] signInWithCredential:credential completion:^(FIRUser *user, NSError *error) { // If error is nil, player is signed in. }]; } }];
Дальнейшие действия
После первого входа пользователя создается новый аккаунт и связывается с его идентификатором Game Center. Новый аккаунт хранится в проекте Firebase и позволяет идентифицировать пользователя во всех приложениях проекта.
В игре можно получить UID пользователя Firebase из объекта User:
Swift
let user = Auth.auth().currentUser if let user = user { let playerName = user.displayName // The user's ID, unique to the Firebase project. // Do NOT use this value to authenticate with your backend server, // if you have one. Use getToken(with:) instead. let uid = user.uid }
Objective-C
FIRUser *user = [FIRAuth auth].currentUser; if (user) { NSString *playerName = user.displayName; // The user's ID, unique to the Firebase project. // Do NOT use this value to authenticate with your backend server, // if you have one. Use getTokenWithCompletion:completion: instead. NSString *uid = user.uid; }
В правилах безопасности для базы данных Firebase Realtime Database и Cloud Storage можно получить уникальный идентификатор вошедшего в аккаунт пользователя из переменной auth и использовать его, чтобы контролировать доступ пользователя к данным.
Чтобы получить информацию об игроке Game Center или доступ к сервисам Game Center, используйте API, предоставляемые Game Kit.
Чтобы выйти из аккаунта Firebase, вызовите Auth.signOut():
Swift
let firebaseAuth = Auth.auth() do { try firebaseAuth.signOut() } catch let signOutError as NSError { print ("Error signing out: %@", signOutError) }
Objective-C
NSError *signOutError; BOOL status = [[FIRAuth auth] signOut:&signOutError]; if (!status) { NSLog(@"Error signing out: %@", signOutError); return; }