المصادقة باستخدام "مركز الألعاب"

يمكنك استخدام Game Center لتسجيل دخول اللاعبين إلى لعبة على منصات Apple تم إنشاؤها باستخدام Firebase. لاستخدام ميزة "تسجيل الدخول باستخدام حساب Game Center" مع Firebase، تأكَّد أولاً من تسجيل دخول اللاعب المحلي باستخدام Game Center، ثم استخدِم العنصر GameCenterAuthProvider لإنشاء بيانات اعتماد Firebase، والتي يمكنك استخدامها لمصادقة حسابك على Firebase.

قبل البدء

استخدِم أداة Swift Package Manager لتثبيت تبعيات Firebase وإدارتها.

  1. في Xcode، مع فتح مشروع تطبيقك، انتقِل إلى ملف > إضافة حِزم.
  2. أضِف مستودع حزمة تطوير البرامج (SDK) لمنصّات Apple من Firebase عندما يُطلب منك ذلك:
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. اختَر مكتبة Firebase Authentication.
  5. أضِف العلامة -ObjC إلى قسم رموز ربط أخرى في إعدادات الإنشاء الخاصة بالهدف.
  6. عند الانتهاء، سيبدأ Xcode تلقائيًا في حلّ ملفاتك المضمّنة وتنزيلها في الخلفية.

بعد ذلك، عليك تنفيذ بعض خطوات الضبط:

  1. تأكَّد من تسجيل تطبيقك على Apple باستخدام Firebase. ويعني ذلك إدخال معرّف حِزمة تطبيقك في قسم التسجيل مع معلومات إضافية اختيارية مثل معرّف App Store ومعرّف الفريق وما إلى ذلك. وسيكون ذلك مطلوبًا لتأكيد هوية جمهور بيانات اعتماد المستخدم في Game Center بشكل آمن قبل إكمال عملية تسجيل الدخول.
  2. فعِّل Game Center كمقدّم خدمة تسجيل الدخول لمشروعك على Firebase:
    1. في وحدة تحكّم Firebase، افتح قسم المصادقة.
    2. في علامة التبويب طريقة تسجيل الدخول، فعِّل موفِّر تسجيل الدخول Game Center.

دمج ميزة تسجيل الدخول إلى Game Center في لعبتك

أولاً، إذا لم تكن لعبتك تستخدم Game Center، اتّبِع التعليمات الواردة في مقالتَي دمج Game Center في لعبتك ومصادقة لاعب على الجهاز على موقع Apple Developer الإلكتروني.

تأكَّد من أنّ معرّف الحِزمة الذي تقدّمه إلى 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 للمستخدم من عنصر 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 في الوقت الفعلي" و"مساحة تخزين السحابة الإلكترونية"، يمكنك الحصول على معرّف المستخدم الفريد للمستخدم الذي سجّل الدخول من المتغيّر auth واستخدامه للتحكّم في البيانات التي يمكن للمستخدم الوصول إليها.

للحصول على معلومات لاعب Game Center الخاصة بالمستخدم أو للوصول إلى خدمات Game Center، استخدِم واجهات برمجة التطبيقات التي تقدّمها 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;
}