הגדרת מספר פרויקטים

בדף הזה מוסבר איך להשתמש ביותר מפרויקט Firebase אחד באפליקציה.

באפליקציות רבות צריך רק פרויקט Firebase אחד ואת ההגדרה שמוגדרת כברירת מחדל, כמו שמתואר במדריכים לתחילת העבודה. דוגמאות למקרים שבהם כדאי להשתמש בכמה פרויקטים ב-Firebase:

  • הגדרת סביבת הפיתוח לשימוש בפרויקטים שונים ב-Firebase בהתאם לסוג ה-build או ליעד.
  • גישה לתוכן מכמה פרויקטים ב-Firebase באפליקציה.

תמיכה בסביבות שונות

תרחיש נפוץ אחד הוא תמיכה בפרויקטים נפרדים ב-Firebase לסביבות הפיתוח והייצור.

כדי להגדיר את ה-SDK לאינטרנט ואת ה-SDK לאדמינים, מעבירים ערכים ישירות לפונקציות האתחול שלהם. בערכות ה-SDK האלה, אפשר להשתמש בבדיקה בזמן הריצה כדי לבחור משתני הגדרה לפיתוח או לייצור.

בפלטפורמות של Android ו-Apple (ובמעטפות Unity ו-C++‎ שלהן), בדרך כלל ההגדרות נטענות מקובץ תצורה: GoogleService-Info.plist בפלטפורמה של Apple ו-google-services.json ב-Android. הקבצים האלה נקראים לתוך אובייקט אפשרויות (FIROption או FirebaseOptions) שאובייקט האפליקציה של Firebase (FIRApp או FirebaseApp) מפנה אליו.

בפלטפורמות האלה, המעבר בין הסביבות בדרך כלל מיושם כהחלטה בזמן ה-build, באמצעות קובצי תצורה שונים לכל סביבה.

תמיכה בכמה סביבות באפליקציה ל-Apple

כברירת מחדל, FirebaseApp.configure() יטען את הקובץ GoogleService-Info.plist שמצורף לאפליקציה. אם סביבות הפיתוח והייצור מוגדרות כיעדים נפרדים ב-Xcode, אתם יכולים:

  • הורדת שני הקבצים של GoogleService-Info.plist
  • שמירת שני הקבצים בספריות שונות
  • מוסיפים את שניהם לפרויקט Xcode
  • משייכים את הקבצים השונים ליעדים השונים באמצעות החלונית Target Membership:

החלונית "חברות בקבוצת היעד"

אם ה-builds הם חלק מיעד אחד, האפשרות הכי טובה היא לתת לשני קובצי התצורה שמות ייחודיים (למשל, GoogleService-Info-Free.plist ו-GoogleService-Info-Paid.plist). לאחר מכן, בוחרים בזמן הריצה איזה plist לטעון. כמו בדוגמה הבאה:

// Load a named file.
guard 
  let filePath = Bundle.main.path(forResource: "MyGoogleService", ofType: "plist"),
  let fileOptions = FirebaseOptions(contentsOfFile: filePath)
else { fatalError("Couldn't load config file.") }
FirebaseApp.configure(options: fileOptions)

תמיכה בכמה סביבות באפליקציה ל-Android

בפרויקטים של Android, קובץ התצורה google-services.json מעובד למשאבי מחרוזות של Android על ידי הפלאגין google-services של Gradle. בקטע איך מתבצע העיבוד של קובץ התצורה בפורמט JSON מוסבר אילו משאבים נוצרים על ידי הפלאגין.

אפשר להגדיר קובץ תצורה google-services.json לכל אחד מוריאנט ה-build השונים. לשם כך, צריך להציב כל קובץ תצורה google-services.json בספרייה ייעודית שנקראת על שם כל וריאנט, מתחת לרמה הבסיסית של מודול האפליקציה. לדוגמה, אם יש לכם גרסאות build מסוג "פיתוח" ו "השקה", אתם יכולים לארגן את ההגדרות כך:

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

מידע נוסף זמין במאמר הוספת קובץ ה-JSON.

לאחר מכן המשאבים האלה נטענים על ידי FirebaseInitProvider, שפועל לפני קוד האפליקציה ומאתחל את ממשקי ה-API של Firebase באמצעות הערכים האלה.

מכיוון שהספק הזה רק קורא משאבים עם שמות ידועים, אפשרות נוספת היא להוסיף את משאבי המחרוזות ישירות לאפליקציה במקום להשתמש בפלאגין של google-services ל-Gradle. כדי לעשות את זה:

  • הסרת הפלאגין של google-services Gradle מהשורש build.gradle
  • מחיקת קובץ התצורה של google-services.json מהפרויקט
  • הוספה ישירה של משאבי המחרוזות
  • מתבצעת מחיקה של apply plugin: 'com.google.gms.google-services' מהאפליקציה build.gradle

שימוש בכמה פרויקטים באפליקציה

לפעמים צריך לגשת לפרויקטים שונים באמצעות אותם ממשקי API – לדוגמה, גישה למספר מכונות של מסדי נתונים. ברוב המקרים יש אובייקט אפליקציה מרכזי של Firebase שמנהל את ההגדרות של כל ממשקי ה-API של Firebase. האובייקט הזה מאותחל כחלק מההגדרה הרגילה. עם זאת, אם רוצים לגשת לכמה פרויקטים מאפליקציה אחת, צריך אובייקט אפליקציה נפרד ב-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.clientID = "27992087142-ola6qe637ulk8780vl8mo5vogegkm23n.apps.googleusercontent.com"
secondaryOptions.databaseURL = "https://myproject.firebaseio.com"
secondaryOptions.storageBucket = "myproject.appspot.com"
secondaryOptions.deepLinkURLScheme = "myapp://"
secondaryOptions.storageBucket = "projectid-12345.appspot.com"
secondaryOptions.appGroupID = nil

Kotlin

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

קטעי הקוד הבאים מדגימים חיבור ל-Realtime Database חלופי (ממשקי ה-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 { fatalError("Could not retrieve secondary app") }


// Retrieve a Real Time Database client configured against a specific app.
let secondaryDb = Database.database(app: secondary)

Kotlin

// 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 בפלטפורמות של אפל כדי לחפש את מזהה אפליקציית Google הנכון שבו יאוחסנו האירועים. לכן, מומלץ להשתמש בשיטות ברירת המחדל להגדרה כשאפשר.

אם נדרשת הגדרה בזמן הריצה, חשוב לשים לב לאזהרות הבאות:

  1. אם אתם משתמשים ב-AdMob ומבקשים מודעות בזמן ההפעלה כמו שמומלץ, יכול להיות שתפספסו חלק מנתוני Analytics שקשורים למודעות לנייד אם לא תשתמשו בגישה של הגדרה מבוססת-משאבים.
  2. צריך לספק רק מזהה אפליקציית Google אחד בכל גרסה מופצת של האפליקציה. לדוגמה, אם שולחים את גרסה 1 של האפליקציה עם GOOGLE_APP_ID מסוים בהגדרות, ואז מעלים את גרסה 2 עם מזהה אחר, יכול להיות שנתוני Analytics יאבדו.
  3. בפלטפורמות של אפל, אל תוסיפו את GoogleService-Info.plist לפרויקט אם אתם מספקים הגדרות אישיות שונות בזמן הריצה, כי זה עלול לגרום לשינוי לכאורה של GOOGLE_APP_ID ולאובדן נתונים ב-Analytics.