Google은 흑인 공동체를 위한 인종적 평등을 추구하기 위해 노력하고 있습니다. 자세히 알아보기

여러 프로젝트 구성

이 페이지에서는 앱에서 둘 이상의 Firebase 프로젝트를 사용하는 방법을 설명합니다.

대부분의 앱에는 시작하기 가이드에 설명된 단일 Firebase 프로젝트와 기본 설정만 필요합니다. 여러 Firebase 프로젝트를 사용하는 것이 유용한 경우의 예는 다음과 같습니다.

  • 빌드 유형 또는 대상에 따라 다른 Firebase 프로젝트를 사용하도록 개발 환경을 설정합니다.
  • 앱에서 여러 Firebase 프로젝트의 콘텐츠에 액세스합니다.

다양한 환경 지원

일반적인 사용 사례 중 하나는 개발 및 프로덕션 환경에 대해 별도의 Firebase 프로젝트를 지원하는 것입니다.

Web 및 Admin SDK는 초기화 함수에 값을 직접 전달하여 구성됩니다. 이러한 SDK의 경우 런타임 검사를 사용하여 개발 또는 프로덕션 구성 변수를 선택할 수 있습니다.

Android 및 Apple 플랫폼(및 해당 Unity 및 C++ 래퍼)은 일반적으로 구성 파일(Apple 플랫폼의 경우 GoogleService-Info.plist 및 Android google-services.json )에서 구성을 로드합니다. 이러한 파일은 Firebase 애플리케이션 개체( FIRApp 또는 FirebaseApp )에서 참조하는 옵션 개체( FIROption 또는 FirebaseOptions )로 읽혀집니다.

이러한 플랫폼의 경우 환경 간 전환은 일반적으로 각 환경에 대해 서로 다른 구성 파일을 사용하여 빌드 시간 결정으로 구현됩니다.

Apple 애플리케이션에서 여러 환경 지원

기본적으로 FirebaseApp.configure() 는 애플리케이션과 함께 번들로 제공되는 GoogleService-Info.plist 파일을 로드합니다. 개발 및 프로덕션 환경이 Xcode에서 별도의 대상으로 구성된 경우 다음을 수행할 수 있습니다.

  • GoogleService-Info.plist 파일을 모두 다운로드합니다.
  • 두 파일을 다른 디렉토리에 저장
  • Xcode 프로젝트에 두 가지 모두 추가
  • Target Membership 패널을 사용하여 다른 파일을 다른 대상과 연결합니다.

대상 멤버십 패널

빌드가 단일 대상의 일부인 경우 가장 좋은 옵션은 두 구성 파일에 고유한 이름을 지정하는 것입니다(예: GoogleService-Info-Free.plistGoogleService-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 파일은 Google Services Gradle 플러그인에 의해 Android 문자열 리소스로 처리됩니다. JSON 파일 처리 에 대한 Google 서비스 플러그인 문서에서 생성된 리소스를 확인할 수 있습니다.

앱 모듈 루트 아래의 각 변형에 대한 전용 디렉토리에 google-services.json 파일을 배치하여 다양한 빌드 변형 에 대해 여러 google-services.json 파일을 가질 수 있습니다. 예를 들어 "개발" 및 "릴리스" 빌드 버전이 있는 경우 구성을 다음과 같이 구성할 수 있습니다.

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

자세한 내용 은 JSON 파일 추가 에 대한 Google 서비스 플러그인 문서를 참조하세요.

그런 다음 이러한 리소스는 애플리케이션 코드보다 먼저 실행되고 해당 값을 사용하여 Firebase API를 초기화하는 FirebaseInitProvider 에 의해 로드됩니다.

이 공급자는 이름이 알려진 리소스를 읽기만 하기 때문에 다른 옵션은 Google Services Gradle 플러그인을 사용하는 대신 문자열 리소스를 앱에 직접 추가하는 것입니다. 다음과 같이 할 수 있습니다.

  • 루트 build.gradle 에서 google-services 플러그인 제거
  • 프로젝트에서 google-services.json 삭제
  • 문자열 리소스 직접 추가
  • 적용 플러그인 삭제: 앱 build.gradle 에서 apply plugin: 'com.google.gms.google-services'

애플리케이션에서 여러 프로젝트 사용

예를 들어 여러 데이터베이스 인스턴스에 액세스하는 경우와 같이 동일한 API를 사용하여 다른 프로젝트에 액세스해야 하는 경우가 있습니다. 대부분의 경우 모든 Firebase API의 구성을 관리하는 중앙 Firebase 애플리케이션 개체가 있습니다. 이 개체는 일반 설정의 일부로 초기화됩니다. 그러나 단일 애플리케이션에서 여러 프로젝트에 액세스하려는 경우 각 프로젝트를 개별적으로 참조하려면 별도의 Firebase 애플리케이션 객체가 필요합니다. 이러한 다른 인스턴스를 초기화하는 것은 사용자에게 달려 있습니다.

두 경우 모두 Firebase 애플리케이션의 구성 데이터를 보관할 Firebase 옵션 객체를 먼저 만들어야 합니다. 옵션에 대한 전체 문서는 다음 클래스에 대한 API 참조 문서에서 찾을 수 있습니다.

애플리케이션에서 여러 프로젝트를 지원하기 위해 이러한 클래스를 사용하는 방법은 다음 예제에 나와 있습니다.

빠른

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

단일성

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

자바

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 프로젝트의 의도된 용도에 적합한 문자열을 선택해야 합니다.

다음 스니펫은 대체 실시간 데이터베이스에 연결하는 방법을 보여줍니다(다른 Firebase 기능용 API는 동일한 패턴을 따릅니다).

빠른

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

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

자바

// Initialize another app with a different config
FirebaseApp secondaryApp = FirebaseApp.initializeApp(secondaryAppConfig, "secondary");

// Retrieve the database.
FirebaseDatabase secondaryDatabase = FirebaseDatabase.getInstance(secondaryApp);

Analytics에 대한 신뢰할 수 있는 보고 보장

Google 애널리틱스는 앱 시작 흐름의 매우 초기에 이벤트를 수집하며 경우에 따라 기본 Firebase 앱 인스턴스가 구성되기 전에 수집합니다. 이러한 경우 Firebase는 Android 리소스 또는 Apple 플랫폼 GoogleService-Info.plist 를 참조하여 이벤트를 저장할 올바른 Google 앱 ID를 찾습니다. 이러한 이유로 가능하면 기본 구성 방법을 사용하는 것이 좋습니다.

런타임 구성이 필요한 경우 다음 주의 사항에 유의하십시오.

  1. AdMob을 사용 중이고 시작 시 권장 사항에 따라 광고를 요청하는 경우 리소스 기반 구성 접근 방식을 사용하지 않으면 모바일 광고와 관련된 일부 애널리틱스 데이터가 누락될 수 있습니다.
  2. 앱의 배포된 각 변형에 단일 Google 앱 ID만 제공하세요. 예를 들어 구성에 특정 GOOGLE_APP_ID 가 있는 앱 버전 1을 출시한 다음 다른 ID로 버전 2를 업로드하면 분석 데이터가 삭제될 수 있습니다.
  3. Apple 플랫폼에서 런타임에 다른 구성을 제공하는 경우 GoogleService-Info.plist를 프로젝트에 추가하지 마세요. 이렇게 하면 GOOGLE_APP_ID 가 명백히 변경되어 Analytics가 손실될 수 있습니다.