Google is committed to advancing racial equity for Black communities. See how.
דף זה תורגם על ידי Cloud Translation API.
Switch to English

העבר את אפליקציית ה- iOS שלך ל- Parebase

אם אתה משתמש ב- Parse שמחפש Backend חלופי כפתרון שירות, Firebase עשוי להיות הבחירה האידיאלית עבור אפליקציית iOS שלך.

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

גוגל ניתוח נתונים

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

עיין במסמכי Google Analytics למידע נוסף.

אסטרטגיית הגירה מוצעת

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

עבור אירועים מותאמים אישית ונכסי משתמש, אתה יכול להשתמש באסטרטגיית כתיבה כפולה באמצעות Parse Analytics וגם Google Analytics כדי לרשום אירועים ונכסים, המאפשרת לך בהדרגה להריץ את הפיתרון החדש.

השוואה בין קוד

ניתוח ניתוח

 // Start collecting data
[PFAnalytics trackAppOpenedWithLaunchOptions:launchOptions];

NSDictionary *dimensions = @{
  // Define ranges to bucket data points into meaningful segments
  @"priceRange": @"1000-1500",
  // Did the user filter the query?
  @"source": @"craigslist",
  // Do searches happen more often on weekdays or weekends?
  @"dayType": @"weekday"
};
// Send the dimensions to Parse along with the 'search' event
[PFAnalytics trackEvent:@"search" dimensions:dimensions];
 

גוגל ניתוח נתונים

 // Obtain the AppMeasurement instance and start collecting data
[FIRApp configure];

// Send the event with your params
[FIRAnalytics logEventWithName:@"search" parameters:@{
  // Define ranges to bucket data points into meaningful segments
  @"priceRange": @"1000-1500",
  // Did the user filter the query?
  @"source": @"craigslist",
  // Do searches happen more often on weekdays or weekends?
  @"dayType": @"weekday"
}];
 

מסד נתונים בזמן אמת

מסד הנתונים Firebase Realtime הוא מסד נתונים המתארח בענן של NoSQL. הנתונים נשמרים כ- JSON ומסונכרנים בזמן אמת לכל לקוח מחובר.

עיין במסמכי מסד הנתונים בזמן אמת של Firebase למידע נוסף.

ההבדלים בנתוני ניתוח

חפצים

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

כל נתוני מסד הנתונים בזמן אמת של Firebase נשמרים כאובייקטים של JSON, ואין שווה ערך ל- PFObject ; אתה פשוט כותב לערכי העץ של JSON של סוגים התואמים את סוגי JSON הזמינים.

להלן דוגמה לאופן בו תוכלו לשמור את הציונים הגבוהים למשחק.

לְנַתֵחַ
 PFObject *gameScore = [PFObject objectWithClassName:@"GameScore"];
gameScore[@"score"] = @1337;
gameScore[@"playerName"] = @"Sean Plott";
gameScore[@"cheatMode"] = @NO;
[gameScore saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
  if (succeeded) {
    // The object has been saved.
  } else {
    // There was a problem, check error.description
  }
}];
 
בסיס אש
 // Create a reference to the database
FIRDatabaseReference *ref = [[FIRDatabase database] reference];
NSString *key = [[ref child:@"scores"] childByAutoId].key;
NSDictionary *score = @{@"score": @1337,
                        @"playerName": @"Sean Plott",
                        @"cheatMode": @NO};
[key setValue:score withCompletionBlock:^(NSError *error,  FIRDatabaseReference *ref) {
  if (error) {
    // The object has been saved.
  } else {
    // There was a problem, check error.description
  }
}];
 
לפרטים נוספים, עיין במדריך לקרוא ולכתוב נתונים במערכת iOS .

יחסים בין נתונים

PFObject יכול להיות בקשר עם PFObject אחר: כל אובייקט יכול להשתמש באובייקטים אחרים כערכים.

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

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

לְנַתֵחַ
 // Create the author
PFObject *myAuthor = [PFObject objectWithClassName:@"Author"];
myAuthor[@"name"] = @"Grace Hopper";
myAuthor[@"birthDate"] = @"December 9, 1906";
myAuthor[@"nickname"] = @"Amazing Grace";

// Create the post
PFObject *myPost = [PFObject objectWithClassName:@"Post"];
myPost[@"title"] = @"Announcing COBOL, a New Programming Language";

// Add a relation between the Post and the Author
myPost[@"parent"] = myAuthor;

// This will save both myAuthor and myPost
[myPost saveInBackground];
 
בסיס אש
 // Create a reference to the database
FIRDatabaseReference *ref = [[FIRDatabase database] reference];

// Create the author
NSString *myAuthorKey = @"ghopper";
NSDictionary *author = @{@"name": @"Grace Hopper",
                         @"birthDate": @"December 9, 1906",
                         @"nickname": @"Amazing Grace"};
// Save the author
[[ref child:myAuthorKey] setValue:author]

// Create and save the post
NSString *key = [[ref child:@"posts"] childByAutoId].key;
NSDictionary *post = @{@"author": myAuthorKey,
                       @"title": @"Announcing COBOL, a New Programming Language"};
[key setValue:post]
 

פריסת הנתונים הבאה היא התוצאה.

{
  // Info about the authors
  "authors": {
    "ghopper": {
      "name": "Grace Hopper",
      "date_of_birth": "December 9, 1906",
      "nickname": "Amazing Grace"
    },
    ...
  },
  // Info about the posts: the "author" fields contains the key for the author
  "posts": {
    "-JRHTHaIs-jNPLXOQivY": {
      "author": "ghopper",
      "title": "Announcing COBOL, a New Programming Language"
    }
    ...
  }
}
לפרטים נוספים, עיין במדריך מבנה מסד הנתונים שלך .

קריאת נתונים

ב- Parse אתה קורא נתונים באמצעות מזהה של אובייקט PFQuery ספציפי, או ביצוע שאילתות באמצעות PFQuery .

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

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

לְנַתֵחַ
 PFQuery *query = [PFQuery queryWithClassName:@"GameScore"];
[query whereKey:@"playerName" equalTo:@"Dan Stemkoski"];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
  if (!error) {
    for (PFObject *score in objects) {
      NSString *gameScore = score[@"score"];
      NSLog(@"Retrieved: %@", gameScore);
    }
  } else {
    // Log details of the failure
    NSLog(@"Error: %@ %@", error, [error userInfo]);
  }
}];
 
בסיס אש
 // Create a reference to the database
FIRDatabaseReference *ref = [[FIRDatabase database] reference];

// This type of listener is not one time, and you need to cancel it to stop
// receiving updates.
[[[[ref child:@"scores"] queryOrderedByChild:@"playerName"] queryEqualToValue:@"Dan Stemkoski"]
    observeEventType:FIRDataEventTypeChildAdded withBlock:^(FIRDataSnapshot *snapshot) {
  // This will fire for each matching child node.
  NSDictionary *score = snapshot.value;
  NSString gameScore = score[@"score"];
  NSLog(@"Retrieved: %@", gameScore);
}];
 
לפרטים נוספים על סוגים זמינים של מאזיני אירועים וכיצד להזמין ולסנן נתונים, עיין במדריך לקרוא ולכתוב נתונים במערכת iOS .

אסטרטגיית הגירה מוצעת

שקול מחדש את הנתונים שלך

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

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

העבר את הנתונים שלך

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

סנכרון רקע

בתרחיש זה, יש לך שתי גרסאות של האפליקציה: הגרסה הישנה המשתמשת ב- Parse וגירסה חדשה המשתמשת ב- Firebase. הסנכרון בין שני מסדי הנתונים מנוהל על ידי קוד ענן של Parse (ניתוח ל- Firebase), כאשר הקוד שלך מקשיב לשינויים ב- Firebase וסנכרון השינויים האלה עם Parse. לפני שתוכל להתחיל להשתמש בגירסה החדשה, עליך:

  • המר את נתוני הניתוח הקיימים למבנה Firebase החדש, וכתוב אותם למאגר Firebase Realtime.
  • כתוב פונקציות קוד ענן של קוד המשתמשות בממשק ה- API של Firebase REST כדי לכתוב שינויים במסד הנתונים בזמן אמת של Firebase שבוצעו בנתוני הניתוח על ידי לקוחות ישנים.
  • כתוב ופרוס קוד שמאזין לשינויים ב- Firebase וסנכרן אותם עם מסד הנתונים Parse.

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

כתיבה כפולה

בתרחיש זה אתה כותב גרסה חדשה של האפליקציה המשתמשת הן ב- Firebase והן ב- Parse, תוך שימוש ב- Code Cloud Code כדי לסנכרן שינויים שנעשו על ידי לקוחות ישנים מהנתונים לנתח למסד הנתונים Firebase Realtime. כאשר מספיק אנשים עברו מגירסת ה- Parse בלבד של האפליקציה, תוכלו להסיר את קוד ה- Parse מגירסת הכתיבה הכפולה.

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

אימות בסיס אש

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

עיין במסמכי האימות של Firebase למידע נוסף.

הבדלים עם אותות ניתוח

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

ל- FIRUser יש קבוצה קבועה של מאפיינים בסיסיים - מזהה ייחודי, כתובת דוא"ל ראשית, שם וכתובת אתר לתמונה - המאוחסנים בבסיס הנתונים של הפרויקט הנפרד; ניתן לעדכן את המאפיינים הללו על ידי המשתמש. אינך יכול להוסיף מאפיינים אחרים לאובייקט FIRUser ישירות; במקום זאת, אתה יכול לאחסן את המאפיינים הנוספים במסד הנתונים של Firebase Realtime.

להלן דוגמה לאופן ההרשמה למשתמש ולהוסיף שדה מספר טלפון נוסף.

לְנַתֵחַ
 PFUser *user = [PFUser user];
user.username = @"my name";
user.password = @"my pass";
user.email = @"email@example.com";

// other fields can be set just like with PFObject
user[@"phone"] = @"415-392-0202";

[user signUpInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
  if (!error) {
    // Hooray! Let them use the app now.
  } else {
    // Something went wrong
    NSString *errorString = [error userInfo][@"error"];
  }
}];
 
בסיס אש
 [[FIRAuth auth] createUserWithEmail:@"email@example.com"
                           password:@"my pass"
                         completion:^(FIRUser *_Nullable user, NSError *_Nullable error) {
  if (!error) {
    FIRDatabaseReference *ref = [[FIRDatabase database] reference];
    [[[[ref child:@"users"] child:user.uid] child:@"phone"] setValue:@"415-392-0202"
  } else {
    // Something went wrong
    NSString *errorString = [error userInfo][@"error"];
  }
}];
 

אסטרטגיית הגירה מוצעת

העבר חשבונות

כדי להעביר חשבונות משתמשים מ- Parse ל- Firebase, ייצא את מסד הנתונים של המשתמש לקובץ JSON או CSV, ואז ייבא את הקובץ לפרויקט Firebase באמצעות הפקודה auth:import של Firebase CLI.

ראשית, ייצא את מסד הנתונים של המשתמש שלך ממסוף ה- Parse או ממסד הנתונים המארח את עצמך. לדוגמה, קובץ JSON שיוצא מקונסולת ה- Parse עשוי להיראות כך:

{ // Username/password user
  "bcryptPassword": "$2a$10$OBp2hxB7TaYZgKyTiY48luawlTuYAU6BqzxJfpHoJMdZmjaF4HFh6",
  "email": "user@example.com",
  "username": "testuser",
  "objectId": "abcde1234",
  ...
},
{ // Facebook user
  "authData": {
    "facebook": {
      "access_token": "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
      "expiration_date": "2017-01-02T03:04:05.006Z",
      "id": "1000000000"
    }
  },
  "username": "wXyZ987654321StUv",
  "objectId": "fghij5678",
  ...
}

לאחר מכן, הפוך את הקובץ המיוצא לפורמט הנדרש על ידי Firebase CLI. השתמש objectId של המשתמשים שלך ב- localId כ- localId של המשתמשים שלך ב- Firebase. כמו כן, base64 מקודד את ערכי bcryptPassword מ- bcryptPassword ומשתמש בהם בשדה passwordHash . לדוגמה:

{
  "users": [
    {
      "localId": "abcde1234",  // Parse objectId
      "email": "user@example.com",
      "displayName": "testuser",
      "passwordHash": "JDJhJDEwJE9CcDJoeEI3VGFZWmdLeVRpWTQ4bHVhd2xUdVlBVTZCcXp4SmZwSG9KTWRabWphRjRIRmg2",
    },
    {
      "localId": "fghij5678",  // Parse objectId
      "displayName": "wXyZ987654321StUv",
      "providerUserInfo": [
        {
          "providerId": "facebook.com",
          "rawId": "1000000000",  // Facebook ID
        }
      ]
    }
  ]
}

לבסוף, ייבא את הקובץ שהופך באמצעות Firebase CLI, וציין את bcrypt כאלגוריתם ה- hash:

firebase auth:import account_file.json --hash-algo=BCRYPT

העבר נתוני משתמש

אם אתה מאחסן נתונים נוספים למשתמשים שלך, אתה יכול להעביר אותם למאגר Firebase Realtime באמצעות האסטרטגיות המתוארות בסעיף העברת הנתונים . אם אתה מעביר חשבונות באמצעות הזרימה המתוארת בסעיף העברת החשבונות , לחשבונות ה- Firebase שלך ​​יש אותם מזהים של חשבונות ה- Parse שלך, ומאפשרים לך להעביר ולהעתיק בקלות את כל היחסים שקשורים למזהה המשתמש.

העברת אש בענן

Firebase Cloud Messaging (FCM) הוא פיתרון העברת הודעות בין פלטפורמות המאפשר לך לספק באופן מהימן הודעות והודעות ללא עלות. מלחין ההודעות הוא שירות חינמי הבנוי ב- Firebase Cloud Messaging המאפשר התראות משתמשים ממוקדות למפתחי אפליקציות סלולריות.

למידע נוסף, עיין במסמכי ההודעות בענן של Firebase .

הבדלים עם הודעות על Push ניתוח

לכל יישום Parse המותקן בהתקן הרשום להתראות יש אובייקט Installation משויך, בו אתה מאחסן את כל הנתונים הדרושים למיקוד התראות. Installation היא תת-סוג של PFUser , כלומר תוכל להוסיף כל מידע נוסף שתרצה PFUser Installation שלך.

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

אסטרטגיית הגירה מוצעת

סמלי מכשיר נודדים

בעוד ש- Parse משתמש באסימוני מכשירים של APN כדי למקד להתקנות להתראות, FCM משתמש באסימוני רישום של FCM הממופים לאסימוני המכשיר של APNs. פשוט הוסף את FCM SDK ליישום iOS שלך וזה יביא אסימון FCM באופן אוטומטי .

העברת ערוצים לנושאים של FCM

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

לדוגמה, אם המשתמש שלך נרשם לנושא "ענקים", היית עושה משהו כמו:

 PFInstallation *currentInstallation = [PFInstallation currentInstallation];
[currentInstallation removeObject:@"Giants" forKey:@"channels"];
[currentInstallation saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
  if (succedeed) {
    [[FIRMessaging messaging] subscribeToTopic:@"/topics/Giants"];
  } else {
    // Something went wrong unsubscribing
  }
}];
 

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

עיין במסמכי הנושאים של FCM למידע נוסף.

תצורת מרחוק Firebase

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

Firebase Remote Config יכול להיות שימושי מאוד במהלך ההעברות במקרים בהם ברצונך לבדוק פתרונות שונים ולהיות מסוגל להעביר באופן דינמי יותר לקוחות לספק אחר. לדוגמה, אם יש לך גרסה של האפליקציה שלך המשתמשת הן ב- Firebase והן ב- Parse עבור הנתונים, אתה יכול להשתמש בכלל אחוזון אקראי כדי לקבוע אילו לקוחות קוראים מ- Firebase, ולהגדיל בהדרגה את האחוז.

למידע נוסף על קביעת תצורה מרחוק של Firebase, עיין במבוא לתצורת מרחוק .

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

באמצעות Parse config אתה יכול להוסיף צמדי מפתח / ערך לאפליקציה שלך בלוח המחוונים של Parse Config, ואז להביא את PFConfig בלקוח. כל מופע PFConfig שתקבל הוא תמיד בלתי ניתנת לשינוי. כאשר אתה מאחזר בעתיד PFConfig מהרשת, הוא לא ישנה אף מופע קיים של PFConfig , אלא במקום זאת ייצור חדש ויהפוך אותו לזמין באמצעות currentConfig .

באמצעות קביעת תצורה מרחוק של Firebase אתה יוצר ברירות מחדל בתוך האפליקציה לזוגות מפתח / ערך שאתה יכול לעקוף ממסוף Firebase, ותוכל להשתמש בכללים ותנאים כדי לספק וריאציות בחוויית המשתמש של האפליקציה שלך לקטעים שונים בבסיס המשתמש שלך. Firebase Remote Config מיישם חוג סינגלטון שהופך את זוגות המפתחות / הערכים לזמינים לאפליקציה שלך. בתחילה הסינגלטון מחזיר את ערכי ברירת המחדל שאתה מגדיר בתוך האפליקציה. אתה יכול להביא מערך ערכים חדש מהשרת בכל רגע שנוח לאפליקציה שלך; לאחר שהמערכה החדשה תושג בהצלחה, תוכלו לבחור מתי להפעיל אותה כדי להפוך את הערכים החדשים לזמינים לאפליקציה.

אסטרטגיית הגירה מוצעת

אתה יכול לעבור ל- Firebase Remote Config על ידי העתקת זוגות המפתח / ערכים של תצורת ה- Parse שלך ​​למסוף Firebase ואז פריסת גרסה חדשה של האפליקציה המשתמשת ב- Firebase Remote Config.

אם ברצונך להתנסות הן ב- Parse Config והן ב- Firebase Remote Config, באפשרותך לפרוס גרסה חדשה של האפליקציה המשתמשת בשני SDKs עד שדי משתמשים יגרו מגרסת ה- Parse בלבד.

השוואה בין קוד

לְנַתֵחַ

 [PFConfig getConfigInBackgroundWithBlock:^(PFConfig *config, NSError *error) {
  if (!error) {
    NSLog(@"Yay! Config was fetched from the server.");
  } else {
    NSLog(@"Failed to fetch. Using Cached Config.");
    config = [PFConfig currentConfig];
  }

  NSString *welcomeMessage = config[@"welcomeMessage"];
  if (!welcomeMessage) {
    NSLog(@"Falling back to default message.");
    welcomeMessage = @"Welcome!";
  }
}];
 

בסיס אש

 FIRRemoteConfig remoteConfig = [FIRRemoteConfig remoteConfig];
// Set defaults from a plist file
[remoteConfig setDefaultsFromPlistFileName:@"RemoteConfigDefaults"];

[remoteConfig fetchWithCompletionHandler:^(FIRRemoteConfigFetchStatus status, NSError *error) {
  if (status == FIRRemoteConfigFetchStatusSuccess) {
    NSLog(@"Yay! Config was fetched from the server.");
    // Once the config is successfully fetched it must be activated before newly fetched
    // values are returned.
    [self.remoteConfig activateFetched];
  } else {
    NSLog(@"Failed to fetch. Using last fetched or default.");
  }
}];

// ...

// When this is called, the value of the latest fetched and activated config is returned;
// if there's none, the default value is returned.
NSString welcomeMessage = remoteConfig[@"welcomeMessage"].stringValue;