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