Google cam kết thúc đẩy công bằng chủng tộc cho Cộng đồng người da đen. Xem cách thực hiện.

Định cấu hình nhiều dự án

Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.

Trang này mô tả cách sử dụng nhiều dự án Firebase trong ứng dụng của bạn.

Nhiều ứng dụng chỉ cần một dự án Firebase duy nhất và thiết lập mặc định được mô tả trong hướng dẫn Bắt đầu . Ví dụ về thời điểm có thể hữu ích khi sử dụng nhiều dự án Firebase bao gồm:

  • Thiết lập môi trường phát triển của bạn để sử dụng các dự án Firebase khác nhau dựa trên loại bản dựng hoặc mục tiêu.
  • Truy cập nội dung từ nhiều dự án Firebase trong ứng dụng của bạn.

Hỗ trợ các môi trường khác nhau

Một trường hợp sử dụng phổ biến là hỗ trợ các dự án Firebase riêng biệt cho môi trường sản xuất và phát triển của bạn.

Web và SDK dành cho quản trị viên được định cấu hình bằng cách chuyển trực tiếp các giá trị đến các hàm khởi tạo của chúng. Đối với các SDK này, bạn có thể sử dụng kiểm tra thời gian chạy để chọn các biến cấu hình phát triển hoặc sản xuất.

Nền tảng Android và Apple (và trình bao bọc Unity và C++ của chúng) thường tải cấu hình từ tệp cấu hình: GoogleService-Info.plist trên nền tảng Apple và google-services.json trên Android. Các tệp này được đọc vào một đối tượng tùy chọn ( FIROption hoặc FirebaseOptions ) được tham chiếu bởi đối tượng ứng dụng Firebase ( FIRApp hoặc FirebaseApp ).

Đối với các nền tảng này, việc chuyển đổi giữa các môi trường thường được triển khai dưới dạng quyết định về thời gian xây dựng, thông qua việc sử dụng các tệp cấu hình khác nhau cho từng môi trường.

Hỗ trợ nhiều môi trường trong ứng dụng Apple của bạn

Theo mặc định, FirebaseApp.configure() sẽ tải tệp GoogleService-Info.plist đi kèm với ứng dụng. Nếu môi trường phát triển và sản xuất của bạn được định cấu hình thành các mục tiêu riêng biệt trong Xcode, bạn có thể:

  • Tải xuống cả hai tệp GoogleService-Info.plist
  • Lưu trữ hai tệp trong các thư mục khác nhau
  • Thêm cả hai vào dự án Xcode của bạn
  • Liên kết các tệp khác nhau với các mục tiêu khác nhau bằng bảng Target Membership:

Bảng thành viên mục tiêu

Nếu các bản dựng là một phần của một mục tiêu, tùy chọn tốt nhất là đặt tên duy nhất cho cả hai tệp cấu hình (ví dụ: GoogleService-Info-Free.plistGoogleService-Info-Paid.plist ). Sau đó, chọn trong thời gian chạy mà plist sẽ tải. Điều này được thể hiện trong ví dụ sau:

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

Hỗ trợ nhiều môi trường trong ứng dụng Android của bạn

Trong Android, tệp google-service.json được plugin cấp độ Google Services xử lý thành tài nguyên chuỗi của Android. Bạn có thể xem tài nguyên nào được tạo trong tài liệu Trình cắm dịch vụ của Google trên Xử lý tệp JSON .

Bạn có thể có nhiều tệp google-services.json cho các biến thể bản dựng khác nhau bằng cách đặt các tệp google-services.json trong các thư mục chuyên dụng được đặt tên cho từng biến thể trong gốc mô-đun ứng dụng. Ví dụ: nếu bạn có các hương vị bản dựng "phát triển" và "phát hành", thì cấu hình của bạn có thể được tổ chức như sau:

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

Để tìm hiểu thêm, hãy xem tài liệu Trình cắm dịch vụ của Google trên Thêm tệp JSON .

Sau đó, các tài nguyên này được tải bởi FirebaseInitProvider chạy trước mã ứng dụng của bạn và khởi tạo API Firebase bằng các giá trị đó.

Bởi vì nhà cung cấp này chỉ đọc các tài nguyên có tên đã biết, một tùy chọn khác là thêm trực tiếp các tài nguyên chuỗi vào ứng dụng của bạn thay vì sử dụng plugin lớp Dịch vụ của Google. Bạn có thể làm điều này bằng cách:

  • Xóa plugin google-services khỏi build.gradle gốc của bạn
  • Xóa google-services.json khỏi dự án của bạn
  • Thêm tài nguyên chuỗi trực tiếp
  • Đang xóa apply plugin: 'com.google.gms.google-services' khỏi ứng dụng build.gradle của bạn

Sử dụng nhiều dự án trong ứng dụng của bạn

Đôi khi, bạn cần truy cập các dự án khác nhau bằng cách sử dụng cùng một API - ví dụ: truy cập nhiều phiên bản cơ sở dữ liệu. Trong hầu hết các trường hợp, có một đối tượng ứng dụng Firebase trung tâm quản lý cấu hình cho tất cả API Firebase. Đối tượng này được khởi tạo như một phần của thiết lập bình thường của bạn. Tuy nhiên, khi bạn muốn truy cập nhiều dự án từ một ứng dụng, bạn sẽ cần một đối tượng ứng dụng Firebase riêng biệt để tham chiếu từng dự án riêng lẻ. Việc khởi tạo các phiên bản khác này tùy thuộc vào bạn.

Trong cả hai trường hợp, trước tiên bạn cần tạo một đối tượng tùy chọn Firebase để giữ dữ liệu cấu hình cho ứng dụng Firebase. Bạn có thể tìm thấy tài liệu đầy đủ về các tùy chọn trong tài liệu tham khảo API cho các lớp sau:

Việc sử dụng các lớp này để hỗ trợ nhiều dự án trong một ứng dụng được thể hiện trong các ví dụ sau:

Nhanh

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

mạng

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

Đoàn kết

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

Sau khi bạn đã khởi tạo đối tượng tùy chọn này, bạn có thể sử dụng nó để định cấu hình phiên bản ứng dụng Firebase bổ sung. Lưu ý rằng trong tất cả các ví dụ hiển thị bên dưới, chúng tôi sử dụng chuỗi secondary . Tên này được sử dụng để truy xuất phiên bản ứng dụng và để phân biệt nó với các phiên bản khác, kể cả phiên bản mặc định (có tên [DEFAULT] ). Bạn nên chọn một chuỗi phù hợp với mục đích sử dụng của dự án Firebase khác.

Đoạn mã sau minh họa kết nối với Cơ sở dữ liệu thời gian thực thay thế (API cho các tính năng khác của Firebase tuân theo cùng một mẫu).

Nhanh

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

mạng

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

Đoàn kết

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

Đảm bảo báo cáo đáng tin cậy cho Analytics

Google Analytics thu thập các sự kiện từ rất sớm trong quy trình khởi động ứng dụng, trong một số trường hợp, trước khi phiên bản ứng dụng Firebase chính được định cấu hình. Trong những trường hợp này, Firebase tham chiếu đến tài nguyên Android hoặc GoogleService-Info.plist trên các nền tảng của Apple để tra cứu ID ứng dụng Google chính xác nhằm lưu trữ các sự kiện. Vì lý do này, chúng tôi khuyên bạn nên sử dụng các phương pháp cấu hình mặc định bất cứ khi nào có thể.

Nếu cấu hình thời gian chạy là bắt buộc, xin lưu ý những lưu ý sau:

  1. Nếu đang sử dụng AdMob và yêu cầu quảng cáo khi khởi động như được đề xuất, thì bạn có thể bỏ lỡ một số dữ liệu Analytics liên quan đến quảng cáo trên thiết bị di động khi không sử dụng phương pháp cấu hình dựa trên tài nguyên.
  2. Chỉ cung cấp một ID ứng dụng Google duy nhất trong mỗi biến thể được phân phối của ứng dụng của bạn. Ví dụ: nếu bạn gửi phiên bản 1 của ứng dụng với một GOOGLE_APP_ID nhất định trong cấu hình, sau đó tải phiên bản 2 lên với một ID khác, điều này có thể khiến dữ liệu phân tích bị mất.
  3. Trên nền tảng Apple, không thêm GoogleService-Info.plist vào dự án của bạn nếu bạn đang cung cấp cấu hình khác trong thời gian chạy, vì điều này có thể dẫn đến thay đổi rõ ràng của GOOGLE_APP_ID và dẫn đến mất Analytics.