Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

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

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

Прежде чем вы начнете

  1. Добавить Firebase в свой проект IOS .

  2. Обязательно включите в свой Podfile следующий модуль:

    pod 'Firebase/Auth'
    

    Убедитесь, что вы зарегистрировали свое приложение iOS в Firebase. Это означает ввод идентификатора пакета вашего приложения в разделе регистрации iOS вместе с дополнительной необязательной информацией, такой как идентификатор App Store, идентификатор команды и т. Д. Это потребуется для безопасной проверки аудитории учетных данных пользователя Game Center перед завершением входа в систему.

  3. Если вы еще не подключили приложение к вашему проекту Firebase, сделать это из консоли Firebase .

  4. Включите 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
  }
}

Цель-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:) в 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!
  }

Цель-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 и может использоваться для идентификации пользователя в каждом приложении в вашем проекте.

В вашей игре, вы можете получить пользователь Firebase UID от 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
}

Цель-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 Cloud правил безопасности хранения, вы можете получить подписанный в уникальном пользователя идентификатор пользователя из 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)
}

Цель-C

NSError *signOutError;
BOOL status = [[FIRAuth auth] signOut:&signOutError];
if (!status) {
  NSLog(@"Error signing out: %@", signOutError);
  return;
}