إعداد مشاريع متعددة

توضّح هذه الصفحة كيفية استخدام أكثر من مشروع واحد على Firebase في تطبيقك.

لا تحتاج العديد من التطبيقات سوى إلى مشروع واحد على Firebase والإعداد التلقائي описанَين في أدلة البدء. في ما يلي أمثلة على الحالات التي قد يكون فيها استخدام مشاريع متعددة على Firebase مفيدًا:

  • إعداد بيئة التطوير لاستخدام مشاريع Firebase مختلفة استنادًا إلى نوع الإصدار أو الهدف
  • الوصول إلى المحتوى من مشاريع متعددة على Firebase في تطبيقك

إتاحة بيئات مختلفة

ومن حالات الاستخدام الشائعة توفير مشاريع منفصلة على Firebase لبيئات التطوير والإنتاج.

يتم ضبط حِزم تطوير البرامج (SDK) للويب والمشرف من خلال تمرير القيم مباشرةً إلى وظائف الإعداد. بالنسبة إلى حِزم SDK هذه، يمكنك استخدام فحص وقت التشغيل لاختيار متغيّرات إعدادات الإصدار العلني أو الإصدار العلني.

عادةً ما تحمِّل منصّتا 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
  • اربط الملفات المختلفة بالاستهدافات المختلفة باستخدام لوحة 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)

إتاحة بيئات متعددة في تطبيق Android

في Android، يعالج المكوّن الإضافي لنظام Gradle المتوافق مع "خدمات Google" ملف google-services.json ويحوله إلى موارد سلاسل google-services.json في Android. يمكنك الاطّلاع على موارد التي يتم إنشاؤها في مستندات "مكوّن Google Services الإضافي" ضمن معالجة ملف JSON.

يمكنك الحصول على ملفات google-services.json متعددة لنماذج الإصدار المختلفة عن طريق وضع ملفات google-services.json في أدلة مخصّصة مُسمّاة لكل صيغة ضمن جذر وحدة التطبيق. على سبيل المثال، إذا كان لديك خيارَا الإصدارَين "التطوير" و "الإصدار"، يمكن تنظيم الإعدادات على النحو التالي:

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

لمزيد من المعلومات، راجِع مستندات المكوّن الإضافي لخدمات Google حول إضافة ملف JSON.

بعد ذلك، يتم تحميل هذه الموارد من قِبل FirebaseInitProvider، الذي يتم تشغيله قبل رمز تطبيقك ويبدأ واجهات برمجة تطبيقات Firebase باستخدام هذه القيم.

وبما أنّ هذا الموفّر يقرأ فقط الموارد التي تحمل أسماء معروفة، يمكنك بدلاً من ذلك إضافة موارد السلاسل إلى تطبيقك مباشرةً بدلاً من استخدام مكوّن Google Services gradle الإضافي. يمكنك إجراء ذلك من خلال:

  • إزالة المكوّن الإضافي google-services من build.gradle الجذر
  • حذف google-services.json من مشروعك
  • إضافة موارد السلاسل مباشرةً
  • حذف apply plugin: 'com.google.gms.google-services' من تطبيقك build.gradle

استخدام مشاريع متعددة في طلبك

في بعض الأحيان، تحتاج إلى الوصول إلى مشاريع مختلفة باستخدام واجهات برمجة التطبيقات نفسها، مثلاً، للوصول إلى عدّة نُسخ من قاعدة بيانات. في معظم الحالات، يكون هناك عنصر تطبيق Firebase مركزي يدير الإعدادات لجميع واجهات برمجة التطبيقات Firebase. يتمّ إعداد هذا الكائن كجزء من عملية الإعداد العادية. ومع ذلك، عندما تريد الوصول إلى مشاريع متعددة من تطبيق واحد، ستحتاج إلى عنصر تطبيق Firebase فريد للإشارة إلى كل مشروع على حدة. ويُرجى العِلم أنّه يعود إليك إعداد هذه النُسخ الأخرى.

في كلتا الحالتَين، عليك أولاً إنشاء عنصر خيارات Firebase لتخزين data الإعدادات لتطبيق 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.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

// 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 { 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

// 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 الصحيح لتخزين الأحداث. لهذا السبب، ننصحك باستخدام methods الإعداد التلقائية كلما أمكن ذلك.

إذا كان الإعداد أثناء التشغيل مطلوبًا، يُرجى مراعاة التحذيرات التالية:

  1. إذا كنت تستخدِم AdMob وطلبت الإعلانات عند بدء التشغيل كما هو مقترَح، قد تفوّت بعض بيانات "إحصاءات Google" المتعلّقة بالإعلانات على الأجهزة الجوّالة في حال عدم استخدام نهج الضبط القائم على موارد العميل.
  2. يجب تقديم معرّف تطبيق Google واحد فقط في كلّ إصدار من إصدارات تطبيقك الموزّعة. على سبيل المثال، إذا طرحت الإصدار 1 من تطبيقك باستخدام GOOGLE_APP_ID معيّن في الإعدادات ثم حمّلت الإصدار 2 باستخدام معرّف مختلف، قد يؤدي ذلك إلى إسقاط بيانات الإحصاءات.
  3. على منصات Apple، لا تُضِف ملف GoogleService-Info.plist إلى مشروعك إذا كنت تقدّم إعدادات مختلفة في وقت التشغيل، لأنّ ذلك قد يؤدي إلى تغيير ظاهر في GOOGLE_APP_ID ويؤدي إلى فقدان "إحصاءات Google".