تكوين مشاريع متعددة

تنظيم صفحاتك في مجموعات يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.

تصف هذه الصفحة كيفية استخدام أكثر من مشروع 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 FirebaseApp.configure() بتحميل ملف GoogleService-Info.plist مع التطبيق. إذا تم تكوين بيئات التطوير والإنتاج الخاصة بك كأهداف منفصلة في Xcode ، فيمكنك:

  • قم بتنزيل ملفات GoogleService-Info.plist
  • قم بتخزين الملفين في دلائل مختلفة
  • أضف كلاهما إلى مشروع Xcode الخاص بك
  • اربط الملفات المختلفة بأهداف مختلفة باستخدام لوحة عضوية الهدف:

لوحة العضوية المستهدفة

إذا كانت البنيات جزءًا من هدف واحد ، فإن أفضل خيار هو إعطاء كل من ملفات التكوين أسماء فريدة (مثل GoogleService-Info-Free.plist و GoogleService-Info-Paid.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 ، تتم معالجة ملف google-service.json في موارد سلسلة Android بواسطة المكون الإضافي Google Services gradle. يمكنك معرفة الموارد التي تم إنشاؤها في وثائق المكون الإضافي لخدمات Google حول معالجة ملف 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 API باستخدام هذه القيم.

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

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

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

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

في كلتا الحالتين ، تحتاج أولاً إلى إنشاء كائن خيارات Firebase للاحتفاظ ببيانات التكوين لتطبيق Firebase. يمكن العثور على الوثائق الكاملة للخيارات في الوثائق المرجعية لواجهة برمجة التطبيقات للفئات التالية:

يظهر استخدام هذه الفئات لدعم مشاريع متعددة في تطبيق ما في الأمثلة التالية:

سويفت

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

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

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

الويب

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

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 بديلة (تتبع واجهات برمجة التطبيقات لميزات 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)

Java

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

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

Kotlin+KTX

// Initialize secondary FirebaseApp.
Firebase.initialize(this /* Context */, options, "secondary")

// Retrieve secondary FirebaseApp.
val secondary = Firebase.app("secondary")
// Get the database for the other app.
val secondaryDatabase = Firebase.database(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);

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

ضمان تقارير موثوقة للتحليلات

يجمع Google Analytics الأحداث في وقت مبكر جدًا من تدفق بدء تشغيل التطبيق ، في بعض الحالات قبل تكوين مثيل تطبيق Firebase الأساسي. في هذه الحالات ، يشير Firebase إلى مورد Android أو GoogleService-Info.plist على منصات Apple للبحث عن معرف تطبيق Google الصحيح لتخزين الأحداث. لهذا السبب ، نوصي باستخدام طرق التكوين الافتراضية حيثما أمكن ذلك.

إذا كانت تهيئة وقت التشغيل مطلوبة ، فيرجى ملاحظة التحذيرات التالية:

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