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

בדף הזה מוסבר איך להשתמש ביותר מפרויקט 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. כדי לעשות את זה:

  • הסרת הפלאגין של Gradle ל-google-services מה-root 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.