برنامه Android Parse خود را به Firebase منتقل کنید

اگر کاربر Parse هستید که به دنبال راه حل جایگزینی Backend به عنوان سرویس هستید، Firebase ممکن است انتخاب ایده آلی برای برنامه اندروید شما باشد.

این راهنما نحوه ادغام سرویس های خاص را در برنامه خود توضیح می دهد. برای دستورالعمل‌های اولیه راه‌اندازی Firebase، راهنمای راه‌اندازی Android را ببینید.

Google Analytics

Google Analytics یک راه حل رایگان اندازه گیری برنامه است که بینشی در مورد استفاده از برنامه و تعامل کاربر ارائه می دهد. Analytics با ویژگی‌های Firebase ادغام می‌شود و گزارش نامحدودی را برای حداکثر 500 رویداد متمایز در اختیار شما قرار می‌دهد که می‌توانید با استفاده از Firebase SDK تعریف کنید.

برای کسب اطلاعات بیشتر به اسناد Google Analytics مراجعه کنید.

استراتژی مهاجرت پیشنهادی

استفاده از ارائه دهندگان مختلف تجزیه و تحلیل سناریوی رایجی است که به راحتی در Google Analytics اعمال می شود. کافی است آن را به برنامه خود اضافه کنید تا از رویدادها و ویژگی های کاربر که Analytics به طور خودکار جمع آوری می کند، مانند اولین باز، به روز رسانی برنامه، مدل دستگاه، سن، بهره مند شوید.

برای رویدادهای سفارشی و ویژگی‌های کاربر، می‌توانید از یک استراتژی نوشتن مضاعف با استفاده از تجزیه و تحلیل تجزیه و تحلیل و 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 مراجعه کنید.

تفاوت با تجزیه داده ها

اشیاء

در Parse شما یک ParseObject یا زیر کلاسی از آن را ذخیره می‌کنید که حاوی جفت‌های کلید-مقدار داده‌های سازگار با JSON است. داده بدون طرح است، به این معنی که شما نیازی به تعیین کلیدهای موجود در هر ParseObject ندارید.

تمام داده های Firebase Realtime Database به عنوان اشیاء JSON ذخیره می شوند و هیچ معادلی برای ParseObject وجود ندارد. شما به سادگی در درخت JSON مقادیر انواعی را که با انواع JSON موجود مطابقت دارد بنویسید. می توانید از اشیاء جاوا برای ساده کردن خواندن و نوشتن از پایگاه داده استفاده کنید.

در زیر مثالی از نحوه ذخیره امتیازات بالا برای یک بازی آورده شده است.

تجزیه
@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"
    }
    ...
  }
}
برای جزئیات بیشتر، راهنمای Structure Your Database را بررسی کنید.

خواندن داده ها

در Parse شما داده ها را با استفاده از شناسه یک شی Parse خاص یا اجرای پرس و جوها با استفاده از ParseQuery می خوانید.

در Firebase، با پیوست کردن یک شنونده ناهمزمان به یک مرجع پایگاه داده، داده ها را بازیابی می کنید. شنونده یک بار برای وضعیت اولیه داده ها و دوباره زمانی که داده ها تغییر می کند فعال می شود، بنابراین برای تعیین اینکه آیا داده ها تغییر کرده اند نیازی به اضافه کردن کد ندارید.

در زیر نمونه ای از نحوه بازیابی امتیازات برای یک بازیکن خاص، بر اساس مثال ارائه شده در بخش "اشیاء" آورده شده است.

تجزیه
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());
    }
});
برای جزئیات بیشتر در مورد انواع موجود شنونده رویداد و نحوه سفارش و فیلتر کردن داده ها، راهنمای خواندن و نوشتن داده ها در Android را بررسی کنید.

استراتژی مهاجرت پیشنهادی

در داده های خود تجدید نظر کنید

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 یک کلاس کاربری تخصصی به نام ParseUser ارائه می دهد که به طور خودکار عملکردهای مورد نیاز برای مدیریت حساب کاربری را کنترل می کند. ParseUser یک زیر کلاس از ParseObject است، به این معنی که داده های کاربر در Parse Data موجود است و می تواند با فیلدهای اضافی مانند هر 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());
            }
        }
    });

استراتژی مهاجرت پیشنهادی

مهاجرت به حساب ها

برای انتقال حساب های کاربری از 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 یک زیر کلاس از ParseUser است، به این معنی که می توانید هر داده اضافی را که می خواهید به نمونه های Installation خود اضافه کنید.

سازنده Notifications بخش‌های کاربر از پیش تعریف‌شده را بر اساس اطلاعاتی مانند برنامه، نسخه برنامه و زبان دستگاه ارائه می‌کند. می‌توانید با استفاده از رویدادها و ویژگی‌های Google Analytics برای ایجاد مخاطب، بخش‌های کاربری پیچیده‌تری بسازید. برای کسب اطلاعات بیشتر به راهنمای راهنمای مخاطبان مراجعه کنید. این اطلاعات هدف گیری در Firebase Realtime Database قابل مشاهده نیستند.

استراتژی مهاجرت پیشنهادی

انتقال توکن های دستگاه

در زمان نگارش، تحلیل SDK Android از نسخه قدیمی‌تری از نشانه‌های ثبت FCM استفاده می‌کند که با ویژگی‌های ارائه‌شده توسط Notifications composer سازگار نیست.

می توانید با افزودن FCM SDK به برنامه خود، یک توکن جدید دریافت کنید. با این حال، این ممکن است رمز استفاده شده توسط Parse SDK برای دریافت اعلان‌ها را باطل کند. اگر می‌خواهید از آن جلوگیری کنید، می‌توانید SDK را برای استفاده از شناسه فرستنده پارس و شناسه فرستنده خود تنظیم کنید. به این ترتیب رمز استفاده شده توسط Parse SDK را باطل نمی‌کنید، اما توجه داشته باشید که وقتی پارس پروژه خود را تعطیل می‌کند، این راه‌حل کار خود را متوقف می‌کند.

انتقال کانال ها به موضوعات FCM

اگر از کانال‌های Parse برای ارسال اعلان‌ها استفاده می‌کنید، می‌توانید به موضوعات FCM که همان مدل ناشر-مشترک را ارائه می‌دهند، مهاجرت کنید. برای انجام انتقال از Parse به FCM، می‌توانید نسخه جدیدی از برنامه بنویسید که از Parse SDK برای لغو اشتراک از کانال‌های Parse و از FCM SDK برای اشتراک در موضوعات مربوطه FCM استفاده می‌کند. در این نسخه از برنامه، باید دریافت اعلان‌ها را در Parse 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" />;

به عنوان مثال، اگر کاربر شما در موضوع "غول ها" مشترک شده باشد، کاری شبیه به:

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 یک سرویس ابری است که به شما امکان می دهد رفتار و ظاهر برنامه خود را بدون نیاز به دانلود به روز رسانی برنامه توسط کاربران تغییر دهید. هنگام استفاده از Remote Config، مقادیر پیش‌فرض درون برنامه‌ای ایجاد می‌کنید که رفتار و ظاهر برنامه شما را کنترل می‌کند. سپس، بعداً می‌توانید از کنسول Firebase برای لغو مقادیر پیش‌فرض درون برنامه برای همه کاربران برنامه یا برای بخش‌هایی از پایگاه کاربری خود استفاده کنید.

Firebase Remote Config می‌تواند در مواردی که می‌خواهید راه‌حل‌های مختلفی را آزمایش کنید و بتوانید مشتریان بیشتری را به‌صورت پویا به یک ارائه‌دهنده دیگر منتقل کنید، در طول مهاجرت‌های شما بسیار مفید باشد. به عنوان مثال، اگر نسخه ای از برنامه خود دارید که از Firebase و Parse برای داده ها استفاده می کند، می توانید از یک قانون صدک تصادفی برای تعیین اینکه کدام کلاینت ها از Firebase می خوانند استفاده کنید و به تدریج درصد را افزایش دهید.

برای کسب اطلاعات بیشتر درباره Firebase Remote Config ، به معرفی Remote Config مراجعه کنید.

تفاوت با Parse Config

با پیکربندی Parse می‌توانید جفت‌های کلید/مقدار را در داشبورد Parse Config به برنامه خود اضافه کنید و سپس ParseConfig در مشتری واکشی کنید. هر نمونه ParseConfig که دریافت می کنید همیشه تغییرناپذیر است. هنگامی که یک ParseConfig جدید را در آینده از شبکه بازیابی می کنید، هیچ نمونه ParseConfig موجود را تغییر نمی دهد، بلکه یک نمونه جدید ایجاد می کند و آن را از طریق getCurrentConfig() در دسترس قرار می دهد.

با 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 مهاجرت کنند.

مقایسه کد

تجزیه

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");