ตรวจสอบสิทธิ์โดยใช้ Game Center

คุณใช้ Game Center เพื่อลงชื่อเข้าใช้เกมบนแพลตฟอร์ม Apple ที่สร้างขึ้นบน Firebase ได้ หากต้องการใช้ฟีเจอร์ลงชื่อเข้าใช้ด้วย Game Center กับ Firebase ก่อนอื่นให้ตรวจสอบว่าผู้เล่นในเครื่องลงชื่อเข้าใช้ด้วย Game Center แล้ว จากนั้นใช้ออบเจ็กต์ GameCenterAuthProvider เพื่อสร้างข้อมูลเข้าสู่ระบบ Firebase ซึ่งคุณจะใช้ตรวจสอบสิทธิ์กับ Firebase ได้

ก่อนเริ่มต้น

ใช้ Swift Package Manager เพื่อติดตั้งและจัดการทรัพยากร Dependency ของ Firebase

  1. เปิดโปรเจ็กต์แอปใน Xcode แล้วไปที่ไฟล์ > เพิ่มแพ็กเกจ
  2. เมื่อได้รับข้อความแจ้ง ให้เพิ่มที่เก็บ Firebase SDK สําหรับแพลตฟอร์ม Apple ดังนี้
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. เลือกคลัง Firebase Authentication
  5. เพิ่ม Flag -ObjC ลงในส่วน Other Linker Flags ของการตั้งค่าบิลด์เป้าหมาย
  6. เมื่อเสร็จแล้ว Xcode จะเริ่มจับคู่ข้อมูลและดาวน์โหลดทรัพยากร Dependency ในเบื้องหลังโดยอัตโนมัติ

ถัดไป ให้ทำตามขั้นตอนการกําหนดค่าต่อไปนี้

  1. ตรวจสอบว่าคุณได้ลงทะเบียนแอป Apple กับ Firebase แล้ว ซึ่งหมายความว่าคุณต้องป้อนรหัสกลุ่มของแอปในส่วนการลงทะเบียนพร้อมกับข้อมูลอื่นๆ ที่ไม่บังคับ เช่น รหัส App Store และรหัสทีม เป็นต้น ข้อมูลนี้จำเป็นสำหรับการยืนยันกลุ่มเป้าหมายของข้อมูลเข้าสู่ระบบ Game Center ของผู้ใช้อย่างปลอดภัยก่อนที่จะลงชื่อเข้าใช้ให้เสร็จสมบูรณ์
  2. เปิดใช้ Game Center เป็นผู้ให้บริการลงชื่อเข้าใช้สำหรับโปรเจ็กต์ Firebase โดยทำดังนี้
    1. ในคอนโซล Firebase ให้เปิดส่วนการตรวจสอบสิทธิ์
    2. ในแท็บวิธีการลงชื่อเข้าใช้ ให้เปิดใช้ผู้ให้บริการลงชื่อเข้าใช้ Game Center

ผสานรวมการลงชื่อเข้าใช้ Game Center เข้ากับเกม

ก่อนอื่น หากเกมของคุณยังไม่ได้ใช้ Game Center ให้ทำตามวิธีการในหัวข้อการผสานรวม Game Center เข้ากับเกม และการตรวจสอบสิทธิ์ผู้เล่นในเครื่องในเว็บไซต์ของนักพัฒนาแอป Apple

ตรวจสอบว่ารหัสกลุ่มที่คุณให้ iTunes Connect ตรงกับรหัสกลุ่มที่คุณใช้เมื่อเชื่อมต่อแอปกับโปรเจ็กต์ Firebase

ในการผสานรวมกับ 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 แล้ว ให้ลงชื่อเข้าใช้เกมของผู้เล่นโดยสร้างออบเจ็กต์ AuthCredential ด้วย GameCenterAuthProvider.getCredential() และส่งออบเจ็กต์นั้นไปยัง 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 ของผู้ใช้ ระบบจะจัดเก็บบัญชีใหม่นี้เป็นส่วนหนึ่งของโปรเจ็กต์ Firebase และใช้เพื่อระบุผู้ใช้ในแอปทุกแอปในโปรเจ็กต์ได้

ในเกม คุณสามารถรับ Firebase UID ของผู้ใช้ได้จากออบเจ็กต์ 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;
}

ในกฎความปลอดภัยของฐานข้อมูลเรียลไทม์ของ Firebase และ Cloud Storage คุณสามารถรับรหัสผู้ใช้ที่ไม่ซ้ำกันของผู้ใช้ที่ลงชื่อเข้าใช้จากตัวแปร auth และใช้เพื่อควบคุมข้อมูลต่างๆ ที่ผู้ใช้เข้าถึงได้

หากต้องการดูข้อมูลผู้เล่น Game Center ของผู้ใช้หรือเข้าถึงบริการของ Game Center ให้ใช้ API ที่ Game Kit มีให้

หากต้องการออกจากระบบ 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;
}