Melakukan Autentikasi Menggunakan Game Center

Anda dapat menggunakan Game Center untuk memproses login pemain ke game platform Apple yang di-build di Firebase. Untuk menggunakan login Game Center dengan Firebase, pertama-tama pastikan bahwa pemain lokal login dengan Game Center, lalu gunakan objek GameCenterAuthProvider untuk menghasilkan kredensial Firebase, yang dapat Anda gunakan untuk melakukan autentikasi dengan Firebase.

Sebelum memulai

Gunakan Swift Package Manager untuk menginstal dan mengelola dependensi Firebase.

  1. Di Xcode, dengan project aplikasi Anda dalam keadaan terbuka, buka File > Add Packages.
  2. Saat diminta, tambahkan repositori SDK platform Apple Firebase:
  3.   https://github.com/firebase/firebase-ios-sdk
  4. Pilih library Firebase Authentication.
  5. Setelah selesai, Xcode akan otomatis mulai me-resolve dan mendownload dependensi Anda di latar belakang.

Selanjutnya, lakukan beberapa langkah konfigurasi:

  1. Pastikan aplikasi Apple Anda didaftarkan menggunakan Firebase. Artinya, Anda harus memasukkan ID paket aplikasi di bagian pendaftaran beserta informasi opsional lainnya, misalnya ID App Store dan ID Tim, dll. Ini dibutuhkan untuk memverifikasi audiens dari kredensial Game Center pengguna sebelum menyelesaikan proses login.
  2. Aktifkan Game Center sebagai penyedia login untuk project Firebase Anda:
    1. Di Firebase console, buka bagian Authentication.
    2. Pada tab Metode Login, aktifkan penyedia login Game Center.

Integrasikan login Game Center ke game Anda

Pertama-tama, jika game Anda belum menggunakan Game Center, ikuti petunjuk dalam Menyertakan Game Center ke dalam Game Anda dan Mengautentikasi Pemain Lokal di Perangkat pada situs developer Apple.

Pastikan ID paket yang Anda berikan ke iTunes Connect cocok dengan ID paket yang Anda gunakan saat menghubungkan aplikasi ke project Firebase.

Sebagai bagian dari integrasi Game Center, Anda menetapkan pengendali autentikasi yang dipanggil di beberapa titik selama proses autentikasi Game Center. Dalam pengendali ini, periksa apakah pemain login dengan Game Center. Jika sudah, Anda dapat melanjutkan login ke 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
  }
};

Melakukan autentikasi dengan Firebase

Setelah Anda memastikan bahwa pemain lokal telah login dengan Game Center, proses login pemain ke dalam game Anda dengan membuat objek AuthCredential dengan GameCenterAuthProvider.getCredential() dan meneruskan objek tersebut ke 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.
    }];
  }
}];

Langkah berikutnya

Setelah pengguna login untuk pertama kalinya, akun pengguna baru akan dibuat dan terhubung ke ID Game Center miliknya. Akun baru ini disimpan sebagai bagian dari project Firebase Anda, dan dapat digunakan untuk mengidentifikasi pengguna di setiap aplikasi dalam project Anda.

Di game, Anda bisa mendapatkan UID Firebase pengguna dari objek 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;
}

Di Aturan Keamanan Firebase Realtime Database dan Cloud Storage, Anda bisa mendapatkan ID pengguna unik yang login dari variabel auth, dan menggunakannya untuk mengontrol data yang dapat diakses oleh pengguna.

Untuk mendapatkan informasi pemain Game Center milik pengguna atau mengakses layanan Game Center, gunakan API yang disediakan oleh Game Kit.

Agar pengguna logout dari Firebase, panggil 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;
}