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

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

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

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

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

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

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

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

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

תמכו בסביבות מרובות באפליקציית Apple שלכם

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

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

פאנל חברות יעד

אם ה-builds הם חלק מיעד בודד, האפשרות הטובה ביותר היא לתת לשני קובצי התצורה שמות ייחודיים (למשל GoogleService-Info-Free.plist ו-GoogleService GoogleService-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)

תמכו בסביבות מרובות באפליקציית האנדרואיד שלכם

באנדרואיד, הקובץ google-service.json מעובד למשאבי מחרוזת אנדרואיד על ידי הפלאגין Gradle של שירותי Google. אתה יכול לראות אילו משאבים נוצרו בתיעוד Google Services Plugin על עיבוד קובץ JSON .

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

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

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

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

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

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

השתמש במספר פרויקטים ביישום שלך

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

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

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

אינטרנט

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

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. שים לב שבכל הדוגמאות המוצגות להלן אנו משתמשים במחרוזת המשנית . שם זה משמש כדי לאחזר את מופע היישום, ולהבדיל אותו ממופעים אחרים, כולל מופע ברירת המחדל (ששמו [DEFAULT] ). עליך לבחור מחרוזת המתאימה לשימוש המיועד של פרויקט Firebase האחר.

הקטעים הבאים מדגימים התחברות למסד נתונים חלופי בזמן אמת (ממשקי ה-API של תכונות אחרות של Firebase עוקבות אחר אותו דפוס).

מָהִיר

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

Java

// Initialize with secondary app
FirebaseApp.initializeApp(this /* Context */, options, "secondary");

// Retrieve secondary FirebaseApp
FirebaseApp secondary = FirebaseApp.getInstance("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)

אינטרנט

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

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

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

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