إذا كنت من مستخدمي التحليل الذين يبحثون عن خلفية بديلة أحد حلول الخدمة، قد يكون Firebase هو الخيار الأمثل لتطبيقك على iOS.
يوضِّح هذا الدليل كيفية دمج خدمات معيَّنة في تطبيقك. بالنسبة تعليمات إعداد Firebase الأساسية، يمكنك الاطلاع على إعداد iOS+ الدليل.
Google Analytics
Google Analytics هو حل مجاني لقياس أداء التطبيقات ويوفر إحصاءات حول استخدام التطبيقات تفاعل المستخدمين. يمكن دمج Analytics مع ميزات Firebase وتوفير عدد غير محدود من الميزات. إعداد تقارير لما يصل إلى 500 حدث مختلف يمكنك تحديده باستخدام حزمة تطوير البرامج (SDK) لمنصّة Firebase
يُرجى الاطّلاع على مستندات Google Analytics للحصول على مزيد من المعلومات.
استراتيجية نقل البيانات المقترَحة
يعد الاستعانة بمقدمي تحليلات مختلفين سيناريو شائع ينطبق بسهولة على Google Analytics ما عليك سوى إضافتها إلى تطبيقك للاستفادة من الأحداث وخصائص المستخدمين التي يجمع تطبيق "Analytics" تلقائيًا بيانات مثل "فتح التطبيق لأول مرة" و"تحديث التطبيق" وطراز الجهاز والعمر.
بالنسبة إلى الأحداث وخصائص المستخدمين المخصّصة، يمكنك استخدام استراتيجية الكتابة المزدوجة باستخدام كل من تحليل "إحصاءات Google" و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 للحصول على مزيد من المعلومات.
الاختلافات في بيانات التحليل
كائنات
في أداة "التحليل"، تخزن 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" } ... } }
قراءة البيانات
في "التحليل"، تقرأ البيانات إما باستخدام معرّف كائن تحليل محدد، أو
جارٍ تنفيذ الطلبات باستخدام PFQuery
.
في Firebase، يمكنك استرداد البيانات من خلال إرفاق مستمع غير متزامن بمرجع قاعدة بيانات. تشير رسالة الأشكال البيانية يتم تشغيل المستمع مرة واحدة للحالة الأولية للبيانات ومرة أخرى عندما تتغير البيانات، لذلك لن تحتاج إلى إضافة أي رمز لتحديد ما إذا كانت البيانات قد تغيّرت.
في ما يلي مثال على كيفية استرداد النتائج للاعب معين، استنادًا إلى المثال المعروض في القسم "Objects".
التحليل
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 لمزامنة البيانات بالملي ثانية على مستوى جميع الأجهزة المتصلة العملاء، ويختلف بنية البيانات الناتجة عن تحليل البيانات الأساسية. وهذا يعني أن تتمثّل الخطوة الأولى في عملية نقل البيانات في التفكير في التغييرات التي تتطلّبها بياناتك، بما في ذلك:
- كيفية ربط عناصر التحليل ببيانات Firebase
- إذا كانت لديك علاقات بين الوالدين والفرع، فكيف تقسِّم بياناتك عبر مسارات مختلفة بحيث يمكن تنزيله بكفاءة في مكالمات منفصلة.
نقل البيانات
بعد أن تقرر كيفية تنظيم بنية بياناتك في Firebase، ستحتاج إلى تخطيط كيفية التعامل مع يحتاج خلالها تطبيقك إلى الكتابة إلى قاعدتَي البيانات. تتمثل الخيارات المتاحة لك في ما يلي:
المزامنة في الخلفية
في هذا السيناريو، لديك إصداران من التطبيق: الإصدار القديم الذي يستخدم Parse وإصدار جديد الإصدار الذي يستخدم Firebase. تتم معالجة عمليات المزامنة بين قاعدتَي البيانات بواسطة Parse Cloud Code (تحليل إلى Firebase)، مع استماع الرمز إلى التغييرات على Firebase ومزامنة هذه التغييرات مع Parse. قبل أن تتمكن من البدء في استخدام الإصدار الجديد، يجب عليك:
- يمكنك تحويل بيانات التحليل الحالية إلى بنية Firebase الجديدة وكتابتها في Firebase Realtime Database
- كتابة دوال تحليل Cloud Code التي تستخدم Firebase REST API للكتابة في Firebase Realtime Database تغييرات تم إجراؤها في تحليل البيانات من قِبل العملاء القدامى
- كتابة ونشر رمز يستمع إلى التغييرات على Firebase ويزامنها مع تحليل قاعدة البيانات.
يضمن هذا السيناريو فصلاً نظيفًا للتعليمات البرمجية القديمة والجديدة، ويجعل العملاء بسيطًا. تشير رسالة الأشكال البيانية في هذا السيناريو هي التعامل مع مجموعات البيانات الكبيرة في التصدير الأولي، والتأكد من أن المزامنة ثنائية الاتجاه لا ينتج عنها تكرار لا نهائي.
كتابة مزدوجة
في هذا السيناريو، أنت تكتب إصدارًا جديدًا من التطبيق يستخدم كلاً من Firebase وParse، باستخدام تحليل رمز السحابة الإلكترونية لمزامنة التغييرات التي أجرتها البرامج القديمة من تحليل البيانات إلى Firebase Realtime Database عند نقل عدد كافٍ من الأشخاص من إصدار التحليل فقط للتطبيق، إزالة رمز التحليل من إصدار الكتابة المزدوجة.
لا يتطلب هذا السيناريو أي رمز من جانب الخادم. ومن عيوبها أن البيانات التي التي يتم الوصول إليها، وأن يكون حجم التطبيق يزداد عند استخدام حزمتي تطوير البرامج (SDK)
Firebase Authentication
يمكن لـ Firebase Authentication مصادقة المستخدمين باستخدام كلمات المرور وموفّري الهوية الموحدة المشهورين. مثل Google وFacebook وTwitter. كما توفر مكتبات واجهة المستخدم لتوفير مساحة الاستثمار المطلوب لتنفيذ تجربة مصادقة كاملة لتطبيقك والحفاظ عليها في على جميع المنصات.
يُرجى الاطّلاع على مستندات Firebase Authentication للحصول على مزيد من المعلومات.
الاختلافات في مصادقة التحليل
يوفّر تحليل البيانات فئة مستخدم متخصّصة تُسمى PFUser
، وهي تعالج تلقائيًا
الوظائف المطلوبة لإدارة حسابات المستخدمين. PFUser
هي فئة فرعية من
PFObject
، ما يعني أنّ بيانات المستخدمين متوفّرة في "بيانات التحليل" ويمكن توسيعها من خلال
حقول إضافية مثل أي 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"];
}
}];
استراتيجية نقل البيانات المقترَحة
نقل الحسابات
لنقل حسابات المستخدمين من "التحليل" إلى Firebase، يمكنك تصدير قاعدة بيانات المستخدمين إلى
كملف JSON أو CSV، ثم عليك استيراد الملف إلى مشروع Firebase باستخدام
واجهة سطر الأوامر في Firebase auth:import
الأمر.
أولاً، قم بتصدير قاعدة بيانات المستخدم الخاصة بك من وحدة تحكم "Parse" (التحليل) أو الخاصة بك المستضافة ذاتيًا قاعدة البيانات. على سبيل المثال، قد يظهر ملف JSON تم تصديره من "وحدة تحكُّم التحليل" مثل ما يلي:
{ // 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.
واجهة سطر الأوامر. استخدام objectId
لمستخدمي التحليل بصفتهم
localId
من مستخدمي Firebase أيضًا، تقوم بترميز base64 أيضًا
قيم 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، مع تحديد التشفير 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 للحصول على مزيد من المعلومات.
الاختلافات في تحليل الإشعارات الفورية
لكل تطبيق تحليل مثبَّت على جهاز مُسجَّل للإشعارات
عنصر Installation
، حيث تخزِّن كل البيانات اللازمة لاستهداف الإشعارات.
Installation
هي فئة فرعية من PFUser
، ما يعني أنه يمكنك إضافة
أيّ بيانات إضافية تريدها في المثيلات Installation
.
يوفّر منشئ "الإشعارات" شرائح محدّدة مسبقًا من المستخدمين استنادًا إلى معلومات مثل التطبيق وإصدار التطبيق والجهاز. . يمكنك إنشاء شرائح مستخدمين أكثر تعقيدًا باستخدام أحداث وخصائص Google Analytics. لإنشاء شرائح الجمهور الاطّلاع على شرائح الجمهور دليل المساعدة لمعرفة المزيد. معلومات الاستهداف هذه غير مرئية في Firebase Realtime Database.
استراتيجية نقل البيانات المقترَحة
نقل الرموز المميّزة للجهاز
تستخدم أداة Parse الرموز المميّزة للجهاز الخاصة بأسماء نقاط الوصول (APN) لاستهداف عمليات التثبيت الخاصة بالإشعارات. FCM يستخدم رمزَين مميّزَين (FCM) للتسجيل تم ربطهما بالرموز المميّزة للأجهزة الخاصة بأسماء نقاط الوصول (APN). ما عليك سوى إضافة FCM حزمة SDK إلى تطبيق Apple وست جلب رمز FCM تلقائيًا.
نقل القنوات إلى FCM مواضيع
إذا كنت تستخدم "تحليل القنوات" لإرسال إشعارات، يمكنك نقل البيانات إلى مواضيع FCM التي توفّر نفس نموذج المشتركين من الناشر لمعالجة عملية الانتقال من "التحليل" إلى "FCM"، يمكنك كتابة نسخة جديدة. للتطبيق الذي يستخدم Parse SDK لإلغاء الاشتراك في قنوات Parse وحزمة تطوير البرامج (SDK) لنظام التشغيل FCM للاشتراك في الخدمة مواضيع 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
}
}];
باستخدام هذه الإستراتيجية، يمكنك إرسال رسائل إلى كل من قناة التحليل والقناة FCM، تتيح لمستخدمي الإصدارَين القديم والجديد عندما يتم نقل بيانات عدد كافٍ من المستخدمين من تحليل إصدار التطبيق فقط، ويمكنك إيقاف هذا الإصدار وبدء الإرسال باستخدام FCM فقط.
يمكنك الاطّلاع على مستندات مواضيع FCM لمعرفة المزيد.
Firebase Remote Config
Firebase Remote Config هي خدمة سحابية تتيح لك تغيير سلوك ومظهر حسابك بدون أن يُطلب من المستخدمين تنزيل تحديث للتطبيق. عند استخدام ميزة "الإعداد عن بُعد"، يتم إنشاء المحتوى داخل التطبيق القيم التلقائية التي تتحكّم في سلوك تطبيقك ومظهره. بعد ذلك، يمكنك لاحقًا استخدام وحدة تحكُّم Firebase لإلغاء القيم التلقائية داخل التطبيق لجميع مستخدمي التطبيق أو لشرائح قاعدة المستخدمين.
يمكن أن تكون Firebase Remote Config مفيدة جدًا أثناء عمليات النقل في الحالات التي تريد فيها اختبار والقدرة على تحويل المزيد من العملاء إلى موفر خدمات مختلف ديناميكيًا. على سبيل المثال: إذا كان لديك إصدار من تطبيقك يستخدِم كلاً من Firebase وParse للبيانات، يمكنك استخدام قاعدة نسبة مئوية عشوائية لتحديد العملاء الذين سيقرأون من Firebase، وزيادة النسبة المئوية تدريجيًا.
لمزيد من المعلومات عن "Firebase Remote Config"، يُرجى الاطّلاع على مقدمة عن Remote Config.
الاختلافات في إعداد التحليل
من خلال إعداد "التحليل"، يمكنك إضافة أزواج مفاتيح/قيم إلى تطبيقك في لوحة بيانات إعداد التحليل، وبعد ذلك
لجلب PFConfig
على العميل. كل PFConfig
مثال
تكون دائمًا غير قابلة للتغيير. عند استرداد قيمة PFConfig
جديدة في المستقبل من
هذه الشبكة، فلن تعدّل أي مثيل PFConfig
حالي، ولكن بدلاً من ذلك
إنشاء تسمية جديدة وإتاحتها عبر currentConfig
.
من خلال Firebase Remote Config، يمكنك إنشاء إعدادات تلقائية داخل التطبيق لأزواج المفاتيح/القيم التي يمكنك إلغاؤها. من وحدة تحكُّم Firebase، ويمكنك استخدام القواعد والشروط لتوفير صيغ مختلفة في تجربة المستخدم مع شرائح مختلفة من قاعدة المستخدمين. تنفّذ Firebase Remote Config فئة مفردة تجعل أزواج المفتاح/القيمة متاحة لتطبيقك. في البداية يعود سينجلتون القيم التلقائية التي تحدِّدها داخل التطبيق. يمكنك استرجاع مجموعة جديدة من القيم من الخادم في أيّ الملاءمة لتطبيقك؛ بعد استرجاع المجموعة الجديدة بنجاح، يمكنك اختيار وقت تفعيلها. لجعل القيم الجديدة متاحة للتطبيق.
استراتيجية نقل البيانات المقترَحة
يمكنك الانتقال إلى Firebase Remote Config من خلال نسخ أزواج المفتاح/القيمة من إعدادات التحليل بوحدة تحكُّم Firebase، ثم نشر إصدار جديد من التطبيق يستخدم Firebase Remote Config.
إذا أردت تجربة كل من "الإعداد التحليلي" و"Firebase Remote Config"، يمكنك نشر التطبيق. إصدار جديد من التطبيق يستخدم كلتا حِزمتَي تطوير البرامج (SDK) إلى أن يتم نقل بيانات عدد كافٍ من المستخدمين من إصدار التحليل فقط
مقارنة الرموز
التحليل
[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;