หน้านี้อธิบายวิธีใช้โครงการ Firebase มากกว่า 1 โครงการในแอปของคุณ
แอปจำนวนมากต้องการเพียงโปรเจ็กต์ 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 ของคุณ
- เชื่อมโยงไฟล์ต่าง ๆ กับเป้าหมายต่าง ๆ โดยใช้แผงสมาชิกเป้าหมาย:
หากบิลด์เป็นส่วนหนึ่งของเป้าหมายเดียว ตัวเลือกที่ดีที่สุดคือให้ชื่อไฟล์การกำหนดค่าทั้งสองไฟล์ไม่ซ้ำกัน (เช่น 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 ไฟล์ google-service.json
จะถูกประมวลผลเป็นทรัพยากรสตริงของ Android โดยปลั๊กอิน Google Services gradle คุณสามารถดูได้ว่าสร้างทรัพยากรใดบ้างในเอกสารประกอบของ Google Services Plugin เกี่ยวกับ การประมวลผลไฟล์ JSON
คุณสามารถมีไฟล์ google-services.json
ได้หลายไฟล์สำหรับ เวอร์ชัน บิวด์ที่แตกต่างกัน โดยวางไฟล์ google-services.json
ในไดเรกทอรีเฉพาะที่มีชื่อสำหรับแต่ละเวอร์ชันภายใต้รูทโมดูลแอป ตัวอย่างเช่น หากคุณมีรสชาติของบิลด์ "การพัฒนา" และ "การเผยแพร่" การกำหนดค่าของคุณอาจถูกจัดระเบียบดังนี้:
app/
google-services.json
src/development/google-services.json
src/release/google-services.json
...
หากต้องการเรียนรู้เพิ่มเติม โปรดดูเอกสารประกอบของ Google Services Plugin เกี่ยวกับ การเพิ่มไฟล์ JSON
จากนั้นทรัพยากรเหล่านี้จะถูกโหลดโดย FirebaseInitProvider ซึ่งทำงานก่อนโค้ดแอปพลิเคชันของคุณและเริ่มต้น Firebase API โดยใช้ค่าเหล่านั้น
เนื่องจากผู้ให้บริการรายนี้เป็นเพียงการอ่านทรัพยากรที่มีชื่อที่รู้จัก ตัวเลือกอื่นคือการเพิ่มทรัพยากรสตริงลงในแอปของคุณโดยตรง แทนที่จะใช้ปลั๊กอิน gradle ของ Google Services คุณสามารถทำได้โดย:
- การลบปลั๊กอิน
google-services
ออกจาก rootbuild.gradle
- กำลังลบ
google-services.json
ออกจากโครงการของคุณ - การเพิ่มทรัพยากรสตริงโดยตรง
- กำลังลบ
apply plugin: 'com.google.gms.google-services'
จากแอปbuild.gradle
ของคุณ
ใช้หลายโครงการในแอปพลิเคชันของคุณ
บางครั้งคุณจำเป็นต้องเข้าถึงโครงการต่างๆ โดยใช้ API เดียวกัน ตัวอย่างเช่น การเข้าถึงอินสแตนซ์ฐานข้อมูลหลายรายการ ในกรณีส่วนใหญ่ มีออบเจ็กต์แอปพลิเคชัน Firebase ส่วนกลางที่จัดการการกำหนดค่าสำหรับ Firebase API ทั้งหมด วัตถุนี้เริ่มต้นเป็นส่วนหนึ่งของการตั้งค่าปกติของคุณ อย่างไรก็ตาม เมื่อคุณต้องการเข้าถึงหลายโครงการจากแอปพลิเคชันเดียว คุณจะต้องมีแอปพลิเคชัน Firebase ที่แตกต่างกันเพื่ออ้างอิงแต่ละรายการแยกกัน ขึ้นอยู่กับคุณที่จะเริ่มต้นอินสแตนซ์อื่นๆ เหล่านี้
ในทั้งสองกรณี คุณต้องสร้างออบเจ็กต์ตัวเลือก Firebase ก่อนเพื่อเก็บข้อมูลการกำหนดค่าสำหรับแอปพลิเคชัน Firebase เอกสารฉบับเต็มสำหรับตัวเลือกต่างๆ สามารถพบได้ในเอกสารอ้างอิง API สำหรับคลาสต่อไปนี้:
- Swift:
FirebaseOptions(googleAppID:gcmSenderID:)
- Android:
FirebaseOptions.Builder
- เว็บ:
initializeApp()
- C++:
firebase::App::Create
- ความสามัคคี:
FirebaseApp.Create
- Node.js:
initializeApp
- Java:
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: "...", };
ภาษาซี++
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>"
};
โหนด 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 อื่น
ตัวอย่างต่อไปนี้สาธิตการเชื่อมต่อกับฐานข้อมูลเรียลไทม์ทางเลือก (API สำหรับฟีเจอร์ 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(this /* Context */, 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();
ภาษาซี++
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);
โหนด 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 บางส่วนที่เกี่ยวข้องกับโฆษณาบนมือถือเมื่อไม่ได้ใช้วิธีการกำหนดค่าตามทรัพยากร
- ระบุ ID แอป Google เดียวในแอปแต่ละเวอร์ชันที่กระจายอยู่เท่านั้น ตัวอย่างเช่น หากคุณจัดส่งแอปเวอร์ชัน 1 ด้วย
GOOGLE_APP_ID
บางอย่างในการกำหนดค่า แล้วอัปโหลดเวอร์ชัน 2 ด้วย ID อื่น อาจทำให้ข้อมูลการวิเคราะห์หลุด - บนแพลตฟอร์มของ Apple อย่าเพิ่ม GoogleService-Info.plist ในโครงการของคุณ หากคุณให้การกำหนดค่าที่แตกต่างกันในขณะรันไทม์ เนื่องจากอาจส่งผลให้
GOOGLE_APP_ID
เปลี่ยนแปลงอย่างเห็นได้ชัด และส่งผลให้ Analytics สูญหาย