使用遊戲中心進行驗證

您可以使用 Game Center,讓玩家登入以 Firebase 建構的 Apple 平台遊戲。如要使用 Game Center 登入功能與 Firebase,請先確認本機玩家已透過 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.git
  4. 選擇 Firebase Authentication 程式庫。
  5. -ObjC 標記新增至目標的建構設定「Other Linker Flags」部分。
  6. 完成後,Xcode 就會自動開始在背景中解析並下載依附元件。

接下來,請執行一些設定步驟:

  1. 請務必透過 Firebase 註冊 Apple 應用程式。也就是說,您必須在註冊部分輸入應用程式的套件 ID,以及其他選用資訊 (例如 App Store ID 和 Team ID 等)。這項步驟是為了在完成登入程序前,安全驗證使用者 Game Center 憑證的目標對象。
  2. 將 Game Center 設為 Firebase 專案的登入服務供應器:
    1. Firebase 主控台中,開啟「驗證」部分。
    2. 在「Sign in method」分頁中,啟用「Game Center」登入供應器。

將遊戲中心登入功能整合至遊戲

首先,如果您的遊戲尚未使用 Game Center,請按照 Apple 開發人員網站上的將 Game Center 整合至遊戲在裝置上驗證本機玩家的操作說明操作。

請確認您向 iTunes Connect 提供的套件 ID 與將應用程式連結至 Firebase 專案時使用的套件 ID 相符。

在 Game Center 整合作業中,您會定義驗證處理常式,並在 Game Center 驗證程序的多個位置呼叫該常式。在這個處理程序中,檢查玩家是否已登入 Game Center。如果是,您可以繼續登入 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
  }
};

使用 Firebase 進行驗證

確認本機玩家已透過 Game Center 登入後,請使用 GameCenterAuthProvider.getCredential() 建立 AuthCredential 物件,然後將該物件傳遞至 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.
    }];
  }
}];

後續步驟

使用者首次登入後,系統會建立新使用者帳戶,並連結至他們的 Game Center ID。這個新帳戶會儲存在 Firebase 專案中,可用於在專案中的每個應用程式中識別使用者。

在遊戲中,您可以從 User 物件取得使用者的 Firebase UID:

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

在 Firebase 即時資料庫和 Cloud Storage 安全性規則中,您可以從 auth 變數取得已登入使用者的專屬使用者 ID,並利用該 ID 控管使用者可存取的資料。

如要取得使用者的 Game Center 玩家資訊,或存取 Game Center 服務,請使用 Game Kit 提供的 API。

如要讓使用者登出 Firebase,請呼叫 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;
}