使用 Game Center 進行身份驗證

您可以使用 Game Center 讓玩家登錄基於 Firebase 構建的 Apple 平台遊戲。要通過 Firebase 使用 Game Center 登錄,首先確保本地玩家使用 Game Center 登錄,然後使用GameCenterAuthProvider對像生成 Firebase 憑據,您可以使用該憑據通過 Firebase 進行身份驗證。

在你開始之前

使用 Swift Package Manager 安裝和管理 Firebase 依賴項。

  1. 在 Xcode 中,打開您的應用項目,導航到File > Add Packages
  2. 出現提示時,添加 Firebase Apple 平台 SDK 存儲庫:
  3.   https://github.com/firebase/firebase-ios-sdk
  4. 選擇 Firebase 身份驗證庫。
  5. 完成後,Xcode 將在後台自動開始解析和下載您的依賴項。

接下來,執行一些配置步驟:

  1. 確保您在 Firebase 中註冊了您的 Apple 應用。這意味著在註冊部分輸入您應用的捆綁包 ID,以及其他可選信息,例如 App Store ID 和團隊 ID 等。這是在完成登錄之前安全地驗證用戶的 Game Center 憑據的觀眾所必需的。
  2. 啟用 Game Center 作為 Firebase 項目的登錄提供程序:
    1. Firebase 控制台中,打開身份驗證部分。
    2. 登錄方法選項卡上,啟用Game Center登錄提供程序。

將 Game Center 登錄功能集成到您的遊戲中

首先,如果您的遊戲尚未使用 Game Center,請按照 Apple 開發者網站上將Game Center 整合到您的遊戲在設備上驗證本地玩家中的說明進行操作。

確保您提供給 iTunes Connect 的包 ID 與您在將應用連接到 Firebase 項目時使用的包 ID 匹配。

作為 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 登錄後,通過使用GameCenterAuthProvider.getCredential()創建一個AuthCredential對象並將該對像傳遞給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 ID。這個新帳戶存儲為 Firebase 項目的一部分,可用於在項目中的每個應用中識別用戶。

在您的遊戲中,您可以從User對像中獲取用戶的 Firebase UID:

迅速

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 實時數據庫和雲存儲安全規則中,您可以從auth變量中獲取登錄用戶的唯一用戶 ID,並使用它來控制用戶可以訪問哪些數據。

要獲取用戶的 Game Center 玩家信息或訪問 Game Center 服務,請使用Game Kit提供的 API。

要讓用戶退出 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;
}