Birden çok proje yapılandırın

Bu sayfada, uygulamanızda birden fazla Firebase projesinin nasıl kullanılacağı açıklanmaktadır.

Çoğu uygulama yalnızca tek bir Firebase projesine ve Başlangıç ​​kılavuzlarında açıklanan varsayılan kuruluma ihtiyaç duyar. Birden fazla Firebase projesi kullanmanın ne zaman yararlı olabileceğine dair örnekler şunları içerir:

  • Geliştirme ortamınızı, yapı türüne veya hedefe göre farklı Firebase projelerini kullanacak şekilde ayarlama.
  • Uygulamanızdaki birden fazla Firebase projesinden içeriğe erişme.

Farklı ortamları destekleyin

Yaygın kullanım örneklerinden biri, geliştirme ve üretim ortamlarınız için ayrı Firebase projelerini desteklemektir.

Web ve Yönetici SDK'ları, değerlerin doğrudan başlatma işlevlerine aktarılmasıyla yapılandırılır. Bu SDK için geliştirme veya üretim yapılandırma değişkenlerini seçmek üzere çalışma zamanı denetimini kullanabilirsiniz.

Android ve Apple platformları (ve bunların Unity ve C++ sarmalayıcıları) normalde yapılandırmayı bir yapılandırma dosyasından yükler: Apple platformunda GoogleService-Info.plist ve Android'de google-services.json . Bu dosyalar, Firebase uygulama nesnesi ( FIROption veya FirebaseOptions ) tarafından başvurulan bir seçenekler nesnesine ( FIRApp veya FirebaseApp ) okunur.

Bu platformlar için, ortamlar arasında geçiş genellikle her ortam için farklı yapılandırma dosyalarının kullanılması yoluyla oluşturma zamanı kararı olarak uygulanır.

Apple uygulamanızda birden fazla ortamı destekleyin

Varsayılan olarak FirebaseApp.configure() uygulamayla birlikte verilen GoogleService-Info.plist dosyasını yükleyecektir. Geliştirme ve üretim ortamlarınız Xcode'da ayrı hedefler olarak yapılandırılmışsa şunları yapabilirsiniz:

  • Her iki GoogleService-Info.plist dosyasını da indirin
  • İki dosyayı farklı dizinlerde saklayın
  • Her ikisini de Xcode projenize ekleyin
  • Hedef Üyelik panelini kullanarak farklı dosyaları farklı hedeflerle ilişkilendirin:

Hedef Üyelik paneli

Derlemeler tek bir hedefin parçasıysa en iyi seçenek, her iki yapılandırma dosyasına da benzersiz adlar vermektir (örneğin GoogleService-Info-Free.plist ve GoogleService-Info-Paid.plist ). Daha sonra çalışma zamanında hangi plist'in yükleneceğini seçin. Bu, aşağıdaki örnekte gösterilmektedir:

// 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 uygulamanızda birden fazla ortamı destekleyin

Android'de, google-services.json dosyası, Google Hizmetleri gradle eklentisi tarafından Android dize kaynaklarına işlenir. JSON dosyasının işlenmesi başlıklı Google Hizmetleri Eklentisi belgelerinde hangi kaynakların oluşturulduğunu görebilirsiniz.

google-services.json dosyalarını, uygulama modülü kökü altında her bir değişken için adlandırılmış özel dizinlere yerleştirerek, farklı derleme varyantları için birden fazla google google-services.json dosyasına sahip olabilirsiniz. Örneğin, "geliştirme" ve "yayınlama" yapı seçenekleriniz varsa yapılandırmanız şu şekilde düzenlenebilir:

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

Daha fazla bilgi edinmek için JSON dosyasını ekleme hakkındaki Google Hizmetleri Eklentisi belgelerine bakın.

Bu kaynaklar daha sonra uygulama kodunuzdan önce çalışan ve Firebase API'lerini bu değerleri kullanarak başlatan FirebaseInitProvider tarafından yüklenir.

Bu sağlayıcı yalnızca bilinen adlara sahip kaynakları okuduğundan, başka bir seçenek de Google Hizmetleri gradle eklentisini kullanmak yerine dize kaynaklarını doğrudan uygulamanıza eklemektir. Bunu şu şekilde yapabilirsiniz:

  • google-services eklentisini kök build.gradle dosyanızdan kaldırma
  • google-services.json dosyasını projenizden silme
  • Dize kaynaklarını doğrudan ekleme
  • apply plugin: 'com.google.gms.google-services' , build.gradle uygulamanızdan

Uygulamanızda birden fazla proje kullanın

Bazen aynı API'leri kullanarak farklı projelere erişmeniz gerekebilir (örneğin, birden fazla veritabanı örneğine erişim). Çoğu durumda, tüm Firebase API'lerinin yapılandırmasını yöneten merkezi bir Firebase uygulama nesnesi bulunur. Bu nesne normal kurulumunuzun bir parçası olarak başlatıldı. Ancak tek bir uygulamadan birden fazla projeye erişmek istediğinizde her birine ayrı ayrı başvuruda bulunmak için ayrı bir Firebase uygulama nesnesine ihtiyacınız olacaktır. Bu diğer örnekleri başlatmak size kalmıştır.

Her iki durumda da, öncelikle Firebase uygulamasına ilişkin yapılandırma verilerini tutacak bir Firebase seçenekleri nesnesi oluşturmanız gerekir. Seçeneklere ilişkin tam belgeler aşağıdaki sınıflara ilişkin API referans belgelerinde bulunabilir:

Bir uygulamada birden fazla projeyi desteklemek için bu sınıfların kullanımı aşağıdaki örneklerde gösterilmektedir:

Süratli

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

Birlik

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

Bu seçenekler nesnesini başlattıktan sonra, onu ek bir Firebase uygulama örneği yapılandırmak için kullanabilirsiniz. Aşağıda gösterilen tüm örneklerde ikincil dizeyi kullandığımızı unutmayın. Bu ad, uygulama örneğini almak ve onu, varsayılan örnek (adlandırılmış [DEFAULT] dahil) dahil olmak üzere diğer örneklerden ayırmak için kullanılır. Diğer Firebase projesinin kullanım amacına uygun bir dize seçmelisiniz.

Aşağıdaki kod parçacıkları alternatif bir Gerçek Zamanlı Veritabanına bağlanmayı göstermektedir (diğer Firebase özelliklerine ilişkin API'ler aynı modeli izler).

Süratli

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

Birlik

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 için güvenilir raporlama sağlayın

Google Analytics, etkinlikleri uygulama başlatma akışının çok erken safhalarında, bazı durumlarda birincil Firebase uygulaması örneği yapılandırılmadan önce toplar. Bu durumlarda Firebase, etkinlikleri depolamak için doğru Google uygulama kimliğini aramak için Android kaynağına veya Apple platformlarındaki GoogleService-Info.plist başvurur. Bu nedenle mümkün olan her yerde varsayılan yapılandırma yöntemlerini kullanmanızı öneririz.

Çalışma zamanı yapılandırması gerekiyorsa lütfen aşağıdaki uyarılara dikkat edin:

  1. AdMob kullanıyorsanız ve önerilen şekilde başlangıçta reklam isteğinde bulunuyorsanız, kaynak tabanlı yapılandırma yaklaşımını kullanmadığınızda mobil reklamlarla ilgili bazı Analytics verilerini kaçırabilirsiniz.
  2. Uygulamanızın dağıtılan her versiyonunda yalnızca tek bir Google uygulama kimliği sağlayın. Örneğin, uygulamanızın 1. sürümünü yapılandırmada belirli bir GOOGLE_APP_ID ile gönderip ardından 2. sürümü farklı bir kimlikle yüklerseniz analiz verilerinin düşmesine neden olabilir.
  3. Apple platformlarında, çalışma zamanında farklı bir yapılandırma sağlıyorsanız projenize GoogleService-Info.plist'i eklemeyin; bu, GOOGLE_APP_ID belirgin bir değişikliğe ve Analytics'in kaybolmasına neden olabilir.