Аутентификация с помощью Game Center

Вы можете использовать Game Center для авторизации игроков в играх для платформ Apple, созданных на базе Firebase. Чтобы использовать вход через Game Center с Firebase, сначала убедитесь, что локальный игрок авторизован в Game Center, а затем используйте объект GameCenterAuthProvider для генерации учетных данных Firebase, которые вы можете использовать для аутентификации в Firebase.

Прежде чем начать

Используйте Swift Package Manager для установки и управления зависимостями Firebase.

  1. В Xcode, открыв проект приложения, перейдите в меню File > Add Packages .
  2. При появлении запроса добавьте репозиторий Firebase Apple Platforms SDK:
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. Выберите библиотеку Firebase Authentication .
  5. Добавьте флаг -ObjC в раздел «Другие флаги компоновщика» в настройках сборки вашей целевой системы.
  6. После завершения Xcode автоматически начнет разрешение и загрузку ваших зависимостей в фоновом режиме.

Далее выполните несколько шагов по настройке:

  1. Обязательно зарегистрируйте свое приложение Apple в Firebase. Это означает, что в разделе регистрации нужно указать идентификатор пакета вашего приложения, а также дополнительную необязательную информацию, такую ​​как идентификатор App Store и идентификатор команды и т. д. Это потребуется для безопасной проверки целевой аудитории учетных данных Game Center перед завершением входа в систему.
  2. Включите Game Center в качестве сервиса авторизации для вашего проекта Firebase:
    1. В консоли Firebase откройте раздел «Аутентификация» .
    2. На вкладке «Способ входа» включите поставщика авторизации Game Center .

Интегрируйте вход в Game Center в свою игру.

Во-первых, если ваша игра еще не использует Game Center, следуйте инструкциям в разделах «Интеграция Game Center в вашу игру» и «Аутентификация локального игрока на устройстве» на сайте разработчиков Apple.

Убедитесь, что идентификатор пакета, который вы указываете в iTunes Connect, совпадает с идентификатором пакета, который вы использовали при подключении вашего приложения к проекту Firebase.

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

Быстрый

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:) :

Быстрый

// 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 :

Быстрый

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() :

Быстрый

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;
}