กำหนดค่าหลายโปรเจ็กต์

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

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

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

รองรับสภาพแวดล้อมแบบต่างๆ

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

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

โดยปกติแล้วแพลตฟอร์ม Android และ Apple (และ Unity และ C++ Wrapper ของแพลตฟอร์ม) จะโหลดขึ้นตามปกติ การกำหนดค่าจากไฟล์การกำหนดค่า: GoogleService-Info.plist ใน Apple และgoogle-services.jsonบน Android ไฟล์เหล่านี้จะได้รับการอ่านเป็น ออบเจ็กต์ตัวเลือก (FIROption หรือ FirebaseOptions) ที่อ้างอิงโดย ออบเจ็กต์แอปพลิเคชัน Firebase (FIRApp หรือ FirebaseApp)

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

รองรับหลายสภาพแวดล้อมในแอปพลิเคชัน Apple

โดยค่าเริ่มต้น FirebaseApp.configure() จะโหลดไฟล์ GoogleService-Info.plist พ่วงกับแอปพลิเคชัน หากสภาพแวดล้อมในการพัฒนาซอฟต์แวร์และสภาพแวดล้อมการใช้งานจริง จะได้รับการกำหนดค่าเป็นเป้าหมายแยกกันใน Xcode คุณสามารถ:

  • ดาวน์โหลดทั้ง GoogleService-Info.plist ไฟล์
  • เก็บไฟล์ 2 ไฟล์ไว้ในไดเรกทอรีที่ต่างกัน
  • เพิ่มทั้ง 2 รายการในโปรเจ็กต์ 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-services.json เป็นสตริง Android จากปลั๊กอิน Gradle ของบริการ Google คุณจะเห็น ทรัพยากรใดที่สร้างขึ้นในเอกสารประกอบเกี่ยวกับปลั๊กอินบริการ Google การประมวลผลไฟล์ JSON

คุณสามารถมี google-services.json ไฟล์สำหรับไฟล์ต่างๆ สร้างตัวแปร โดยวาง google-services.json ไฟล์ในไดเรกทอรีเฉพาะที่ตั้งชื่อสำหรับแต่ละไฟล์ ตัวแปรภายใต้รูทของโมดูลแอป เช่น หากคุณมี "การพัฒนา" และ "เปิดตัว" เวอร์ชันบิลด์ การกำหนดค่าอาจจัดระเบียบได้ดังนี้

app/
    google-services.json
    src/development/google-services.json
    src/release/google-services.json
    ...

ดูข้อมูลเพิ่มเติมได้ในเอกสารปลั๊กอิน Google Services ใน การเพิ่มไฟล์ 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

// 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>");

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 อื่น

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

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

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

หากจําเป็นต้องมีการกําหนดค่ารันไทม์ โปรดคําเตือนต่อไปนี้

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