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

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

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

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

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

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

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

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

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

پشتیبانی از محیط‌های متعدد در برنامه Apple

به‌طور پیش‌فرض، 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)

پشتیبانی از محیط‌های متعدد در برنامه Android

در پروژه‌های Android، فایل پیکربندی google-services.json توسط افزایه Gradle google-services به منابع رشته Android پردازش می‌شود. در نحوه پردازش فایل پیکربندی JSON با منابعی که افزایه ایجاد می‌کند آشنا شوید.

می‌توانید برای هریک از گونه‌های ساخت مختلف خود یک فایل پیکربندی google-services.json داشته باشید با قرار دادن هر فایل پیکربندی google-services.json در یک دایرکتوری اختصاصی که به نام هر گونه در ریشه واحد برنامه نام‌گذاری شده است. برای مثال، اگر طعم‌های ساخت «توسعه» و «انتشار» داشته باشید، پیکربندی شما می‌تواند به این صورت سازمان‌دهی شود:

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

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

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

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

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

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

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

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

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

Swift

// 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: "...",
};

C++‎

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>");

Unity

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

Node.js

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();

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

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

Swift

// 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();

C++‎

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

Unity

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

Node.js

// 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 به منبع Android یا GoogleService-Info.plist در پلاتفرم‌های Apple ارجاع می‌دهد تا شناسه برنامه Google صحیح را برای ذخیره رویدادها پیدا کند. به همین دلیل، توصیه می‌کنیم هرجا ممکن است از روش‌های پیکربندی پیش‌فرض استفاده کنید.

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

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