Autenticarsi utilizzando Game Center

Puoi utilizzare Game Center per far accedere i giocatori a un gioco per piattaforme Apple basato su Firebase. Per utilizzare l'accesso a Game Center con Firebase, assicurati innanzitutto che il giocatore locale abbia effettuato l'accesso con Game Center, quindi utilizza l'oggetto GameCenterAuthProvider per generare una credenziale Firebase, che puoi utilizzare per l'autenticazione con Firebase.

Prima di iniziare

Utilizza Swift Package Manager per installare e gestire le dipendenze di Firebase.

  1. In Xcode, con il progetto dell'app aperto, vai a File > Add Packages .
  2. Quando richiesto, aggiungi il repository SDK delle piattaforme Apple Firebase:
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. Scegli la libreria di autenticazione Firebase.
  5. Aggiungi il flag -ObjC alla sezione Altri flag del linker delle impostazioni di build del tuo target.
  6. Al termine, Xcode inizierà automaticamente a risolvere e scaricare le tue dipendenze in background.

Successivamente, esegui alcuni passaggi di configurazione:

  1. Assicurati di registrare la tua app Apple con Firebase. Ciò significa inserire l'ID del pacchetto della tua app nella sezione di registrazione insieme a ulteriori informazioni facoltative come l'ID dell'App Store e l'ID del team, ecc. Ciò sarà necessario per verificare in modo sicuro il pubblico delle credenziali Game Center dell'utente prima di completare l'accesso.
  2. Abilita Game Center come provider di accesso per il tuo progetto Firebase:
    1. Nella console Firebase , apri la sezione Autenticazione .
    2. Nella scheda Metodo di accesso , abilita il provider di accesso Game Center .

Integra l'accesso a Game Center nel tuo gioco

Innanzitutto, se il tuo gioco non utilizza già Game Center, segui le istruzioni in Incorporare Game Center nel tuo gioco e autenticare un giocatore locale sul dispositivo sul sito degli sviluppatori Apple.

Assicurati che l'ID pacchetto fornito a iTunes Connect corrisponda all'ID pacchetto utilizzato quando hai collegato l'app al progetto Firebase.

Nell'ambito dell'integrazione con Game Center, definisci un gestore di autenticazione che viene chiamato in più punti del processo di autenticazione di Game Center. In questo gestore, controlla se il giocatore ha effettuato l'accesso con Game Center. In tal caso, puoi continuare ad accedere a Firebase.

Veloce

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

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

Autenticarsi con Firebase

Dopo aver determinato che il giocatore locale ha effettuato l'accesso con Game Center, accedi al giocatore al tuo gioco creando un oggetto AuthCredential con GameCenterAuthProvider.getCredential() e passando l'oggetto a signIn(with:) :

Veloce

// 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!
  }

Obiettivo-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.
    }];
  }
}];

Prossimi passi

Dopo che un utente accede per la prima volta, viene creato un nuovo account utente e collegato al suo ID Game Center. Questo nuovo account viene archiviato come parte del tuo progetto Firebase e può essere utilizzato per identificare un utente in ogni app del tuo progetto.

Nel tuo gioco, puoi ottenere l'UID Firebase dell'utente dall'oggetto User :

Veloce

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
}

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

Nel tuo Firebase Realtime Database e nelle regole di sicurezza Cloud Storage, puoi ottenere l'ID utente univoco dell'utente che ha effettuato l'accesso dalla variabile auth e utilizzarlo per controllare a quali dati può accedere un utente.

Per ottenere informazioni sui giocatori di Game Center di un utente o per accedere ai servizi Game Center, utilizza le API fornite da Game Kit .

Per disconnettere un utente da Firebase, chiama Auth.signOut() :

Veloce

let firebaseAuth = Auth.auth()
do {
  try firebaseAuth.signOut()
} catch let signOutError as NSError {
  print ("Error signing out: %@", signOutError)
}

Obiettivo-C

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