หน้านี้อธิบายวิธีใช้โปรเจ็กต์ Firebase มากกว่า 1 โปรเจ็กต์ในแอป
แอปจำนวนมากต้องการเพียงโปรเจ็กต์ Firebase เดียวและการตั้งค่าเริ่มต้น ที่อธิบายไว้ในคู่มือเริ่มต้นใช้งาน ตัวอย่างกรณีที่การใช้โปรเจ็กต์ Firebase หลายโปรเจ็กต์อาจมีประโยชน์มีดังนี้
- การตั้งค่าสภาพแวดล้อมในการพัฒนาซอฟต์แวร์เพื่อใช้โปรเจ็กต์ Firebase ที่แตกต่างกัน ตามประเภทบิลด์หรือเป้าหมาย
- การเข้าถึงเนื้อหาจากโปรเจ็กต์ Firebase หลายรายการในแอป
รองรับสภาพแวดล้อมที่แตกต่างกัน
Use Case ทั่วไปอย่างหนึ่งคือการรองรับโปรเจ็กต์ Firebase แยกต่างหากสำหรับสภาพแวดล้อมในการพัฒนาและสภาพแวดล้อมที่ใช้งานจริง
คุณกำหนดค่า SDK ของเว็บและ Admin SDK ได้โดยการส่งค่าไปยังฟังก์ชันการเริ่มต้นโดยตรง สำหรับ SDK เหล่านี้ คุณสามารถใช้ การตรวจสอบที่รันไทม์เพื่อเลือกตัวแปรการกำหนดค่าการพัฒนาหรือการผลิตได้
โดยปกติแล้ว แพลตฟอร์ม Android และ Apple (และ Wrapper ของ Unity และ C++) จะโหลด
การกำหนดค่าจากไฟล์การกำหนดค่า: GoogleService-Info.plist ในแพลตฟอร์ม Apple
และ google-services.json ใน Android ระบบจะอ่านไฟล์เหล่านี้ลงในออบเจ็กต์ options (FIROption หรือ FirebaseOptions) ที่ออบเจ็กต์แอปพลิเคชัน Firebase (FIRApp หรือ FirebaseApp) อ้างอิง
สำหรับแพลตฟอร์มเหล่านี้ การสลับระหว่างสภาพแวดล้อมมักจะใช้เป็นการตัดสินใจในเวลาบิลด์ผ่านการใช้ไฟล์การกำหนดค่าที่แตกต่างกันสำหรับแต่ละสภาพแวดล้อม
รองรับสภาพแวดล้อมหลายรายการในแอปพลิเคชัน Apple
โดยค่าเริ่มต้น FirebaseApp.configure() จะโหลดไฟล์ GoogleService-Info.plist
ที่มาพร้อมกับแอปพลิเคชัน หากกำหนดค่าสภาพแวดล้อมการพัฒนาและเวอร์ชันที่ใช้งานจริง
เป็นเป้าหมายแยกกันใน Xcode คุณจะทำสิ่งต่อไปนี้ได้
- ดาวน์โหลดไฟล์
GoogleService-Info.plistทั้ง 2 ไฟล์ - จัดเก็บไฟล์ทั้ง 2 ไฟล์ในไดเรกทอรีที่แตกต่างกัน
- เพิ่มทั้ง 2 รายการลงในโปรเจ็กต์ Xcode
- เชื่อมโยงไฟล์ต่างๆ กับเป้าหมายต่างๆ โดยใช้แผง Target Membership ดังนี้

หากบิลด์เป็นส่วนหนึ่งของเป้าหมายเดียว ตัวเลือกที่ดีที่สุดคือการตั้งชื่อที่ไม่ซ้ำกันให้กับไฟล์การกำหนดค่าทั้ง 2 ไฟล์ (เช่น GoogleService-Info-Free.plist และ GoogleService-Info-Paid.plist) จากนั้นเลือกว่าจะโหลด plist ใดในรันไทม์
ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการดำเนินการนี้
// Load a named file. guard let filePath = Bundle.main.path(forResource: "MyGoogleService", ofType: "plist"), let fileOptions = FirebaseOptions(contentsOfFile: filePath) else { fatalError("Couldn't load config file.") } FirebaseApp.configure(options: fileOptions)
รองรับสภาพแวดล้อมหลายรายการในแอปพลิเคชัน Android
ใน Android ปลั๊กอิน Gradle ของบริการ Google จะประมวลผลไฟล์ google-services.json เป็นทรัพยากรสตริงของ Android
คุณดูได้ว่ามีการสร้างทรัพยากรใดบ้างในเอกสารประกอบของปลั๊กอินบริการของ Google ที่หัวข้อการประมวลผลไฟล์ JSON
คุณมีไฟล์ google-services.json หลายไฟล์สำหรับตัวแปรบิลด์ที่แตกต่างกันได้
โดยวางไฟล์ google-services.json ไว้ในไดเรกทอรีเฉพาะที่มีชื่อตามตัวแปรแต่ละรายการ
ภายใต้รูทของโมดูลแอป ตัวอย่างเช่น หากคุณมี Build Flavor "development" และ "release" คุณอาจจัดระเบียบการกำหนดค่าได้ดังนี้
app/
google-services.json
src/development/google-services.json
src/release/google-services.json
...
ดูข้อมูลเพิ่มเติมได้ที่เอกสารประกอบของปลั๊กอินบริการของ Google เกี่ยวกับการเพิ่มไฟล์ JSON
จากนั้น FirebaseInitProvider จะโหลดทรัพยากรเหล่านี้ ซึ่งจะทํางานก่อนโค้ดของแอปพลิเคชันและเริ่มต้น Firebase API โดยใช้ ค่าเหล่านั้น
เนื่องจากผู้ให้บริการนี้เพียงอ่านทรัพยากรที่มีชื่อที่รู้จัก อีกทางเลือกหนึ่งคือการเพิ่มทรัพยากรสตริงลงในแอปโดยตรงแทนการใช้ปลั๊กอิน Gradle ของบริการ Google ซึ่งทำได้โดยดำเนินการดังนี้
- การนำปลั๊กอิน
google-servicesออกจากbuild.gradleรูท - การลบ
google-services.jsonออกจากโปรเจ็กต์ - การเพิ่มทรัพยากรสตริงโดยตรง
- การลบ
apply plugin: 'com.google.gms.google-services'ออกจากแอปbuild.gradle
ใช้หลายโปรเจ็กต์ในแอปพลิเคชัน
ในบางครั้ง คุณอาจต้องเข้าถึงโปรเจ็กต์ต่างๆ โดยใช้ API เดียวกัน เช่น การเข้าถึงอินสแตนซ์ฐานข้อมูลหลายรายการ ในกรณีส่วนใหญ่จะมีออบเจ็กต์แอปพลิเคชัน Firebase ส่วนกลางที่จัดการการกำหนดค่าสำหรับ Firebase API ทั้งหมด ระบบจะเริ่มต้นออบเจ็กต์นี้เป็นส่วนหนึ่งของการตั้งค่าปกติ อย่างไรก็ตาม เมื่อต้องการเข้าถึงหลายโปรเจ็กต์จากแอปพลิเคชันเดียว คุณจะต้องมีออบเจ็กต์แอปพลิเคชัน Firebase ที่แตกต่างกันเพื่ออ้างอิงแต่ละโปรเจ็กต์แยกกัน คุณต้องเป็นผู้เริ่มต้นอินสแตนซ์อื่นๆ เหล่านี้
ในทั้ง 2 กรณี คุณต้องสร้างออบเจ็กต์ตัวเลือก Firebase ก่อนเพื่อเก็บข้อมูลการกำหนดค่าสำหรับแอปพลิเคชัน Firebase ดูเอกสารประกอบทั้งหมด สำหรับตัวเลือกได้ในเอกสารอ้างอิง API ของคลาสต่อไปนี้
- 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.clientID = "27992087142-ola6qe637ulk8780vl8mo5vogegkm23n.apps.googleusercontent.com" secondaryOptions.databaseURL = "https://myproject.firebaseio.com" secondaryOptions.storageBucket = "myproject.appspot.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' };
Java
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 (API สำหรับฟีเจอร์อื่นๆ ของ 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 { fatalError("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();
Java
// 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 สูญหาย