กำหนดค่าหลายโครงการ

จัดทุกอย่างให้เป็นระเบียบอยู่เสมอด้วยคอลเล็กชัน บันทึกและจัดหมวดหมู่เนื้อหาตามค่ากำหนดของคุณ

หน้านี้อธิบายวิธีใช้โปรเจ็กต์ Firebase มากกว่าหนึ่งโปรเจ็กต์ในแอปของคุณ

แอปจำนวนมากต้องการเพียงโปรเจ็กต์ Firebase เดียวและการตั้งค่าเริ่มต้นที่อธิบายไว้ในคู่มือ เริ่มต้น ใช้งาน ตัวอย่างกรณีที่มีประโยชน์ในการใช้โปรเจ็กต์ Firebase หลายโปรเจ็กต์ ได้แก่

  • การตั้งค่าสภาพแวดล้อมการพัฒนาของคุณเพื่อใช้โปรเจ็กต์ Firebase ที่แตกต่างกันตามประเภทบิลด์หรือเป้าหมาย
  • การเข้าถึงเนื้อหาจากโครงการ Firebase หลายโครงการในแอปของคุณ

รองรับสภาพแวดล้อมที่แตกต่างกัน

กรณีการใช้งานทั่วไปหนึ่งกรณีคือการสนับสนุนโปรเจ็กต์ Firebase แยกต่างหากสำหรับสภาพแวดล้อมการพัฒนาและการใช้งานจริงของคุณ

SDK ของเว็บและผู้ดูแลระบบได้รับการกำหนดค่าโดยการส่งผ่านค่าไปยังฟังก์ชันการเริ่มต้นโดยตรง สำหรับ SDK เหล่านี้ คุณสามารถใช้การตรวจสอบรันไทม์เพื่อเลือกตัวแปรการกำหนดค่าการพัฒนาหรือการใช้งานจริง

โดยปกติแล้ว แพลตฟอร์ม Android และ Apple (และ Wrapper 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 โดยปลั๊กอิน gradle ของ Google Services คุณสามารถดูทรัพยากรที่สร้างขึ้นได้ในเอกสารประกอบของ 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 ออกจาก root build.gradle
  • กำลังลบ google-services.json ออกจากโครงการของคุณ
  • เพิ่มทรัพยากรสตริงโดยตรง
  • กำลังลบ apply plugin: 'com.google.gms.google-services' จากแอป build.gradle

ใช้หลายโครงการในแอปพลิเคชันของคุณ

บางครั้งคุณจำเป็นต้องเข้าถึงโปรเจ็กต์ต่างๆ โดยใช้ API เดียวกัน ตัวอย่างเช่น การเข้าถึงฐานข้อมูลหลายอินสแตนซ์ ในกรณีส่วนใหญ่ มีออบเจ็กต์แอปพลิเคชัน Firebase ส่วนกลางที่จัดการการกำหนดค่าสำหรับ Firebase API ทั้งหมด ออบเจ็กต์นี้เริ่มต้นโดยเป็นส่วนหนึ่งของการตั้งค่าปกติของคุณ อย่างไรก็ตาม เมื่อคุณต้องการเข้าถึงหลายโครงการจากแอปพลิเคชันเดียว คุณจะต้องมีออบเจ็กต์แอปพลิเคชัน Firebase ที่แตกต่างกันเพื่ออ้างอิงแต่ละรายการ ขึ้นอยู่กับคุณที่จะเริ่มต้นอินสแตนซ์อื่นๆ เหล่านี้

ในทั้งสองกรณี คุณต้องสร้างอ็อบเจ็กต์ตัวเลือก Firebase ก่อนเพื่อเก็บข้อมูลการกำหนดค่าสำหรับแอปพลิเคชัน Firebase เอกสารประกอบแบบเต็มสำหรับตัวเลือกมีอยู่ในเอกสารอ้างอิง API สำหรับคลาสต่อไปนี้:

การใช้คลาสเหล่านี้เพื่อสนับสนุนหลายโครงการในแอปพลิเคชันจะแสดงในตัวอย่างต่อไปนี้:

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

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: "...",
};

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'
};

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 เพิ่มเติมได้ โปรดทราบว่าในตัวอย่างทั้งหมดที่แสดงด้านล่าง เราใช้สตริงที่ รอง ชื่อนี้ใช้เพื่อดึงข้อมูลอินสแตนซ์ของแอปพลิเคชัน และเพื่อแยกความแตกต่างจากอินสแตนซ์อื่นๆ รวมถึงอินสแตนซ์เริ่มต้น (ชื่อ [DEFAULT] ) คุณควรเลือกสตริงที่เหมาะสมกับการใช้งานของโปรเจ็กต์ Firebase อื่น

ตัวอย่างต่อไปนี้สาธิตการเชื่อมต่อกับฐานข้อมูลเรียลไทม์ทางเลือก (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 { 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();

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

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 เพื่อค้นหา ID แอป Google ที่ถูกต้องเพื่อจัดเก็บกิจกรรม ด้วยเหตุผลนี้ เราขอแนะนำให้ใช้วิธีการกำหนดค่าเริ่มต้นในทุกที่ที่ทำได้

หากจำเป็นต้องมีการกำหนดค่ารันไทม์ โปรดทราบข้อแม้ต่อไปนี้:

  1. หากคุณกำลังใช้ AdMob และขอโฆษณาเมื่อเริ่มต้นใช้งานตามที่แนะนำ คุณอาจพลาดข้อมูล Analytics บางส่วนที่เกี่ยวข้องกับโฆษณาบนมือถือเมื่อไม่ได้ใช้วิธีการกำหนดค่าตามทรัพยากร
  2. ระบุ ID แอป Google เดียวในแต่ละเวอร์ชันที่แจกจ่ายของแอปของคุณ ตัวอย่างเช่น หากคุณจัดส่งแอปเวอร์ชัน 1 ด้วย GOOGLE_APP_ID บางอย่างในการกำหนดค่า จากนั้นอัปโหลดเวอร์ชัน 2 ด้วย ID อื่น อาจทำให้ข้อมูลการวิเคราะห์หลุด
  3. บนแพลตฟอร์มของ Apple อย่าเพิ่ม GoogleService-Info.plist ให้กับโปรเจ็กต์ของคุณ หากคุณกำลังระบุการกำหนดค่าที่แตกต่างกันในขณะใช้งาน เนื่องจากอาจส่งผลให้เกิดการเปลี่ยนแปลงที่ชัดเจนของ GOOGLE_APP_ID และส่งผลให้ Analytics สูญเสียไป