پرش به مطلب اصلی

متغیرهای ابری با Google Drive

با عملکردهای ذخیره متغیر در فضای ابری و دریافت متغیر از فضای ابری، داده‌های انتخاب‌شدهٔ کاربر مانند تنظیمات، پیشرفت بازی و یادداشت‌ها را در Google Drive خودش نگه دارید و پس از نصب دوباره یا روی گوشی دیگر بازیابی کنید.

متن، عدد صحیح، عدد اعشاری، بولی و JSON پشتیبانی می‌شوند. برای چند دادهٔ مرتبط، یک متغیر JSON بسازید.

محیط اجرا

این نسخه فقط در خروجی جدید اندروید اجرا می‌شود. پیش‌نمایش پنل و خروجی وب، iOS و دسکتاپ به Drive متصل نمی‌شوند و نتیجهٔ unsupported می‌دهند. افزودن این قابلیت یا تغییر شناسهٔ اتصال به ساخت و نصب خروجی جدید نیاز دارد؛ انتشار آنلاین به‌تنهایی SDK تازه را به اپ قدیمی اضافه نمی‌کند.

محل ذخیره و حساب کاربر​

داده در پوشهٔ خصوصی appDataFolder در Drive حساب گوگل انتخاب‌شده ذخیره می‌شود. فایل در فهرست معمول Drive دیده نمی‌شود و اطلاعات از سرور اپ‌ادیتور عبور نمی‌کند. رمز حساب گوگل و توکن دسترسی وارد متغیرهای اپ یا فایل پشتیبان نمی‌شوند.

بازیابی به همان اپ، همان حساب گوگل و همان کلید ابری نیاز دارد. ورود به حساب داخلی اپ، به‌تنهایی اتصال گوگل را برقرار نمی‌کند. برای چند پروفایل داخلی روی یک حساب گوگل، کلیدهای متفاوت انتخاب کنید.

شرایط Drive API

طبق شرایط رسمی Drive API، پشتیبان‌گیری از محتوای کاربر یا اپ در Drive به رضایت کتبی قبلی گوگل نیاز دارد. دسترسی محدود drive.appdata این شرط را خودبه‌خود رفع نمی‌کند. پیش از انتشار عمومی، شرایط استفادهٔ موردنظر خود را با گوگل تعیین تکلیف کنید.

تنظیم اتصال گوگل​

این تنظیمات را سازندهٔ اپ یک بار انجام می‌دهد؛ کاربران داخل اپ حساب خودشان را انتخاب می‌کنند.

  1. در Google Cloud Console پروژه‌ای مختص همین اپ بسازید. برای اپ‌های مستقل، پروژه‌های مستقل به کار ببرید؛ برای نسخه‌های جدید همان اپ، پروژهٔ قبلی را حفظ کنید.
  2. Google Drive API را فعال کنید.
  3. در Google Auth Platform، اطلاعات نام و تماس اپ، مخاطبان، صفحهٔ حریم خصوصی و تنظیمات انتشار را تکمیل کنید. دسترسی موردنیاز https://www.googleapis.com/auth/drive.appdata است؛ دسترسی کامل به Drive لازم نیست. در حالت Testing، حساب‌های آزمایشی را در Test users اضافه کنید.
  4. یک کلاینت OAuth از نوع Android بسازید: نام بسته دقیقاً مطابق تنظیمات اپ و SHA-1 مطابق گواهی امضای خروجی نصب‌شده باشد.
  5. در همان پروژه یک کلاینت OAuth از نوع Web application ایجاد و Client ID آن را کپی کنید؛ معمولاً به apps.googleusercontent.com ختم می‌شود.
  6. در پنل، تنظیمات پروژه ← فضای ابری (Google Drive)، این مقدار را در Web OAuth client ID وارد کنید. Client Secret را وارد نکنید.
  7. تنظیمات را ذخیره و خروجی جدید اندروید را بسازید و نصب کنید.

این روش به بارگذاری google-services.json یا فعال کردن سرویس اعلان نیاز ندارد. راهنمای رسمی اتصال Flutter

اثرانگشت گواهی امضا​

برای کی‌استوری که واقعاً اپ را با آن امضا می‌کنید، می‌توانید از ابزار Java استفاده کنید:

keytool -list -v -keystore YOUR_KEYSTORE.jks -alias YOUR_ALIAS

رمز را در پاسخ به درخواست ابزار وارد کنید؛ آن را در کد، متغیر یا پیام عمومی قرار ندهید. اگر از Play App Signing استفاده می‌کنید، SHA-1 گواهی امضای اپ در Google Play Console را نیز ثبت کنید؛ گواهی Upload ممکن است با گواهی نصب‌شده متفاوت باشد.

عملکردها و کلید ابری​

عملکردورودیرفتار
ذخیره متغیرمتغیر مبدأ و کلید ابریذخیره یا جایگزینی مقدار همان کلید
دریافت متغیرکلید ابری و متغیر مقصددریافت، بررسی و نوشتن در مقصد

کلید از نام متغیر مستقل است: gameProgress را با کلید progress ذخیره و بعداً در restoredProgress دریافت کنید.

کلید پس از جایگذاری متغیرها باید ۱ تا ۹۶ کاراکتر و شامل حروف لاتین، عدد، نقطه، خط تیره یا زیرخط باشد؛ کاراکتر اول حرف یا عدد است. مثال: progress، settings_v1 یا progress_{{profileId}}. کلید خالی، فاصله و حروف فارسی پذیرفته نمی‌شوند.

مثال: بازیابی روی گوشی جدید​

گوشی اول​

  1. با ایجاد متغیر، gameProgress را از نوع JSON در حافظهٔ دستگاه بسازید؛ گزینهٔ «اگر قبلاً ایجاد شده کاری انجام نشود» روشن بماند.
  2. پس از پیشرفت کاربر، مقدار آن مثلاً چنین باشد:
{"level":12,"score":4500,"sound":true}
  1. دکمهٔ «ذخیره پیشرفت» را به عملکرد ذخیره متصل کنید: مبدأ gameProgress، کلید progress، متغیر نتیجه cloudResult.
  2. برای موفقیت پیام «پیشرفت ذخیره شد» و برای خطا پیام {{cloudResult.error}} را تنظیم کنید.
  3. کاربر حساب گوگل را انتخاب و دسترسی را تأیید می‌کند؛ پیام موفقیت پس از تأیید ذخیره توسط Drive اجرا می‌شود.

گوشی دوم​

  1. کاربر همان اپ را نصب و «بازیابی پیشرفت قبلی» را انتخاب می‌کند.
  2. عملکرد دریافت را با کلید progress، مقصد gameProgress و نوع ساخت مقصد «حافظه دستگاه» اجرا کنید.
  3. کاربر همان حساب گوگل قبلی را انتخاب می‌کند. برای تغییر حساب، گزینهٔ «انتخاب دوباره حساب» را روشن کنید.
  4. اپ فایل را در همان حساب جست‌وجو می‌کند؛ هیچ شناسهٔ فایل یا داده‌ای از گوشی قبلی لازم نیست.
  5. پس از دریافت معتبر، gameProgress به مقدار مرحلهٔ ۱۲ تغییر می‌کند و ویجت‌های متصل به آن به‌روز می‌شوند.
  6. داده در حافظهٔ گوشی دوم هم باقی می‌ماند؛ خواندن محلی بعدی به اینترنت نیاز ندارد. ذخیرهٔ ابری بعدی با اجرای دوبارهٔ عملکرد ذخیره انجام می‌شود.
مقدار اولیه را جای پیشرفت قبلی نفرستید

در نصب تازه، مرحلهٔ ۱ را پیش از ارائهٔ گزینهٔ بازیابی، خودکار روی کلید progress ذخیره نکنید. ابتدا «بازیابی قبلی» یا «شروع جدید» را پیشنهاد دهید. اجرای دریافت، دادهٔ ابری را بازنویسی نمی‌کند.

متغیر مقصد​

  • مقصد، نام یک متغیر اصلی و غیرسیستمی است؛ مسیرهایی مانند profile.progress برای مقصد دریافت پذیرفته نمی‌شوند. ابتدا JSON را در متغیر اصلی دریافت و سپس مسیر آن را بخوانید.
  • اگر مقصد موجود باشد، محل ذخیرهٔ آن حفظ می‌شود. انتخاب حافظهٔ دستگاه یا موقت فقط برای ساخت مقصد تازه است.
  • متن‌هایی مانند 00123 و false به عدد یا بولی تبدیل نمی‌شوند.
  • نوع ناسازگار با مقصد، خطای type_mismatch می‌دهد و مقدار مقصد حفظ می‌شود. عدد صحیح و اعشاری با هم سازگارند؛ آبجکت و آرایه هر دو JSON هستند.
  • null ذخیره‌شده یک مقدار معتبر است و با نبود فایل فرق دارد.

نتیجه و خطاها​

متغیر نتیجه اختیاری و JSON است؛ نامش باید با متغیر داده متفاوت باشد. نمونهٔ موفق:

{"success":true,"code":"ok","error":null,"found":true,"key":"progress","updatedAt":"2026-10-30T10:00:00.000Z","account":"user@example.com"}

در خطا، success برابر false و error توضیح قابل نمایش است. در not_found، مقدار found برابر false است؛ در خطاهایی که وجود داده معلوم نیست، found برابر null است. آدرس حساب بالا صرفاً نمونه است.

کداقدام پیشنهادی
not_foundداده‌ای برای این حساب و کلید نیست؛ حساب و کلید را بررسی کنید.
cancelledکاربر انتخاب حساب یا مجوز را لغو کرده؛ با انتخاب خودش دوباره اجرا کند.
not_configuredشناسه OAuth، نام بسته و امضا را بررسی و خروجی جدید بسازید.
authorization_requiredاتصال یا مجوز نیاز به تجدید دارد؛ دوباره تلاش کنید.
access_deniedدسترسی رد شده؛ فعال بودن API، مجوز و ظرفیت حساب را بررسی کنید.
network_errorاینترنت را بررسی و دوباره اجرا کنید.
rate_limitedدرخواست‌ها زیادند؛ با فاصله تلاش کنید.
busyتا پایان عملیات ابری در حال اجرا صبر کنید.
unsupportedاز خروجی جدید اندروید استفاده کنید؛ پیش‌نمایش به Drive متصل نیست.
variable_not_foundابتدا متغیر مبدأ را بسازید.
invalid_keyقالب و طول کلید را اصلاح کنید.
invalid_variable / invalid_result_variableنام مقصد یا نتیجه نامعتبر است یا تداخل دارد.
invalid_value / invalid_dataمقدار قابل ذخیره نیست یا فایل خراب/ناسازگار است.
type_mismatchمقصدی با نوع سازگار انتخاب کنید.
too_largeسقف فایل JSON به همراه اطلاعات قالب یک مگابایت است.
invalid_response / operation_failedعملیات تکمیل نشده؛ دوباره تلاش و اتصال را بررسی کنید.

در عملکرد چندگانه، اگر مرحلهٔ بعد به نتیجه وابسته است، انتظار برای پایان را فعال کنید. برای اجرای مرحلهٔ بعد فقط در موفقیت، از «عملکرد پس از موفقیت» استفاده کنید.

محدودیت‌ها​

  • آخرین مقدار هر کلید نگهداری می‌شود؛ تاریخچهٔ قابل انتخاب و ادغام رکوردها وجود ندارد. ذخیرهٔ بعدی همان کلید، مقدار قبلی را جایگزین می‌کند. بازنویسی همزمان چند دستگاه را در طراحی اپ در نظر بگیرید.
  • ذخیره و دریافت به اینترنت نیاز دارند. صف آفلاین و اجرای خودکار پس‌زمینه وجود ندارد؛ در حالت آفلاین موفقیت گزارش نمی‌شود.
  • ذخیرهٔ مسیر فایل، خود تصویر، صوت یا فایل محلی را منتقل نمی‌کند.
  • کاربر می‌تواند مجوز اپ یا دادهٔ خصوصی آن را از حساب گوگل حذف کند؛ در این صورت پشتیبان ممکن است از دسترس خارج شود.
  • اعتبار خرید، اشتراک یا موجودی مالی سرور را از فایل پشتیبان تأیید نکنید.

منابع: دادهٔ مخصوص اپ در Drive، دسترسی‌های Drive.