با استفاده از Game Center احراز هویت

شما می‌توانید از Game Center برای ورود بازیکنان به یک بازی پلتفرم اپل که روی Firebase ساخته شده است، استفاده کنید. برای استفاده از قابلیت ورود به Game Center با Firebase، ابتدا مطمئن شوید که بازیکن محلی با Game Center وارد سیستم شده است و سپس از شیء GameCenterAuthProvider برای تولید یک اعتبارنامه Firebase استفاده کنید که می‌توانید از آن برای تأیید اعتبار با Firebase استفاده کنید.

قبل از اینکه شروع کنی

برای نصب و مدیریت وابستگی‌های Firebase از Swift Package Manager استفاده کنید.

  1. در Xcode، با باز کردن پروژه برنامه خود، به File > Add Packages بروید.
  2. وقتی از شما خواسته شد، مخزن SDK پلتفرم‌های اپل فایربیس را اضافه کنید:
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. کتابخانه Firebase Authentication را انتخاب کنید.
  5. پرچم -ObjC را به بخش Other Linker Flags در تنظیمات ساخت هدف خود اضافه کنید.
  6. پس از اتمام، Xcode به طور خودکار شروع به حل و دانلود وابستگی‌های شما در پس‌زمینه می‌کند.

در مرحله بعد، برخی از مراحل پیکربندی را انجام دهید:

  1. مطمئن شوید که برنامه اپل خود را در Firebase ثبت می‌کنید. این به معنی وارد کردن شناسه بسته برنامه شما در بخش ثبت نام به همراه اطلاعات اختیاری اضافی مانند شناسه فروشگاه برنامه و شناسه تیم و غیره است. این برای تأیید ایمن مخاطبان اعتبارنامه مرکز بازی کاربر قبل از تکمیل ورود به سیستم لازم است.
  2. مرکز بازی را به عنوان ارائه دهنده ورود به سیستم برای پروژه Firebase خود فعال کنید:
    1. در کنسول Firebase ، بخش Authentication (احراز هویت) را باز کنید.
    2. در برگه «روش ورود» ، ارائه‌دهنده ورود به سیستم Game Center را فعال کنید.

ورود به سیستم مرکز بازی را در بازی خود ادغام کنید

اول، اگر بازی شما از قبل از Game Center استفاده نمی‌کند، دستورالعمل‌های موجود در بخش «گنجاندن Game Center در بازی شما» و «احراز هویت یک پخش‌کننده محلی در دستگاه» را در سایت توسعه‌دهندگان اپل دنبال کنید.

مطمئن شوید که شناسه بسته‌ای که به iTunes Connect ارائه می‌دهید با شناسه بسته‌ای که هنگام اتصال برنامه خود به پروژه Firebase خود استفاده کرده‌اید، مطابقت داشته باشد.

به عنوان بخشی از یکپارچه‌سازی مرکز بازی (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
  }
}

هدف-سی

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

احراز هویت با فایربیس

بعد از اینکه مطمئن شدید بازیکن محلی با Game Center وارد سیستم شده است، با ایجاد یک شیء AuthCredential با GameCenterAuthProvider.getCredential() و ارسال آن شیء به 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!
  }

هدف-سی

// 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 شما ذخیره می‌شود و می‌تواند برای شناسایی کاربر در هر برنامه‌ای در پروژه شما استفاده شود.

در بازی خود، می‌توانید UID فایربیس کاربر را از شیء User دریافت کنید:

سویفت

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
}

هدف-سی

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 Realtime، می‌توانید شناسه کاربری منحصر به فرد کاربر وارد شده را از متغیر auth دریافت کنید و از آن برای کنترل داده‌هایی که کاربر می‌تواند به آنها دسترسی داشته باشد، استفاده کنید.

برای دریافت اطلاعات بازیکن Game Center کاربر یا دسترسی به خدمات Game Center، از APIهای ارائه شده توسط Game Kit استفاده کنید.

برای خروج کاربر از Firebase، Auth.signOut() را فراخوانی کنید:

سویفت

let firebaseAuth = Auth.auth()
do {
  try firebaseAuth.signOut()
} catch let signOutError as NSError {
  print ("Error signing out: %@", signOutError)
}

هدف-سی

NSError *signOutError;
BOOL status = [[FIRAuth auth] signOut:&signOutError];
if (!status) {
  NSLog(@"Error signing out: %@", signOutError);
  return;
}