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

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

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

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

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

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

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

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

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

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

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

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

پنل عضویت هدف

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

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

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

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

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

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

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

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

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

  • در حال حذف افزونه google-services از root 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.trackingID = "UA-12345678-1"
secondaryOptions.clientID = "27992087142-ola6qe637ulk8780vl8mo5vogegkm23n.apps.googleusercontent.com"
secondaryOptions.databaseURL = "https://myproject.firebaseio.com"
secondaryOptions.storageBucket = "myproject.appspot.com"
secondaryOptions.androidClientID = "12345.apps.googleusercontent.com"
secondaryOptions.deepLinkURLScheme = "myapp://"
secondaryOptions.storageBucket = "projectid-12345.appspot.com"
secondaryOptions.appGroupID = nil

Kotlin+KTX

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

وحدت

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 جایگزین را نشان می‌دهند (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 { assert(false, "Could not retrieve secondary app") }


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

Kotlin+KTX

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

وحدت

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