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

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

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

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

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

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

ערכות ה-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 (חברות ביעד):

חלונית חברים במועדון

אם הגרסאות הן חלק מיעד יחיד, האפשרות הכי טובה היא לתת לשני קובצי ההגדרות שמות ייחודיים (למשל 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 ל-Gradle מעבד את הקובץ google-services.json למשאבי מחרוזות של Android. במאמר עיבוד קובץ ה-JSON במסמכי התיעוד של Google Services Plugin אפשר לראות אילו משאבים נוצרים.

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

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

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

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

מכיוון שהספק הזה רק קורא משאבים עם שמות ידועים, אפשרות נוספת היא להוסיף את משאבי המחרוזות ישירות לאפליקציה במקום להשתמש בתוסף Google Services gradle. כדי לעשות את זה:

  • הסרת התוסף google-services מה-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. במקרים האלה, מערכת Firebase מתייחסת למשאב Android או ל-GoogleService-Info.plist בפלטפורמות של אפל כדי לחפש את מזהה אפליקציית Google הנכון ולאחסן אירועים. לכן, מומלץ להשתמש בשיטות ברירת המחדל להגדרת התצורה בכל מקום שאפשר.

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

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