چندین پروژه را پیکربندی کنید

این صفحه نحوه استفاده از بیش از یک پروژه Firebase در برنامه شما را شرح می‌دهد.

بسیاری از برنامه‌ها فقط به یک پروژه Firebase و تنظیمات پیش‌فرض شرح داده شده در راهنماهای شروع به کار نیاز دارند. نمونه‌هایی از مواردی که استفاده از چندین پروژه Firebase می‌تواند مفید باشد عبارتند از:

  • تنظیم محیط توسعه برای استفاده از پروژه‌های مختلف Firebase بر اساس نوع ساخت یا هدف.
  • دسترسی به محتوا از چندین پروژه Firebase در برنامه شما.

پشتیبانی از محیط‌های مختلف

یکی از کاربردهای رایج، پشتیبانی از پروژه‌های جداگانه‌ی فایربیس برای محیط‌های توسعه و تولید است.

SDK های وب و ادمین با ارسال مستقیم مقادیر به توابع مقداردهی اولیه آنها پیکربندی می‌شوند. برای این SDK ها، می‌توانید از یک بررسی زمان اجرا برای انتخاب متغیرهای پیکربندی توسعه یا تولید استفاده کنید.

پلتفرم‌های اندروید و اپل (و بسته‌های Unity و C++ آنها) معمولاً پیکربندی را از یک فایل پیکربندی بارگذاری می‌کنند: GoogleService-Info.plist در پلتفرم اپل و google-services.json در اندروید. این فایل‌ها در یک شیء options ( FIROption یا FirebaseOptions ) خوانده می‌شوند که توسط شیء برنامه Firebase ( FIRApp یا FirebaseApp ) ارجاع داده می‌شود.

برای این پلتفرم‌ها، جابجایی بین محیط‌ها معمولاً به عنوان یک تصمیم زمان ساخت، از طریق استفاده از فایل‌های پیکربندی مختلف برای هر محیط، پیاده‌سازی می‌شود.

پشتیبانی از محیط‌های چندگانه در اپلیکیشن اپل شما

به طور پیش‌فرض، FirebaseApp.configure() فایل GoogleService-Info.plist را که همراه با برنامه ارائه شده است، بارگذاری می‌کند. اگر محیط‌های توسعه و تولید شما به عنوان اهداف جداگانه در Xcode پیکربندی شده باشند، می‌توانید:

  • هر دو فایل GoogleService-Info.plist را دانلود کنید
  • دو فایل را در دایرکتوری‌های مختلف ذخیره کنید
  • هر دو را به پروژه Xcode خود اضافه کنید
  • با استفاده از پنل عضویت در هدف، فایل‌های مختلف را به اهداف مختلف مرتبط کنید:

پنل عضویت هدف

اگر فایل‌های ساخته‌شده بخشی از یک هدف واحد باشند، بهترین گزینه این است که به هر دو فایل پیکربندی نام‌های منحصر به فردی بدهید (مثلاً GoogleService-Info-Free.plist و GoogleService-Info-Paid.plist ). سپس در زمان اجرا انتخاب کنید که کدام plist بارگذاری شود. این موضوع در مثال زیر نشان داده شده است:

// Load a named file.
guard 
  let filePath = Bundle.main.path(forResource: "MyGoogleService", ofType: "plist"),
  let fileOptions = FirebaseOptions(contentsOfFile: filePath)
else { fatalError("Couldn't load config file.") }
FirebaseApp.configure(options: fileOptions)

پشتیبانی از محیط‌های چندگانه در برنامه اندروید شما

در اندروید، فایل google-services.json توسط افزونه‌ی gradle سرویس‌های گوگل به منابع رشته‌ای اندروید پردازش می‌شود. می‌توانید ببینید کدام منابع در مستندات افزونه‌ی سرویس‌های گوگل در بخش پردازش فایل JSON ایجاد می‌شوند.

شما می‌توانید با قرار دادن فایل‌های google-services.json google-services.json برای انواع مختلف ساخت داشته باشید. برای مثال، اگر نسخه‌های ساخت "development" و "release" دارید، پیکربندی شما می‌تواند به این صورت سازماندهی شود:

app/
    google-services.json
    src/development/google-services.json
    src/release/google-services.json
    ...

برای کسب اطلاعات بیشتر، به مستندات افزونه سرویس‌های گوگل در مورد افزودن فایل JSON مراجعه کنید.

سپس این منابع توسط FirebaseInitProvider بارگذاری می‌شوند، که قبل از کد برنامه شما اجرا می‌شود و APIهای Firebase را با استفاده از آن مقادیر مقداردهی اولیه می‌کند.

از آنجا که این ارائه‌دهنده فقط منابعی با نام‌های شناخته‌شده را می‌خواند، گزینه دیگر این است که به جای استفاده از افزونه gradle سرویس‌های گوگل، منابع رشته‌ای را مستقیماً به برنامه خود اضافه کنید. می‌توانید این کار را به روش زیر انجام دهید:

  • حذف افزونه google-services از فایل build.gradle ریشه
  • حذف google-services.json از پروژه شما
  • اضافه کردن مستقیم منابع رشته‌ای
  • حذف apply plugin: 'com.google.gms.google-services' از build.gradle برنامه شما

از چندین پروژه در برنامه خود استفاده کنید

گاهی اوقات نیاز دارید که با استفاده از APIهای یکسان به پروژه‌های مختلف دسترسی پیدا کنید - برای مثال، دسترسی به چندین نمونه پایگاه داده. در بیشتر موارد، یک شیء برنامه Firebase مرکزی وجود دارد که پیکربندی همه APIهای Firebase را مدیریت می‌کند. این شیء به عنوان بخشی از تنظیمات عادی شما مقداردهی اولیه می‌شود. با این حال، وقتی می‌خواهید از یک برنامه واحد به چندین پروژه دسترسی پیدا کنید، به یک شیء برنامه Firebase مجزا نیاز دارید تا به هر یک از آنها به صورت جداگانه ارجاع دهد. مقداردهی اولیه این نمونه‌های دیگر به عهده شماست.

در هر دو مورد، ابتدا باید یک شیء گزینه‌های Firebase ایجاد کنید تا داده‌های پیکربندی برنامه Firebase را در خود نگه دارد. مستندات کامل مربوط به گزینه‌ها را می‌توانید در مستندات مرجع API برای کلاس‌های زیر بیابید:

استفاده از این کلاس‌ها برای پشتیبانی از چندین پروژه در یک برنامه در مثال‌های زیر نشان داده شده است:

سویفت

// Configure with manual options. Note that projectID and apiKey, though not
// required by the initializer, are mandatory.
let secondaryOptions = FirebaseOptions(googleAppID: "1:27992087142:ios:2a4732a34787067a",
                                       gcmSenderID: "27992087142")
secondaryOptions.apiKey = "AIzaSyBicqfAZPvMgC7NZkjayUEsrepxuXzZDsk"
secondaryOptions.projectID = "projectid-12345"

// The other options are not mandatory, but may be required
// for specific Firebase products.
secondaryOptions.bundleID = "com.google.firebase.devrel.FiroptionConfiguration"
secondaryOptions.clientID = "27992087142-ola6qe637ulk8780vl8mo5vogegkm23n.apps.googleusercontent.com"
secondaryOptions.databaseURL = "https://myproject.firebaseio.com"
secondaryOptions.storageBucket = "myproject.appspot.com"
secondaryOptions.deepLinkURLScheme = "myapp://"
secondaryOptions.storageBucket = "projectid-12345.appspot.com"
secondaryOptions.appGroupID = nil

Kotlin

// Manually configure Firebase Options. The following fields are REQUIRED:
//   - Project ID
//   - App ID
//   - API Key
val options = FirebaseOptions.Builder()
    .setProjectId("my-firebase-project")
    .setApplicationId("1:27992087142:android:ce3b6448250083d1")
    .setApiKey("AIzaSyADUe90ULnQDuGShD9W23RDP0xmeDc6Mvw")
    // .setDatabaseUrl(...)
    // .setStorageBucket(...)
    .build()

Java

// Manually configure Firebase Options. The following fields are REQUIRED:
//   - Project ID
//   - App ID
//   - API Key
FirebaseOptions options = new FirebaseOptions.Builder()
        .setProjectId("my-firebase-project")
        .setApplicationId("1:27992087142:android:ce3b6448250083d1")
        .setApiKey("AIzaSyADUe90ULnQDuGShD9W23RDP0xmeDc6Mvw")
        // setDatabaseURL(...)
        // setStorageBucket(...)
        .build();

وب

// The following fields are REQUIRED:
//  - Project ID
//  - App ID
//  - API Key
const secondaryAppConfig = {
    projectId: "<PROJECT_ID>",
    appId: "<APP_ID>",
    apiKey: "<API_KEY>",
    // databaseURL: "...",
    // storageBucket: "...",
};

سی++

firebase::AppOptions secondary_app_options;

// API key, app ID, and project ID are always required.
secondary_app_options.set_api_key("<API_KEY>");
secondary_app_options.set_app_id("<GOOGLE_APP_ID>");
secondary_app_options.set_project_id("<PROJECT_ID>");

// The following options are specific to individual Firebase products
// and may not always be required.
secondary_app_options.set_database_url("<DATABASE_URL>");
secondary_app_options.set_messaging_sender_id("<SENDER_ID>");
secondary_app_options.set_storage_bucket("<STORAGE_BUCKET>");

وحدت

Firebase.AppOptions secondaryAppOptions = new Firebase.AppOptions {
  ApiKey = "<API_KEY>",
  AppId = "<GOOGLE_APP_ID>",
  ProjectId = "<PROJECT_ID>"
};

نود جی اس

const secondaryServiceAccount = require('./path/to/serviceAccountKey.json');

// All required options are specified by the service account,
// add service-specific configuration like databaseURL as needed.
const secondaryAppConfig = {
    credential: cert(secondaryServiceAccount),
    // databaseURL: 'https://<DATABASE_NAME>.firebaseio.com'
};

جاوا

FileInputStream serviceAccount = new FileInputStream("path/to/serviceAccountKey.json");

FirebaseOptions secondaryAppConfig = new FirebaseOptions.Builder()
  .setCredential(FirebaseCredentials.fromCertificate(serviceAccount))
  .setDatabaseUrl("https://<DATABASE_NAME>.firebaseio.com/")
  .build();

پس از مقداردهی اولیه این شیء options، می‌توانید از آن برای پیکربندی یک نمونه برنامه Firebase اضافی استفاده کنید. توجه داشته باشید که در تمام مثال‌های نشان داده شده در زیر، از رشته secondary استفاده می‌کنیم. این نام برای بازیابی نمونه برنامه و تمایز آن از سایر نمونه‌ها، از جمله نمونه پیش‌فرض (با نام [DEFAULT] ) استفاده می‌شود. شما باید رشته‌ای متناسب با کاربرد مورد نظر برای پروژه Firebase دیگر انتخاب کنید.

قطعه کدهای زیر اتصال به یک Realtime Database جایگزین را نشان می‌دهند (API های مربوط به سایر ویژگی‌های Firebase از همین الگو پیروی می‌کنند).

سویفت

// Configure an alternative FIRApp.
FirebaseApp.configure(name: "secondary", options: secondaryOptions)

// Retrieve a previous created named app.
guard let secondary = FirebaseApp.app(name: "secondary")
  else { fatalError("Could not retrieve secondary app") }


// Retrieve a Real Time Database client configured against a specific app.
let secondaryDb = Database.database(app: secondary)

Kotlin

// Initialize secondary FirebaseApp.
Firebase.initialize(context = this, options, "secondary")

// Retrieve secondary FirebaseApp.
val secondary = Firebase.app("secondary")
// Get the database for the other app.
val secondaryDatabase = Firebase.database(secondary)

Java

// Initialize with secondary app
FirebaseApp.initializeApp(this /* Context */, options, "secondary");

// Retrieve secondary FirebaseApp
FirebaseApp secondary = FirebaseApp.getInstance("secondary");

وب

// Initialize another app with a different config
const secondaryApp = firebase.initializeApp(secondaryAppConfig, "secondary");
// Access services, such as the Realtime Database
// secondaryApp.database();

سی++

firebase::App* secondary_app = firebase::App::Create(secondary_app_options, "Secondary");
firebase::database::Database* secondary_database = firebase::database::Database::GetInstance(secondary_app);

وحدت

var secondaryApp = Firebase.FirebaseApp.Create(secondaryAppOptions, "Secondary"));
var secondaryDatabase = Firebase.Database.FirebaseDatabase.getInstance(secondaryApp);

نود جی اس

// Initialize another app with a different config
const secondary = initializeApp(secondaryAppConfig, 'secondary');
// Access services, such as the Realtime Database
// const secondaryDatabase = secondary.database();

جاوا

// Initialize another app with a different config
FirebaseApp secondaryApp = FirebaseApp.initializeApp(secondaryAppConfig, "secondary");

// Retrieve the database.
FirebaseDatabase secondaryDatabase = FirebaseDatabase.getInstance(secondaryApp);

اطمینان از گزارش‌دهی قابل اعتماد برای Analytics

Google Analytics رویدادها را خیلی زود در جریان راه‌اندازی برنامه، در برخی موارد قبل از پیکربندی نمونه اولیه برنامه Firebase، جمع‌آوری می‌کند. در این موارد، Firebase برای جستجوی شناسه صحیح برنامه Google برای ذخیره رویدادها، به منبع Android یا GoogleService-Info.plist در پلتفرم‌های اپل مراجعه می‌کند. به همین دلیل، توصیه می‌کنیم در صورت امکان از روش‌های پیکربندی پیش‌فرض استفاده کنید.

اگر پیکربندی زمان اجرا مورد نیاز است، لطفاً به نکات زیر توجه کنید:

  1. اگر از AdMob استفاده می‌کنید و طبق توصیه، در هنگام راه‌اندازی درخواست تبلیغات می‌دهید، ممکن است هنگام عدم استفاده از رویکرد پیکربندی مبتنی بر منابع، برخی از داده‌های Analytics مربوط به تبلیغات موبایل را از دست بدهید.
  2. فقط یک شناسه برنامه گوگل را در هر نسخه توزیع‌شده از برنامه خود ارائه دهید. برای مثال، اگر نسخه ۱ برنامه خود را با یک GOOGLE_APP_ID خاص در پیکربندی منتشر کنید و سپس نسخه ۲ را با شناسه دیگری آپلود کنید، ممکن است باعث از دست رفتن داده‌های تحلیلی شود.
  3. در پلتفرم‌های اپل، اگر در زمان اجرا پیکربندی متفاوتی ارائه می‌دهید، GoogleService-Info.plist را به پروژه خود اضافه نکنید، زیرا این کار می‌تواند منجر به تغییر ظاهری GOOGLE_APP_ID و از دست رفتن Analytics شود.