اگر کاربر Parse هستید که به دنبال راه حل جایگزین Backend به عنوان سرویس هستید، Firebase ممکن است انتخاب ایده آلی برای برنامه iOS شما باشد.
این راهنما نحوه ادغام سرویس های خاص را در برنامه خود توضیح می دهد. برای دستورالعملهای اولیه راهاندازی Firebase، راهنمای راهاندازی iOS+ را ببینید.
Google Analytics
Google Analytics یک راه حل رایگان اندازه گیری برنامه است که بینشی در مورد استفاده از برنامه و تعامل کاربر ارائه می دهد. Analytics با ویژگیهای Firebase ادغام میشود و گزارش نامحدودی را برای حداکثر 500 رویداد متمایز در اختیار شما قرار میدهد که میتوانید با استفاده از Firebase SDK تعریف کنید.
برای کسب اطلاعات بیشتر به اسناد Google Analytics مراجعه کنید.
استراتژی مهاجرت پیشنهادی
استفاده از ارائه دهندگان مختلف تجزیه و تحلیل سناریوی رایجی است که به راحتی در Google Analytics اعمال می شود. کافی است آن را به برنامه خود اضافه کنید تا از رویدادها و ویژگی های کاربر که 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];
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 to Firebase) انجام می شود و کد شما به تغییرات در Firebase گوش می دهد و آن تغییرات را با Parse همگام می کند. قبل از شروع استفاده از نسخه جدید، باید:
- داده های تجزیه موجود خود را به ساختار جدید Firebase تبدیل کنید و آن را در Firebase Realtime Database بنویسید.
- توابع Parse Cloud Code را بنویسید که از Firebase REST API برای نوشتن تغییرات Firebase Realtime Database توسط مشتریان قدیمی در Parse Data استفاده می کند.
- کدی را بنویسید و مستقر کنید که به تغییرات در Firebase گوش می دهد و آنها را با پایگاه داده Parse همگام می کند.
این سناریو جداسازی کدهای قدیمی و جدید را تضمین می کند و کلاینت ها را ساده نگه می دارد. چالشهای این سناریو مدیریت مجموعه دادههای بزرگ در صادرات اولیه و اطمینان از اینکه همگامسازی دو جهته بازگشت بینهایت ایجاد نمیکند، است.
دوبار بنویس
در این سناریو، نسخه جدیدی از برنامه را مینویسید که از Firebase و Parse استفاده میکند و با استفاده از Parse Cloud Code، تغییرات ایجاد شده توسط مشتریان قدیمی را از Parse Data به Firebase Realtime Database همگامسازی میکند. وقتی تعداد زیادی از افراد از نسخه فقط پارسی برنامه مهاجرت کردند، میتوانید کد تجزیه را از نسخه نوشتن دوبل حذف کنید.
این سناریو به کد سمت سرور نیاز ن��ارد. معایب آن این است که دادههایی که به آنها دسترسی ندارند منتقل نمیشوند و اندازه برنامه شما با استفاده از هر دو SDK افزایش مییابد.
Firebase Authentication
Firebase Authentication می تواند کاربران را با استفاده از گذرواژه ها و ارائه دهندگان هویت فدرال محبوب مانند Google، Facebook و Twitter احراز هویت کند. همچنین کتابخانههای رابط کاربری را فراهم میکند تا در سرمایهگذاری قابل توجهی که برای پیادهسازی و حفظ یک تجربه احراز هویت کامل برای برنامه شما در همه پلتفرمها لازم است، صرفهجویی کند.
برای اطلاعات بیشتر به اسناد Firebase Authentication مراجعه کنید.
تفاوت با Parse Auth
Parse یک کلاس کاربری تخصصی به نام PFUser
ارائه می دهد که به طور خودکار عملکردهای مورد نیاز برای مدیریت حساب کاربری را کنترل می کند. PFUser
یک زیر کلاس از PFObject
است که به این معنی است که داده های کاربر در Parse Data موجود است و می تواند با فیلدهای اضافی مانند هر PFObject
دیگر گسترش یابد.
یک FIRUser
دارای مجموعه ای ثابت از ویژگی های اساسی است - یک شناسه منحصر به فرد، یک آدرس ایمیل اصلی، یک نام و یک URL عکس - ذخیره شده در پایگاه داده کاربر یک پروژه جداگانه. این ویژگی ها می توانند توسط کاربر به روز شوند. شما نمی توانید خصوصیات دیگری را مستقیماً به شی 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 خود استفاده کنید. همچنین، base64 مقادیر bcryptPassword
را از Parse رمزگذاری کرده و در قسمت 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 شما همان شناسههای حسابهای پارسی شما را دارند و به شما این امکان را میدهند که به راحتی هر رابطهای را که توسط شناسه کاربری کلید شده است، منتقل کرده و بازتولید کنید.
Firebase Cloud Messaging
Firebase Cloud Messaging ( FCM ) یک راهحل پیامرسانی چند پلتفرمی است که به شما امکان میدهد پیامها و اعلانها را بدون هیچ هزینهای به طور قابل اعتماد تحویل دهید. Notifications composer یک سرویس بدون هزینه است که بر روی Firebase Cloud Messaging ساخته شده است که اعلانهای هدفمند کاربران را برای توسعهدهندگان برنامههای تلفن همراه فعال میکند.
برای اطلاعات بیشتر به اسناد Firebase Cloud Messaging مراجعه کنید.
تفاوتها با اعلانهای فشاری تجزیه
هر برنامه Parse نصب شده روی دستگاهی که برای اعلانها ثبت شده است، یک شیء Installation
مرتبط دارد که در آن شما تمام دادههای مورد نیاز برای هدفیابی اعلانها را ذخیره میکنید. Installation
یک زیر کلاس از PFUser
است، به این معنی که می توانید هر داده اضافی را که می خواهید به نمونه های Installation
خود اضافه کنید.
سازنده Notifications بخشهای کاربر از پیش تعریفشده را بر اساس اطلاعاتی مانند برنامه، نسخه برنامه و زبان دستگاه ارائه میکند. میتوانید با استفاده از رویدادها و ویژگیهای Google Analytics برای ایجاد مخاطب، بخشهای کاربری پیچیدهتری بسازید. برای کسب اطلاعات بیشتر به راهنمای راهنمای مخاطبان مراجعه کنید. این اطلاعات هدف گیری در Firebase Realtime Database قابل مشاهده نیست.
استراتژی مهاجرت پیشنهادی
انتقال توکن های دستگاه
در حالی که Parse از نشانههای دستگاه APN برای هدفیابی نصبها برای اعلانها استفاده میکند، FCM از نشانههای ثبت FCM نگاشت شده به نشانههای دستگاه APN استفاده میکند. فقط کافی است FCM SDK را به برنامه Apple خود اضافه کنید و به طور خودکار یک توکن 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 (succeeded) {
[[FIRMessaging messaging] subscribeToTopic:@"/topics/Giants"];
} else {
// Something went wrong unsubscribing
}
}];
با استفاده از این استراتژی، می توانید هم به کانال پارس و هم به موضوع FCM مربوطه پیام ارسال کنید و از کاربران نسخه های قدیمی و جدید پ��تیبانی کنید. وقتی تعداد زیادی کاربر از نسخه فقط تجزیه برنامه مهاجرت کرده اند، می توانید آن نسخه را غروب کنید و فقط با استفاده از FCM ارسال را شروع کنید.
برای کسب اطلاعات بیشتر به اسناد موضوعات FCM مراجعه کنید.
Firebase Remote Config
Firebase Remote Config یک سرویس ابری است که به شما امکان می دهد رفتار و ظاهر برنامه خود را بدون نیاز به دانلود به روز رسانی برنامه توسط کاربران تغییر دهید. هنگام استفاده از Remote Config، مقادیر پیشفرض درون برنامهای ایجاد میکنید که رفتار و ظاهر برنامه شما را کنترل میکند. سپس، بعداً میتوانید از کنسول Firebase برای لغو مقادیر پیشفرض درون برنامه برای همه کاربران برنامه یا برای بخشهایی از پایگاه کاربری خود استفاده کنید.
Firebase Remote Config میتواند در مواردی که میخواهید راهحلهای مختلفی را آزمایش کنید و بتوانید مشتریان بیشتری را بهصورت پویا به یک ارائهدهنده دیگر منتقل کنید، در طول مهاجرتهای شما بسیار مفید باشد. به عنوان مثال، اگر نسخه ای از برنامه خود دارید که از Firebase و Parse برای داده ها استفاده می کند، می توانید از یک قانون صدک تصادفی برای تعیین اینکه کدام کلاینت ها از Firebase می خوانند استفاده کنید و به تدریج درصد را افزایش دهید.
برای کسب اطلاعات بیشتر در مورد Firebase Remote Config ، به معرفی Remote Config مراجعه کنید.
تفاوت با Parse Config
با پیکربندی Parse میتوانید جفتهای کلید/مقدار را در داشبورد Parse Config به برنامه خود اضافه کنید و سپس PFConfig
در کلاینت واکشی کنید. هر نمونه PFConfig
که دریافت می کنید همیشه تغییرناپذیر است. هنگامی که یک PFConfig
جدید را در آینده از شبکه بازیابی می کنید، هیچ نمونه PFConfig
موجود را تغییر نمی دهد، بلکه یک نمونه جدید ایجاد می کند و آن را از طریق currentConfig
در دسترس قرار می دهد.
با Firebase Remote Config ، پیشفرضهای درونبرنامهای را برای جفتهای کلید/مقدار ایجاد میکنید که میتوانید از کنسول Firebase آنها را لغو کنید، و میتوانید از قوانین و شرایط برای ارائه تغییرات در تجربه کاربری برنامهتان برای بخشهای مختلف پایگاه کاربری خود استفاده کنید. Firebase Remote Config یک کلاس singleton را پیادهسازی میکند که جفتهای کلید/مقدار را در دسترس برنامه شما قرار میدهد. در ابتدا singleton مقادیر پیش فرضی را که در برنامه تعریف کرده اید برمی گرد��ند. شما می توانید مجموعه ای جدید از مقادیر را در هر لحظه مناسب برای برنامه خود از سرور دریافت کنید. پس از اینکه مجموعه جدید با موفقیت واکشی شد، می توانید انتخاب کنید که چ�� ��مانی آن را ف��ال کنید تا مقادیر جدید در دسترس برنامه قرار گیرند.
استراتژی مهاجرت پیشنهادی
میتوانید با کپی کردن جفتهای کلید/مقدار پیکربندی Parse خود در کنسول Firebase، و سپس استقرار نسخه جدیدی از برنامه که از Firebase Remote Config استفاده میکند، به Firebase Remote Config بروید.
اگر میخواهید با Parse Config و Firebase Remote Config آزمایش کنید، میتوانید نسخه جدیدی از برنامه را اجرا کنید که از هر دو SDK استفاده میکند تا زمانی که کاربران کافی از نسخه 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;