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

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

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

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

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

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

Web and Admin SDKs are configured by directly passing values to their initialization functions. برای این کیت توسعه نرم‌افزار، می‌توانید از بررسی زمان اجرا برای انتخاب متغیرهای پیکربندی توسعه یا تولید استفاده کنید.

پلاتفرم‌های 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 را بااستفاده از آن مقادیر مقداردهی اولیه می‌کند.

Because this provider is just reading resources with known names, another option is to add the string resources directly to your app instead of using the google-services Gradle plugin. برای انجام این کار می‌توانید:

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

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

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

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

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

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 اضافی استفاده کنید. توجه داشته باشید که در همه مثال‌های نشان‌داده‌شده در زیر، از رشته secondary استفاده می‌کنیم. از این نام برای بازیابی نمونه برنامه و متمایز کردن آن از نمونه‌های دیگر، ازجمله نمونه پیش‌فرض (به‌نام [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 خاصی در پیکربندی ارسال کنید و سپس نسخه ۲ را با شناسه دیگری بارگذاری کنید، ممکن است باعث شود داده‌های Analytics حذف شود.
  3. در پلاتفرم‌های Apple، اگر پیکربندی متفاوتی در زمان اجرا ارائه می‌دهید، GoogleService-Info.plist را به پروژه‌تان اضافه نکنید، زیرا این کار می‌تواند منجر به تغییر ظاهری GOOGLE_APP_ID و ازدست رفتن Analytics شود.