Uwierzytelnij przez Game Center

Za pomocą Game Center możesz logować graczy na platformach Apple w grach opartych na Firebase. Aby użyć logowania się w Game Center w Firebase, najpierw sprawdź, czy lokalny gracz jest zalogowany w Game Center, a potem użyj obiektu GameCenterAuthProvider, aby wygenerować dane logowania Firebase, których możesz użyć do uwierzytelnienia w Firebase.

Zanim zaczniesz

Do instalacji zależności Firebase i zarządzania nimi możesz używać menedżera pakietów Swift.

  1. Po otwarciu projektu aplikacji w Xcode wybierz Plik > Dodaj pakiety.
  2. Gdy pojawi się prośba, dodaj repozytorium pakietu SDK Firebase na platformy Apple:
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. Wybierz bibliotekę Firebase Authentication.
  5. Dodaj flagę -ObjC do sekcji Inne flagi linkera w ustawieniach kompilacji docelowej.
  6. Gdy to zrobisz, Xcode automatycznie zacznie wyszukiwać i pobierać zależności w tle.
.

Następnie wykonaj czynności konfiguracyjne:

  1. Upewnij się, że zarejestrowałeś aplikację Apple w Firebase. Oznacza to, że w sekcji rejestracji należy wpisać identyfikator pakietu aplikacji wraz z dodatkowymi opcjonalnymi informacjami, takimi jak identyfikator App Store czy identyfikator zespołu. Będzie to wymagane do bezpiecznej weryfikacji odbiorców danych logowania Game Center użytkownika przed zakończeniem procesu logowania.
  2. Aby włączyć Game Center jako dostawcę logowania w projekcie Firebase:
    1. W konsoli Firebase otwórz sekcję Uwierzytelnianie.
    2. Na karcie Metoda logowania włącz dostawcę logowania Game Center.

Integrowanie logowania przez Game Center z grą

Jeśli Twoja gra nie korzysta jeszcze z Centrum Gier, postępuj zgodnie z instrukcjami podanymi w artykule Integracja Centrum Gier z grąUwierzytelnianie lokalnego gracza na urządzeniu na stronie dla deweloperów Apple.

Upewnij się, że identyfikator pakietu podany w iTunes Connect jest taki sam jak identyfikator pakietu użyty podczas łączenia aplikacji z projektem Firebase.

W ramach integracji z Game Center definiujesz moduł uwierzytelniania, który jest wywoływany w różnych punktach procesu uwierzytelniania w Game Center. W tym obsłudze sprawdź, czy gracz jest zalogowany w Game Center. Jeśli tak, możesz nadal logować się w 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
  }
};

Uwierzytelnienie za pomocą Firebase

Po ustaleniu, że lokalny gracz zalogował się za pomocą Game Center, zaloguj go w grze, tworząc obiekt AuthCredential za pomocą funkcji GameCenterAuthProvider.getCredential() i przekazując go do funkcji 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.
    }];
  }
}];

Dalsze kroki

Gdy użytkownik zaloguje się po raz pierwszy, zostanie utworzone nowe konto użytkownika i połączone z jego identyfikatorem Game Center. To nowe konto jest przechowywane w ramach projektu Firebase i może służyć do identyfikowania użytkownika we wszystkich aplikacjach w tym projekcie.

W grze możesz uzyskać identyfikator Firebase użytkownika z obiektu 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;
}

W regułach bezpieczeństwa Firebase Realtime Database i Cloud Storage możesz pobrać z zmiennej auth niepowtarzalny identyfikator zalogowanego użytkownika i użyć go do kontrolowania, do których danych ma on dostęp.

Aby uzyskać informacje o użytkowniku w Game Center lub uzyskać dostęp do usług Game Center, użyj interfejsów API udostępnionych przez Game Kit.

Aby wylogować użytkownika z Firebase, wywołaj funkcję 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;
}