您可以使用 Game Center,讓玩家登入以 Firebase 建構的 Apple 平台遊戲。如要使用 Game Center 登入功能與 Firebase,請先確認本機玩家已透過 Game Center 登入,然後使用 GameCenterAuthProvider
物件產生 Firebase 憑證,以便透過 Firebase 進行驗證。
事前準備
使用 Swift Package Manager 安裝及管理 Firebase 依附元件。
- 在 Xcode 中保持開啟應用程式專案,然後依序點選「File」>「Add Packages」。
- 系統提示時,請新增 Firebase Apple 平台 SDK 存放區:
- 選擇 Firebase Authentication 程式庫。
- 將
-ObjC
標記新增至目標的建構設定「Other Linker Flags」部分。 - 完成後,Xcode 就會自動開始在背景中解析並下載依附元件。
https://github.com/firebase/firebase-ios-sdk.git
接下來,請執行一些設定步驟:
- 請務必透過 Firebase 註冊 Apple 應用程式。也就是說,您必須在註冊部分輸入應用程式的套件 ID,以及其他選用資訊 (例如 App Store ID 和 Team ID 等)。這項步驟是為了在完成登入程序前,安全驗證使用者 Game Center 憑證的目標對象。
- 將 Game Center 設為 Firebase 專案的登入服務供應器:
- 在 Firebase 主控台中,開啟「驗證」部分。
- 在「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; }