اگر کاربر Parse هستید و بهدنبال راهکار جایگزین «پشتواحد بهعنوان سرویس» میگردید، Firebase میتواند انتخاب ایدهآلی برای برنامه iOS شما باشد.
این راهنما نحوه ادغام سرویسهای خاص در برنامه شما را شرح میدهد. برای دستورالعملهای راهاندازی Firebase پایه، به راهنمای راهاندازی iOS+ مراجعه کنید.
Google Analytics
Google Analytics یک راهکار اندازهگیری برنامه رایگان است که اطلاعات آماری درباره استفاده از برنامه و تعامل کاربر ارائه میدهد. Analytics در سراسر ویژگیهای Firebase ادغام میشود و گزارشدهی نامحدود برای حداکثر ۵۰۰ رویداد متمایز که میتوانید بااستفاده از «کیت توسعه نرمافزار Firebase» تعریف کنید دراختیارتان قرار میدهد.
برای اطلاعات بیشتر، اسناد Google Analytics را ببینید.
استراتژی انتقال پیشنهادی
استفاده از ارائهدهندگان تجزیهوتحلیل مختلف سناریویی رایج است که بهراحتی برای Google Analytics اعمال میشود. کافی است آن را به برنامهتان اضافه کنید تا از رویدادها و مشخصههای کاربری که Analytics بهطور خودکار جمعآوری میکند بهرهمند شوید، مثل اولین باز کردن، بهروزرسانی برنامه، مدل دستگاه، سن.
برای رویدادهای سفارشی و مشخصههای کاربر، میتوانید از استراتژی نوشتن دوگانه بااستفاده از هم Parse Analytics و هم Google Analytics برای ثبت رویدادها و مشخصهها استفاده کنید که به شما امکان میدهد راهحل جدید را بهتدریج عرضه کنید.
مقایسه کد
Parse 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];
Google Analytics
// 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 Database
Firebase Realtime Database یک پایگاه داده NoSQL میزبانیشده در فضای ابری است. دادهها بهصورت JSON ذخیره میشوند و بهطور همزمان با هر کارخواه متصل همگامسازی میشوند.
برای اطلاعات بیشتر، اسناد Firebase Realtime Database را ببینید.
تفاوتها با دادههای تجزیه
اشیا
در Parse، یک PFObject یا زیرکلاس آن را ذخیره میکنید که حاوی جفتهای کلید-مقدار
دادههای سازگار با JSON است. دادهها بدون طرحواره هستند، یعنی لازم نیست مشخص کنید چه کلیدهایی
در هر PFObject وجود دارد.
همه دادههای Firebase Realtime Database بهعنوان اشیای 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
}
}];
Firebase
// 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
}
}];
روابط بین دادهها
یک PFObject میتواند با PFObject دیگری رابطه داشته باشد: هر
شیء میتواند از اشیای دیگر بهعنوان مقدار استفاده کند.
در Firebase Realtime Database، روابط بااستفاده از ساختارهای داده مسطح که دادهها را به مسیرهای جداگانه تقسیم میکنند بهتر بیان میشوند، بهطوریکه میتوان آنها را بهطور مؤثر در تماسهای جداگانه بارگیری کرد.
در زیر مثالی از نحوه ساختاردهی رابطه بین پستها در یک برنامه وبلاگنویسی و نویسندگان آنها آورده شده است.
تجزیه
// 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];
Firebase
// 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، دادهها را بااستفاده از شناسه شیء Parse خاصی میخوانید، یا
پرسمانها را بااستفاده از 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]);
}
}];
Firebase
// 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);
}];
استراتژی پیشنهادی انتقال
بازاندیشی درباره دادهها
Firebase Realtime Database برای همگامسازی دادهها در چند میلیثانیه در همه کلاینتهای متصل بهینه شده است و ساختار دادههای حاصل با دادههای اصلی Parse متفاوت است. این یعنی اولین گام انتقال شما این است که درنظر بگیرید دادههایتان به چه تغییراتی نیاز دارد، ازجمله:
- نحوه نگاشت کردن عناصر Parse به دادههای Firebase
- اگر روابط ولی-فرزندی دارید، چگونه دادههایتان را در مسیرهای مختلف تقسیم کنید تا بتوانید آنها را بهطور کارآمد در تماسهای جداگانه بارگیری کنید.
انتقال دادهها
پساز اینکه تصمیم گرفتید دادههایتان را در Firebase چگونه ساختاربندی کنید، باید برنامهریزی کنید که چگونه دورهای را که برنامهتان باید در هر دو پایگاه داده بنویسد مدیریت کنید. انتخابهای شما عبارتند از:
همگامسازی پسزمینه
در این سناریو، دو نسخه از برنامه دارید: نسخه قدیمی که از Parse استفاده میکند و نسخه جدیدی که از Firebase استفاده میکند. همگامسازی بین دو پایگاه داده توسط Parse Cloud Code (Parse به Firebase) انجام میشود، و کد شما به تغییرات در Firebase گوش میدهد و آن تغییرات را با Parse همگامسازی میکند. پیشاز اینکه بتوانید از نسخه جدید استفاده کنید، باید:
- دادههای تجزیهشده موجود را به ساختار جدید Firebase تبدیل کنید و آن را در Firebase Realtime Database بنویسید.
- توابع «کد ابری Parse» را بنویسید که از «میانای برنامهسازی کاربردی Firebase REST» برای نوشتن در Firebase Realtime Database تغییرات ایجادشده در «دادههای Parse» توسط مشتریان قدیمی استفاده میکنند.
- کدی بنویسید و مستقر کنید که تغییرات Firebase را گوش دهد و آنها را با پایگاه داده Parse همگامسازی کند.
این سناریو جدایی کامل کد قدیمی و جدید را تضمین میکند و مشتریان را ساده نگه میدارد. چالشهای این سناریو عبارتاند از مدیریت مجموعههای داده بزرگ در برونبرد اولیه و اطمینان از اینکه همگامسازی دوطرفه باعث ایجاد بازگشت بینهایت نمیشود.
نوشتن دوگانه
در این سناریو، نسخه جدیدی از برنامه را مینویسید که هم از Firebase و هم از Parse استفاده میکند، و از Parse Cloud Code برای همگامسازی تغییرات ایجادشده توسط کلاینتهای قدیمی از Parse Data به Firebase Realtime Database استفاده میکند. وقتی افراد کافی از نسخه فقط Parse برنامه مهاجرت کردند، میتوانید کد Parse را از نسخه نوشتن دوگانه بردارید.
این سناریو به کد سمت سرور نیاز ندارد. معایب آن این است که دادههایی که به آنها دسترسی پیدا نشده است منتقل نمیشوند و اندازه برنامهتان بهدلیل استفاده از هر دو کیت توسعه نرمافزار افزایش مییابد.
Firebase Authentication
Firebase Authentication میتواند کاربران را بااستفاده از گذرواژهها و ارائهدهندگان هویت فدرال محبوب مثل Google، Facebook، و X (توییتر سابق) اصالتسنجی کند. همچنین کتابخانههای میانای کاربری را ارائه میدهد تا از سرمایهگذاری قابلتوجهی که برای پیادهسازی و حفظ تجربه اصالتسنجی کامل برای برنامه شما در همه پلاتفرمها لازم است جلوگیری کند.
برای اطلاعات بیشتر، اسناد Firebase Authentication را ببینید.
تفاوتها با Parse Auth
Parse کلاس کاربر تخصصیای بهنام PFUser ارائه میدهد که بهطور خودکار عملکرد موردنیاز برای مدیریت حساب کاربر را انجام میدهد. PFUser زیرکلاسی از
PFObject است، یعنی دادههای کاربر در «تجزیه دادهها» دردسترس است و میتوان آن را با
فیلدهای اضافی مثل هر PFObject دیگری گسترش داد.
FIRUser دارای مجموعهای ثابت از ویژگیهای اصلی است (شناسه یکتا، نشانی ایمیل اصلی،
نام، و نشانی وب عکس) که در پایگاه داده کاربر پروژه جداگانهای ذخیره شده است؛ این ویژگیها را
کاربر میتواند بهروز کند. نمیتوانید داراییهای دیگر را مستقیماً به شیء FIRUser اضافه کنید؛
درعوض، میتوانید داراییهای اضافی را در Firebase Realtime Database خود ذخیره کنید.
در زیر نمونهای از نحوه ثبتنام کاربر و افزودن فیلد شماره تلفن اضافی ارائه شده است.
تجزیه
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"];
}
}];
Firebase
[[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 صادر کنید، سپس فایل را بااستفاده از
دستور auth:import
Firebase CLI به پروژه Firebase خود وارد کنید.
ابتدا پایگاه داده کاربر خود را از کنسول 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 کاربران Parse بهعنوان
localId کاربران Firebase استفاده کنید. همچنین، مقادیر bcryptPassword را از Parse با کدبندی base64 کدگذاری کنید و از آنها در فیلد 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 را بهعنوان الگوریتم درهمسازی مشخص کنید:
firebase auth:import account_file.json --hash-algo=BCRYPT
انتقال دادههای کاربر
اگر دادههای اضافی برای کاربران خود ذخیره میکنید، میتوانید آن را بااستفاده از استراتژیهای شرحدادهشده در بخش انتقال داده به Firebase Realtime Database منتقل کنید. اگر حسابها را بااستفاده از جاریسازی توصیفشده در بخش انتقال حسابها انتقال دهید، حسابهای Firebase شما شناسههای حسابهای Parse شما را خواهند داشت و به شما امکان میدهند بهراحتی هرگونه رابطه کلیدشده براساس شناسه کاربر را انتقال دهید و بازتولید کنید.
Firebase Cloud Messaging
Firebase Cloud Messaging (FCM) یک راهکار پیامرسانی چندسکویی است که به شما امکان میدهد پیامها و اعلانها را بهطور مطمئن و بدون هزینه ارسال کنید. «ترکیبکننده اعلانها» سرویسی رایگان است که در Firebase Cloud Messaging ساخته شده است و اعلانهای کاربر هدفیابیشده را برای توسعهدهندگان برنامه تلفن همراه فعال میکند.
برای اطلاعات بیشتر، اسناد Firebase Cloud Messaging را ببینید.
تفاوتها با اعلانهای لحظهای Parse
هر برنامه Parse که روی دستگاه ثبتشده برای اعلانها نصب میشود،
Installation شیء مرتبطی دارد که در آن همه دادههای لازم برای هدفیابی اعلانها را ذخیره میکنید.
Installation زیرکلاسی از PFUser است، یعنی میتوانید هر داده اضافیای را که میخواهید به نمونههای Installation خود اضافه کنید.
ترکیبکننده «اعلانها» براساس اطلاعاتی مثل برنامه، نسخه برنامه، و زبان دستگاه، بخشهای کاربر ازپیش تعریفشدهای را ارائه میدهد. میتوانید بااستفاده از رویدادها و ویژگیهای Google Analytics، بخشهای کاربر پیچیدهتری برای ساختن مخاطبان ایجاد کنید. برای کسب اطلاعات بیشتر، راهنمای کمک مخاطبان را ببینید. این اطلاعات هدفیابی در Firebase Realtime Database قابلمشاهده نیست.
استراتژی انتقال پیشنهادی
انتقال دادن کدهای دستگاه
درحالیکه Parse از کد دستگاه APNs برای هدفیابی نصبها برای اعلانها استفاده میکند، FCM از FCM کد ثبتنام نگاشتشده به کد دستگاه APNs استفاده میکند. کافی است FCM کیت توسعه نرمافزار را به برنامه Apple خود اضافه کنید و بهطور خودکار یک کد FCM واکشی میکند.
انتقال کانالها به موضوعات FCM
اگر از کانالهای Parse برای ارسال اعلانها استفاده میکنید، میتوانید به موضوعات FCM مهاجرت کنید که همان مدل ناشر-مشترک را ارائه میدهند. برای مدیریت انتقال از Parse به FCM، میتوانید نسخه جدیدی از برنامه بنویسید که از Parse SDK برای لغو اشتراک از کانالهای Parse و از FCM SDK برای مشترک شدن در موضوعات مربوطه FCM استفاده میکند.
برای مثال، اگر کاربر شما در موضوع «Giants» مشترک شده باشد، کاری شبیه به این انجام میدهید:
PFInstallation *currentInstallation = [PFInstallation currentInstallation];
[currentInstallation removeObject:@"Giants" forKey:@"channels"];
[currentInstallation saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
if (succeeded) {
[[FIRMessaging messaging] subscribeToTopic:@"/topics/Giants"];
} else {
// Something went wrong unsubscribing
}
}];
بااستفاده از این استراتژی، میتوانید پیامها را به کانال Parse و موضوع FCM مربوطه ارسال کنید و از کاربران نسخههای قدیمی و جدید پشتیبانی کنید. وقتی کاربران کافی از نسخه فقط Parse برنامه منتقل شدند، میتوانید آن نسخه را از رده خارج کنید و ارسال را فقط بااستفاده از FCM شروع کنید.
برای اطلاعات بیشتر، اسناد موضوعات FCM را ببینید.
Firebase Remote Config
Firebase Remote Config سرویسی ابری است که به شما امکان میدهد رفتار و ظاهر برنامهتان را بدون نیاز به بارگیری بهروزرسانی برنامه توسط کاربران تغییر دهید. هنگام استفاده از «پیکربندی از راه دور»، مقادیر پیشفرض درونبرنامهای ایجاد میکنید که رفتار و ظاهر برنامهتان را کنترل میکنند. سپس، میتوانید بعداً از کنسول Firebase برای لغو مقادیر پیشفرض درونبرنامهای برای همه کاربران برنامه یا بخشهایی از پایگاه کاربرتان استفاده کنید.
Firebase Remote Config میتواند درطول انتقالهای شما بسیار مفید باشد، در مواردی که میخواهید راهحلهای مختلف را آزمایش کنید و بتوانید بهطور پویا مشتریان بیشتری را به ارائهدهنده دیگری منتقل کنید. برای مثال، اگر نسخهای از برنامهتان دارید که هم از Firebase و هم از Parse برای دادهها استفاده میکند، میتوانید از قانون صدک تصادفی استفاده کنید تا مشخص کنید کدام کارخواهها از Firebase میخوانند و بهتدریج درصد را افزایش دهید.
برای کسب اطلاعات بیشتر درباره Firebase Remote Config، Remote Config مقدمه را ببینید.
تفاوتها با پیکربندی تجزیه
با Parse config میتوانید جفتهای کلید/مقدار را در Parse Config Dashboard به برنامهتان اضافه کنید و سپس
PFConfig را در کارخواه واکشی کنید. هر نمونه PFConfig که
دریافت میکنید همیشه تغییرناپذیر است. وقتی در آینده PFConfig جدیدی را از شبکه بازیابی میکنید، هیچیک از نمونههای PFConfig موجود را تغییر نمیدهد، بلکه نمونه جدیدی ایجاد میکند و آن را ازطریق currentConfig دردسترس قرار میدهد.
با Firebase Remote Config، پیشفرضهای درونبرنامهای برای جفتهای کلید/مقدار ایجاد میکنید که میتوانید آنها را از کنسول Firebase لغو کنید، و میتوانید از قوانین و شرایط برای ارائه تنوع در تجربه کاربری برنامهتان به بخشهای مختلف پایگاه کاربرانتان استفاده کنید. Firebase Remote Config یک کلاس تکقلو را پیادهسازی میکند که جفتهای کلید/مقدار را برای برنامهتان دردسترس قرار میدهد. در ابتدا، کلاس تکقلو مقادیر پیشفرضی را که در برنامه تعریف میکنید برمیگرداند. میتوانید در هر زمانی که برای برنامهتان مناسب است، مجموعه جدیدی از مقادیر را از سرور واکشی کنید؛ پساز اینکه مجموعه جدید با موفقیت واکشی شد، میتوانید انتخاب کنید که چه زمانی آن را فعال کنید تا مقادیر جدید برای برنامه دردسترس قرار گیرد.
استراتژی انتقال پیشنهادی
میتوانید با کپی کردن جفتهای کلید/مقدار پیکربندی Parse خود در کنسول Firebase و سپس استقرار نسخه جدیدی از برنامه که از Firebase Remote Config استفاده میکند، به Firebase Remote Config بروید.
اگر میخواهید هم با Parse Config و هم با Firebase Remote Config آزمایش کنید، میتوانید نسخه جدیدی از برنامه را که از هر دو کیت توسعه نرمافزار استفاده میکند مستقر کنید تا زمانی که کاربران کافی از نسخه Parse-only مهاجرت کنند.
مقایسه کد
تجزیه کردن
[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!";
}
}];
Firebase
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;