إذا كنت من مستخدمي التحليل الذين يبحثون عن خلفية بديلة أحد حلول الخدمة، قد يكون Firebase هو الخيار المثالي لتطبيق Android.
يوضِّح هذا الدليل كيفية دمج خدمات معيَّنة في تطبيقك. بالنسبة التعليمات الأساسية لإعداد Firebase، اطّلع على إعداد Android الدليل.
Google Analytics
Google Analytics هو حل مجاني لقياس أداء التطبيقات ويوفر إحصاءات حول استخدام التطبيقات تفاعل المستخدمين. يمكن دمج Analytics مع ميزات Firebase وتوفير عدد غير محدود من الميزات. إعداد تقارير لما يصل إلى 500 حدث مختلف يمكنك تحديده باستخدام حزمة تطوير البرامج (SDK) لمنصّة Firebase
يُرجى الاطّلاع على مستندات Google Analytics للحصول على مزيد من المعلومات.
استراتيجية نقل البيانات المقترَحة
يعد الاستعانة بمقدمي تحليلات مختلفين سيناريو شائع ينطبق بسهولة على Google Analytics ما عليك سوى إضافتها إلى تطبيقك للاستفادة من الأحداث وخصائص المستخدمين التي يجمع تطبيق "Analytics" تلقائيًا بيانات مثل "فتح التطبيق لأول مرة" و"تحديث التطبيق" وطراز الجهاز والعمر.
بالنسبة إلى الأحداث وخصائص المستخدمين المخصّصة، يمكنك استخدام استراتيجية الكتابة المزدوجة باستخدام كل من تحليل "إحصاءات Google" وGoogle Analytics لتسجيل الأحداث والمواقع، ما يتيح لك ونطرح الحل الجديد تدريجيًا.
مقارنة الرموز
إحصاءات التحليل
// Start collecting data
ParseAnalytics.trackAppOpenedInBackground(getIntent());
Map<String, String> dimensions = new HashMap<String, String>();
// Define ranges to bucket data points into meaningful segments
dimensions.put("priceRange", "1000-1500");
// Did the user filter the query?
dimensions.put("source", "craigslist");
// Do searches happen more often on weekdays or weekends?
dimensions.put("dayType", "weekday");
// Send the dimensions to Parse along with the 'search' event
ParseAnalytics.trackEvent("search", dimensions);
Google Analytics
// Obtain the FirebaseAnalytics instance and start collecting data
mFirebaseAnalytics = FirebaseAnalytics.getInstance(this);
Bundle params = new Bundle();
// Define ranges to bucket data points into meaningful segments
params.putString("priceRange", "1000-1500");
// Did the user filter the query?
params.putString("source", "craigslist");
// Do searches happen more often on weekdays or weekends?
params.putString("dayType", "weekday");
// Send the event
mFirebaseAnalytics.logEvent("search", params);
Firebase Realtime Database
Firebase Realtime Database هي قاعدة بيانات مستضافة على السحابة الإلكترونية NoSQL. يتم تخزين البيانات على هيئة JSON متزامنة في الوقت الفعلي مع كل عميل متصل.
يُرجى الاطّلاع على مستندات Firebase Realtime Database للحصول على مزيد من المعلومات.
الاختلافات في بيانات التحليل
كائنات
في أداة "التحليل"، تخزن ParseObject
، أو فئة فرعية منها، تحتوي على أزواج المفتاح/القيمة.
من البيانات المتوافقة مع JSON. البيانات غير مخططة، مما يعني أنك لست بحاجة إلى تحديد المفاتيح
متوفّر على كل ParseObject
.
يتم تخزين جميع بيانات Firebase Realtime Database ككائنات JSON، ولا توجد مكافئة
ParseObject
؛ فما عليك سوى كتابة قيم شجرة JSON للأنواع التي تتوافق
إلى أنواع JSON المتاحة.
يمكنك استخدام كائنات Java لتبسيط القراءة والكتابة من
قاعدة البيانات.
فيما يلي مثال على كيفية حفظ أعلى النتائج لإحدى الألعاب.
التحليل
@ParseClassName("GameScore")
public class GameScore {
public GameScore() {}
public GameScore(Long score, String playerName, Boolean cheatMode) {
setScore(score);
setPlayerName(playerName);
setCheatMode(cheatMode);
}
public void setScore(Long score) {
set("score", score);
}
public Long getScore() {
return getLong("score");
}
public void setPlayerName(String playerName) {
set("playerName", playerName);
}
public String getPlayerName() {
return getString("playerName");
}
public void setCheatMode(Boolean cheatMode) {
return set("cheatMode", cheatMode);
}
public Boolean getCheatMode() {
return getBoolean("cheatMode");
}
}
// Must call Parse.registerSubclass(GameScore.class) in Application.onCreate
GameScore gameScore = new GameScore(1337, "Sean Plott", false);
gameScore.saveInBackground();
Firebase
// Assuming we defined the GameScore class as:
public class GameScore {
private Long score;
private String playerName;
private Boolean cheatMode;
public GameScore() {}
public GameScore(Long score, String playerName, Boolean cheatMode) {
this.score = score;
this.playerName = playerName;
this.cheatMode = cheatMode;
}
public Long getScore() {
return score;
}
public String getPlayerName() {
return playerName;
}
public Boolean getCheatMode() {
return cheatMode;
}
}
// We would save it to our list of high scores as follows:
DatabaseReference mFirebaseRef = FirebaseDatabase.getInstance().getReference();
GameScore score = new GameScore(1337, "Sean Plott", false);
mFirebaseRef.child("scores").push().setValue(score);
العلاقات بين البيانات
يمكن أن يكون هناك علاقة بين ParseObject
وParseObject
آخر: أي
كائن يمكنه استخدام كائنات أخرى كقيم.
في Firebase Realtime Database، يتم التعبير عن العلاقات بشكل أفضل باستخدام هياكل البيانات المسطحة التي تقسيم البيانات إلى مسارات منفصلة، بحيث يمكن تنزيلها بكفاءة في مكالمات منفصلة.
فيما يلي مثال على كيفية هيكلة العلاقة بين المشاركات في تطبيق التدوين ومؤلفيها.
التحليل
// Create the author
ParseObject myAuthor = new ParseObject("Author");
myAuthor.put("name", "Grace Hopper");
myAuthor.put("birthDate", "December 9, 1906");
myAuthor.put("nickname", "Amazing Grace");
// Create the post
ParseObject myPost = new ParseObject("Post");
myPost.put("title", "Announcing COBOL, a New Programming Language");
// Add a relation between the Post and the Author
myPost.put("parent", myAuthor);
// This will save both myAuthor and myPost
myPost.saveInBackground();
Firebase
DatabaseReference firebaseRef = FirebaseDatabase.getInstance().getReference();
// Create the author
Map<String, String> myAuthor = new HashMap<String, String>();
myAuthor.put("name", "Grace Hopper");
myAuthor.put("birthDate", "December 9, 1906");
myAuthor.put("nickname", "Amazing Grace");
// Save the author
String myAuthorKey = "ghopper";
firebaseRef.child('authors').child(myAuthorKey).setValue(myAuthor);
// Create the post
Map<String, String> post = new HashMap<String, String>();
post.put("author", myAuthorKey);
post.put("title", "Announcing COBOL, a New Programming Language");
firebaseRef.child('posts').push().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" } ... } }
قراءة البيانات
في "التحليل"، تقرأ البيانات إما باستخدام معرّف كائن تحليل محدد، أو
جارٍ تنفيذ الطلبات باستخدام ParseQuery
.
في Firebase، يمكنك استرداد البيانات من خلال إرفاق مستمع غير متزامن بمرجع قاعدة بيانات. تشير رسالة الأشكال البيانية يتم تشغيل المستمع مرة واحدة للحالة الأولية للبيانات ومرة أخرى عندما تتغير البيانات، لذلك لن تحتاج إلى إضافة أي رمز لتحديد ما إذا كانت البيانات قد تغيّرت.
في ما يلي مثال على كيفية استرداد النتائج للاعب معين، استنادًا إلى المثال المعروض في القسم "Objects".
التحليل
ParseQuery<ParseObject> query = ParseQuery.getQuery("GameScore");
query.whereEqualTo("playerName", "Dan Stemkoski");
query.findInBackground(new FindCallback<ParseObject>() {
public void done(List<ParseObject> scoreList, ParseException e) {
if (e == null) {
for (ParseObject score: scoreList) {
Log.d("score", "Retrieved: " + Long.toString(score.getLong("score")));
}
} else {
Log.d("score", "Error: " + e.getMessage());
}
}
});
Firebase
DatabaseReference mFirebaseRef = FirebaseDatabase.getInstance().getReference();
Query mQueryRef = mFirebaseRef.child("scores").orderByChild("playerName").equalTo("Dan Stemkoski");
// This type of listener is not one time, and you need to cancel it to stop
// receiving updates.
mQueryRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot snapshot, String previousChild) {
// This will fire for each matching child node.
GameScore score = snapshot.getValue(GameScore.class);
Log.d("score", "Retrieved: " + Long.toString(score.getScore());
}
});
استراتيجية نقل البيانات المقترَحة
إعادة النظر في بياناتك
تم تحسين 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 للحصول على مزيد من المعلومات.
الاختلافات في مصادقة التحليل
يوفّر تحليل البيانات فئة مستخدم متخصّصة تُسمى ParseUser
، وهي تعالج تلقائيًا
الوظائف المطلوبة لإدارة حسابات المستخدمين. ParseUser
هي فئة فرعية من
ParseObject
، ما يعني أنّ بيانات المستخدمين متوفّرة في "بيانات التحليل" ويمكن توسيعها من خلال
حقول إضافية مثل أي ParseObject
أخرى.
يحتوي النطاق FirebaseUser
على مجموعة ثابتة من المواقع الأساسية، مثل معرّف فريد وعنوان بريد إلكتروني رئيسي
اسم وعنوان URL للصورة - مخزنان في قاعدة بيانات مستخدم مشروع منفصل؛ يمكن تحديث هذه الخصائص عن طريق
المستخدم. لا يمكنك إضافة سمات أخرى إلى العنصر FirebaseUser
مباشرةً.
بدلاً من ذلك، يمكنك تخزين السمات الإضافية في Firebase Realtime Database.
في ما يلي مثال على كيفية تسجيل اشتراك مستخدِم وإضافة حقل رقم هاتف آخر.
التحليل
ParseUser user = new ParseUser();
user.setUsername("my name");
user.setPassword("my pass");
user.setEmail("email@example.com");
// other fields can be set just like with ParseObject
user.put("phone", "650-253-0000");
user.signUpInBackground(new SignUpCallback() {
public void done(ParseException e) {
if (e == null) {
// Hooray! Let them use the app now.
} else {
// Sign up didn't succeed. Look at the ParseException
// to figure out what went wrong
}
}
});
Firebase
FirebaseAuth mAuth = FirebaseAuth.getInstance();
mAuth.createUserWithEmailAndPassword("email@example.com", "my pass")
.continueWithTask(new Continuation<AuthResult, Task<Void>> {
@Override
public Task<Void> then(Task<AuthResult> task) {
if (task.isSuccessful()) {
FirebaseUser user = task.getResult().getUser();
DatabaseReference firebaseRef = FirebaseDatabase.getInstance().getReference();
return firebaseRef.child("users").child(user.getUid()).child("phone").setValue("650-253-0000");
} else {
// User creation didn't succeed. Look at the task exception
// to figure out what went wrong
Log.w(TAG, "signInWithEmail", task.getException());
}
}
});
استراتيجية نقل البيانات المقترَحة
نقل الحسابات
لنقل حسابات المستخدمين من "التحليل" إلى 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
هي فئة فرعية من ParseUser
، ما يعني أنه يمكنك إضافة
أيّ بيانات إضافية تريدها في المثيلات Installation
.
يوفّر منشئ "الإشعارات" شرائح محدّدة مسبقًا من المستخدمين استنادًا إلى معلومات مثل التطبيق وإصدار التطبيق والجهاز. . يمكنك إنشاء شرائح مستخدمين أكثر تعقيدًا باستخدام أحداث وخصائص Google Analytics. لإنشاء شرائح الجمهور الاطّلاع على شرائح الجمهور دليل المساعدة لمعرفة المزيد. معلومات الاستهداف هذه غير مرئية في Firebase Realtime Database.
استراتيجية نقل البيانات المقترَحة
نقل الرموز المميّزة للجهاز
في وقت كتابة هذه الرسالة، كانت حزمة تطوير البرامج (SDK) الخاصة بتحليلات Android تستخدم إصدارًا قديمًا من خدمة "المراسلة عبر السحابة الإلكترونية من Firebase" رموز التسجيل المميزة، غير متوافقة مع الميزات التي يوفرها مؤلف الإشعارات.
يمكنك الحصول على رمز مميّز جديد من خلال إضافة حزمة تطوير البرامج (SDK) لخدمة "المراسلة عبر السحابة الإلكترونية من Firebase" إلى تطبيقك. وَلَكِنْ قد يؤدي ذلك إلى إلغاء صلاحية الرمز المميّز الذي تستخدمه حزمة Parse SDK لتلقّي الإشعارات. إذا أردت تجنُّب ذلك، يمكنك إعداد Parse SDK لاستخدام معرّف المُرسِل في Parse. ومعرّف المرسِل. بهذه الطريقة، لا يتم إلغاء صلاحية الرمز المميّز الذي تستخدمه حزمة Parse SDK. ولكن اعلم أن هذا الحل البديل سيتوقف عن العمل عند إيقاف مشروع Parse لمشروعها.
نقل القنوات إلى FCM مواضيع
إذا كنت تستخدم قنوات التحليل لإرسال الإشعارات، يمكنك نقل البيانات إلى مواضيع "المراسلة عبر السحابة الإلكترونية من Firebase"، والتي توفر نفس نموذج المشتركين من الناشر لمعالجة عملية الانتقال من "التحليل" إلى "المراسلة عبر السحابة الإلكترونية من Firebase"، يمكنك كتابة إصدار جديد للتطبيق الذي يستخدم Parse SDK لإلغاء الاشتراك في قنوات Parse وحزمة تطوير البرامج (SDK) لخدمة FCM للاشتراك فيهما مواضيع المراسلة عبر السحابة الإلكترونية من Firebase المقابلة في هذا الإصدار من التطبيق، يجب إيقاف ميزة تلقّي الإشعارات على تحليل حزمة تطوير البرامج (SDK)، مع إزالة ما يلي من ملف بيان التطبيق:
<service android:name="com.parse.PushService" />
<receiver android:name="com.parse.ParsePushBroadcastReceiver"
android:exported="false">
<intent-filter>
<action android:name="com.parse.push.intent.RECEIVE" />
<action android:name="com.parse.push.intent.DELETE" />
<action android:name="com.parse.push.intent.OPEN" />
</intent-filter>
</receiver>
<receiver android:name="com.parse.GcmBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<!--
IMPORTANT: Change "com.parse.starter" to match your app's package name.
-->
<category android:name="com.parse.starter" />
</intent-filter>
</receiver>
<!--
IMPORTANT: Change "YOUR_SENDER_ID" to your GCM Sender Id.
-->
<meta-data android:name="com.parse.push.gcm_sender_id"
android:value="id:YOUR_SENDER_ID" />;
على سبيل المثال، إذا كان المستخدم مشتركًا في مجموعة Giants ، قد تفعل شيئًا مثل:
ParsePush.unsubscribeInBackground("Giants", new SaveCallback() {
@Override
public void done(ParseException e) {
if (e == null) {
FirebaseMessaging.getInstance().subscribeToTopic("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.
الاختلافات في إعداد التحليل
من خلال إعداد "التحليل"، يمكنك إضافة أزواج مفاتيح/قيم إلى تطبيقك في لوحة بيانات إعداد التحليل، وبعد ذلك
لجلب ParseConfig
على العميل. كل ParseConfig
مثال
تكون دائمًا غير قابلة للتغيير. عند استرداد قيمة ParseConfig
جديدة في المستقبل من
هذه الشبكة، فلن تعدّل أي مثيل ParseConfig
حالي، ولكن بدلاً من ذلك
إنشاء تسمية جديدة وإتاحتها عبر getCurrentConfig()
.
من خلال Firebase Remote Config، يمكنك إنشاء إعدادات تلقائية داخل التطبيق لأزواج المفاتيح/القيم التي يمكنك إلغاؤها. من وحدة تحكُّم Firebase، ويمكنك استخدام القواعد والشروط لتوفير صيغ مختلفة في تجربة المستخدم مع شرائح مختلفة من قاعدة المستخدمين. تنفّذ Firebase Remote Config فئة مفردة تجعل أزواج المفتاح/القيمة متاحة لتطبيقك. في البداية يعود سينجلتون القيم التلقائية التي تحدِّدها داخل التطبيق. يمكنك استرجاع مجموعة جديدة من القيم من الخادم في أيّ الملاءمة لتطبيقك؛ بعد استرجاع المجموعة الجديدة بنجاح، يمكنك اختيار وقت تفعيلها. لجعل القيم الجديدة متاحة للتطبيق.
استراتيجية نقل البيانات المقترَحة
يمكنك الانتقال إلى Firebase Remote Config من خلال نسخ أزواج المفتاح/القيمة من إعدادات التحليل بوحدة تحكُّم Firebase، ثم نشر إصدار جديد من التطبيق يستخدم Firebase Remote Config.
إذا أردت تجربة كل من "الإعداد التحليلي" و"Firebase Remote Config"، يمكنك نشر التطبيق. إصدار جديد من التطبيق يستخدم كلتا حِزمتَي تطوير البرامج (SDK) إلى أن يتم نقل بيانات عدد كافٍ من المستخدمين من إصدار التحليل فقط
مقارنة الرموز
التحليل
ParseConfig.getInBackground(new ConfigCallback() {
@Override
public void done(ParseConfig config, ParseException e) {
if (e == null) {
Log.d("TAG", "Yay! Config was fetched from the server.");
} else {
Log.e("TAG", "Failed to fetch. Using Cached Config.");
config = ParseConfig.getCurrentConfig();
}
// Get the message from config or fallback to default value
String welcomeMessage = config.getString("welcomeMessage", "Welcome!");
}
});
Firebase
mFirebaseRemoteConfig = FirebaseRemoteConfig.getInstance();
// Set defaults from an XML resource file stored in res/xml
mFirebaseRemoteConfig.setDefaults(R.xml.remote_config_defaults);
mFirebaseRemoteConfig.fetch()
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Log.d("TAG", "Yay! Config was fetched from the server.");
// Once the config is successfully fetched it must be activated before newly fetched
// values are returned.
mFirebaseRemoteConfig.activateFetched();
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
Log.e("TAG", "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.
String welcomeMessage = mFirebaseRemoteConfig.getString("welcomeMessage");