تصف هذه الصفحة كيفية استخدام أكثر من مشروع 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. يمكن العثور على الوثائق الكاملة للخيارات في الوثائق المرجعية لواجهة برمجة التطبيقات للفئات التالية:
- Swift:
FirebaseOptions(googleAppID:gcmSenderID:)
- Android:
FirebaseOptions.Builder
- الويب:
initializeApp()
- C ++:
firebase::App::Create
- الوحدة:
FirebaseApp.Create
- Node.js:
initializeApp
- جافا:
FirebaseOptions.Builder
يظهر استخدام هذه الفئات لدعم مشاريع متعددة في تطبيق ما في الأمثلة التالية:
سويفت
// 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 بديلة (تتبع واجهات برمجة التطبيقات لميزات 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 الصحيح لتخزين الأحداث. لهذا السبب ، نوصي باستخدام طرق التكوين الافتراضية حيثما أمكن ذلك.
إذا كانت تهيئة وقت التشغيل مطلوبة ، فيرجى ملاحظة التحذيرات التالية:
- إذا كنت تستخدم AdMob وتطلب إعلانات عند بدء التشغيل على النحو الموصى به ، فقد تفقد بعض بيانات Analytics المتعلقة بإعلانات الجوال عند عدم استخدام نهج التكوين المستند إلى الموارد.
- لا تقدم أبدًا سوى معرف تطبيق Google واحد في كل متغير موزع لتطبيقك. على سبيل المثال ، إذا قمت بشحن الإصدار 1 من تطبيقك مع
GOOGLE_APP_ID
معين في التهيئة ثم حمَّلت الإصدار 2 بمعرف مختلف ، فقد يتسبب ذلك في إسقاط بيانات التحليلات. - على أنظمة Apple الأساسية ، لا تقم بإضافة GoogleService-Info.plist إلى مشروعك إذا كنت تقدم تكوينًا مختلفًا في وقت التشغيل ، حيث يمكن أن يؤدي ذلك إلى تغيير واضح في
GOOGLE_APP_ID
عنه فقدان Analytics.