Di chuyển ứng dụng Android Parse của bạn sang Firebase

Nếu bạn là người dùng Parse đang tìm kiếm giải pháp Phần cuối thay thế dưới dạng Dịch vụ, Firebase có thể là lựa chọn lý tưởng cho ứng dụng Android của bạn.

Hướng dẫn này mô tả cách tích hợp các dịch vụ cụ thể vào ứng dụng của bạn. Để biết hướng dẫn thiết lập Firebase cơ bản, hãy xem Hướng dẫn thiết lập Android .

Google phân tích

Google Analytics là giải pháp đo lường ứng dụng miễn phí cung cấp thông tin chi tiết về việc sử dụng ứng dụng và mức độ tương tác của người dùng. Analytics tích hợp trên các tính năng của Firebase và cung cấp cho bạn báo cáo không giới hạn cho tối đa 500 sự kiện riêng biệt mà bạn có thể xác định bằng SDK Firebase.

Xem tài liệu Google Analytics để tìm hiểu thêm.

Chiến lược di chuyển được đề xuất

Sử dụng các nhà cung cấp phân tích khác nhau là trường hợp phổ biến dễ dàng áp dụng cho Google Analytics. Chỉ cần thêm nó vào ứng dụng của bạn để hưởng lợi từ các sự kiện và thuộc tính người dùng mà Analytics tự động thu thập, như lần mở đầu tiên, cập nhật ứng dụng, kiểu thiết bị, độ tuổi.

Đối với các sự kiện tùy chỉnh và thuộc tính người dùng, bạn có thể sử dụng chiến lược ghi kép bằng cách sử dụng cả Parse Analytics và Google Analytics để ghi lại các sự kiện và thuộc tính, cho phép bạn triển khai dần giải pháp mới.

So sánh mã

Phân tích cú pháp

// 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 phân tích

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

Cơ sở dữ liệu thời gian thực của Firebase

Cơ sở dữ liệu thời gian thực Firebase là cơ sở dữ liệu được lưu trữ trên đám mây NoSQL. Dữ liệu được lưu trữ dưới dạng JSON và được đồng bộ hóa theo thời gian thực với mọi máy khách được kết nối.

Xem tài liệu Cơ sở dữ liệu thời gian thực Firebase để tìm hiểu thêm.

Sự khác biệt với dữ liệu phân tích cú pháp

Các đối tượng

Trong Parse, bạn lưu trữ một ParseObject hoặc một lớp con của nó, chứa các cặp dữ liệu tương thích JSON. Dữ liệu không có sơ đồ, có nghĩa là bạn không cần chỉ định khóa nào tồn tại trên mỗi ParseObject .

Tất cả dữ liệu Cơ sở dữ liệu thời gian thực Firebase được lưu trữ dưới dạng đối tượng JSON và không có dữ liệu tương đương cho ParseObject ; bạn chỉ cần ghi vào các giá trị cây JSON của các loại tương ứng với các loại JSON có sẵn. Bạn có thể sử dụng các đối tượng Java để đơn giản hóa việc đọc và ghi từ cơ sở dữ liệu.

Sau đây là ví dụ về cách bạn có thể lưu điểm cao cho trò chơi.

Phân tích cú pháp
@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();
căn cứ hỏa lực
// 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);
Để biết thêm chi tiết, hãy xem hướng dẫn Đọc và ghi dữ liệu trên Android .

Mối quan hệ giữa dữ liệu

Một ParseObject có thể có mối quan hệ với một ParseObject khác: bất kỳ đối tượng nào cũng có thể sử dụng các đối tượng khác làm giá trị.

Trong Cơ sở dữ liệu thời gian thực Firebase, các mối quan hệ được thể hiện tốt hơn bằng cách sử dụng cấu trúc dữ liệu phẳng giúp phân chia dữ liệu thành các đường dẫn riêng biệt để có thể tải xuống chúng một cách hiệu quả trong các lệnh gọi riêng biệt.

Sau đây là ví dụ về cách bạn có thể cấu trúc mối quan hệ giữa các bài đăng trong ứng dụng viết blog và tác giả của chúng.

Phân tích cú pháp
// 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();
căn cứ hỏa lực
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);

Bố cục dữ liệu sau đây là kết quả.

{
  // 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"
    }
    ...
  }
}
Để biết thêm chi tiết, hãy xem hướng dẫn Cấu trúc cơ sở dữ liệu của bạn .

Đọc dữ liệu

Trong Parse, bạn đọc dữ liệu bằng ID của một đối tượng Parse cụ thể hoặc thực hiện truy vấn bằng ParseQuery .

Trong Firebase, bạn truy xuất dữ liệu bằng cách đính kèm trình nghe không đồng bộ vào tham chiếu cơ sở dữ liệu. Trình nghe được kích hoạt một lần đối với trạng thái ban đầu của dữ liệu và một lần nữa khi dữ liệu thay đổi, vì vậy bạn sẽ không cần thêm bất kỳ mã nào để xác định xem dữ liệu có thay đổi hay không.

Sau đây là ví dụ về cách bạn có thể truy xuất điểm của một người chơi cụ thể, dựa trên ví dụ được trình bày trong phần "Đối tượng" .

Phân tích cú pháp
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());
        }
    }
});
căn cứ hỏa lực
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());
    }
});
Để biết thêm chi tiết về các loại trình xử lý sự kiện có sẵn cũng như cách sắp xếp và lọc dữ liệu, hãy xem hướng dẫn Đọc và ghi dữ liệu trên Android .

Chiến lược di chuyển được đề xuất

Suy nghĩ lại dữ liệu của bạn

Cơ sở dữ liệu thời gian thực Firebase được tối ưu hóa để đồng bộ hóa dữ liệu tính bằng mili giây trên tất cả các máy khách được kết nối và cấu trúc dữ liệu thu được khác với dữ liệu lõi Parse. Điều này có nghĩa là bước đầu tiên trong quá trình di chuyển của bạn là xem xét những thay đổi mà dữ liệu của bạn yêu cầu, bao gồm:

  • Cách các đối tượng Parse của bạn sẽ ánh xạ tới dữ liệu Firebase
  • Nếu bạn có quan hệ cha-con, làm cách nào để phân chia dữ liệu của bạn theo các đường dẫn khác nhau để có thể tải xuống dữ liệu một cách hiệu quả trong các lệnh gọi riêng biệt.

Di chuyển dữ liệu của bạn

Sau khi quyết định cách cấu trúc dữ liệu của mình trong Firebase, bạn cần lập kế hoạch cách xử lý khoảng thời gian mà ứng dụng của bạn cần ghi vào cả hai cơ sở dữ liệu. Lựa chọn của bạn là:

Đồng bộ hóa nền

Trong trường hợp này, bạn có hai phiên bản ứng dụng: phiên bản cũ sử dụng Parse và phiên bản mới sử dụng Firebase. Việc đồng bộ hóa giữa hai cơ sở dữ liệu được xử lý bởi Parse Cloud Code (Parse to Firebase), trong đó mã của bạn sẽ lắng nghe các thay đổi trên Firebase và đồng bộ hóa những thay đổi đó với Parse. Trước khi có thể bắt đầu sử dụng phiên bản mới, bạn phải:

  • Chuyển đổi Dữ liệu phân tích cú pháp hiện có của bạn sang cấu trúc Firebase mới và ghi nó vào Cơ sở dữ liệu thời gian thực Firebase.
  • Viết các hàm Mã phân tích cú pháp đám mây sử dụng API Firebase REST để ghi vào các thay đổi Cơ sở dữ liệu thời gian thực Firebase được thực hiện trong Dữ liệu phân tích cú pháp bởi các khách hàng cũ.
  • Viết và triển khai mã theo dõi các thay đổi trên Firebase và đồng bộ hóa chúng với cơ sở dữ liệu Parse.

Kịch bản này đảm bảo sự tách biệt rõ ràng giữa mã cũ và mã mới, đồng thời giữ cho máy khách đơn giản. Những thách thức của kịch bản này là xử lý các tập dữ liệu lớn trong lần xuất đầu tiên và đảm bảo rằng quá trình đồng bộ hóa hai chiều không tạo ra đệ quy vô hạn.

Viết đôi

Trong trường hợp này, bạn viết một phiên bản mới của ứng dụng sử dụng cả Firebase và Parse, sử dụng Mã đám mây phân tích để đồng bộ hóa các thay đổi do khách hàng cũ thực hiện từ Dữ liệu phân tích cú pháp sang Cơ sở dữ liệu thời gian thực Firebase. Khi đã có đủ người di chuyển từ phiên bản chỉ phân tích cú pháp của ứng dụng, bạn có thể xóa mã Phân tích cú pháp khỏi phiên bản ghi kép.

Kịch bản này không yêu cầu bất kỳ mã phía máy chủ nào. Nhược điểm của nó là dữ liệu không được truy cập sẽ không được di chuyển và kích thước ứng dụng của bạn sẽ tăng lên khi sử dụng cả hai SDK.

Xác thực Firebase

Xác thực Firebase có thể xác thực người dùng bằng mật khẩu và các nhà cung cấp danh tính liên kết phổ biến như Google, Facebook và Twitter. Nó cũng cung cấp các thư viện giao diện người dùng để giúp bạn tiết kiệm khoản đầu tư đáng kể cần thiết để triển khai và duy trì trải nghiệm xác thực đầy đủ cho ứng dụng của bạn trên tất cả các nền tảng.

Xem tài liệu Xác thực Firebase để tìm hiểu thêm.

Sự khác biệt với Parse Auth

Parse cung cấp một lớp người dùng chuyên dụng có tên ParseUser tự động xử lý chức năng cần thiết để quản lý tài khoản người dùng. ParseUser là một lớp con của ParseObject , có nghĩa là dữ liệu người dùng có sẵn trong Dữ liệu phân tích cú pháp và có thể được mở rộng với các trường bổ sung giống như bất kỳ ParseObject nào khác.

FirebaseUser có một tập hợp các thuộc tính cơ bản cố định—ID duy nhất, địa chỉ email chính, tên và URL ảnh—được lưu trữ trong cơ sở dữ liệu người dùng của một dự án riêng biệt; người dùng có thể cập nhật những thuộc tính đó. Bạn không thể thêm trực tiếp các thuộc tính khác vào đối tượng FirebaseUser ; thay vào đó, bạn có thể lưu trữ các thuộc tính bổ sung trong Cơ sở dữ liệu thời gian thực Firebase của mình.

Sau đây là ví dụ về cách bạn có thể đăng ký người dùng và thêm trường số điện thoại bổ sung.

Phân tích cú pháp
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
        }
    }
});
căn cứ hỏa lực
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());
            }
        }
    });

Chiến lược di chuyển được đề xuất

Di chuyển tài khoản

Để di chuyển tài khoản người dùng từ Parse sang Firebase, hãy xuất cơ sở dữ liệu người dùng của bạn sang tệp JSON hoặc CSV, sau đó nhập tệp vào dự án Firebase của bạn bằng lệnh auth:import của Firebase CLI.

Đầu tiên, xuất cơ sở dữ liệu người dùng của bạn từ bảng điều khiển Parse hoặc cơ sở dữ liệu tự lưu trữ của bạn. Ví dụ: tệp JSON được xuất từ ​​bảng điều khiển Parse có thể trông giống như sau:

{ // 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",
  ...
}

Sau đó, chuyển đổi tệp đã xuất sang định dạng mà Firebase CLI yêu cầu. Sử dụng objectId của người dùng Parse làm localId của người dùng Firebase. Ngoài ra, base64 mã hóa các giá trị bcryptPassword từ Parse và sử dụng chúng trong trường passwordHash . Ví dụ:

{
  "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
        }
      ]
    }
  ]
}

Cuối cùng, nhập tệp đã chuyển đổi bằng Firebase CLI, chỉ định bcrypt làm thuật toán băm:

firebase auth:import account_file.json --hash-algo=BCRYPT

Di chuyển dữ liệu người dùng

Nếu đang lưu trữ dữ liệu bổ sung cho người dùng của mình, bạn có thể di chuyển dữ liệu đó sang Cơ sở dữ liệu thời gian thực Firebase bằng các chiến lược được mô tả trong phần di chuyển dữ liệu . Nếu bạn di chuyển tài khoản bằng quy trình được mô tả trong phần di chuyển tài khoản thì tài khoản Firebase của bạn có cùng id với tài khoản Parse, cho phép bạn dễ dàng di chuyển và tái tạo mọi mối quan hệ do id người dùng khóa.

Nhắn tin qua đám mây Firebase

Firebase Cloud Messaging (FCM) là giải pháp nhắn tin đa nền tảng cho phép bạn gửi tin nhắn và thông báo một cách đáng tin cậy mà không mất phí. Trình soạn thảo Thông báo là một dịch vụ miễn phí được xây dựng trên Firebase Cloud Messaging cho phép các nhà phát triển ứng dụng di động gửi thông báo đến người dùng được nhắm mục tiêu.

Xem tài liệu về Nhắn tin qua đám mây của Firebase để tìm hiểu thêm.

Sự khác biệt với thông báo đẩy phân tích cú pháp

Mọi ứng dụng Parse được cài đặt trên thiết bị đã đăng ký thông báo đều có đối tượng Installation được liên kết, nơi bạn lưu trữ tất cả dữ liệu cần thiết để nhắm mục tiêu thông báo. Installation là một lớp con của ParseUser , có nghĩa là bạn có thể thêm bất kỳ dữ liệu bổ sung nào bạn muốn vào các phiên bản Installation của mình.

Trình soạn thảo Thông báo cung cấp các phân đoạn người dùng được xác định trước dựa trên thông tin như ứng dụng, phiên bản ứng dụng và ngôn ngữ thiết bị. Bạn có thể tạo các phân khúc người dùng phức tạp hơn bằng cách sử dụng các sự kiện và thuộc tính Google Analytics để tạo đối tượng. Xem hướng dẫn trợ giúp khán giả để tìm hiểu thêm. Những thông tin nhắm mục tiêu này không hiển thị trong Cơ sở dữ liệu thời gian thực Firebase.

Chiến lược di chuyển được đề xuất

Di chuyển mã thông báo thiết bị

Tại thời điểm viết bài, SDK Android Parse sử dụng phiên bản cũ hơn của mã thông báo đăng ký FCM, không tương thích với các tính năng do nhà soạn thảo Thông báo cung cấp.

Bạn có thể nhận được mã thông báo mới bằng cách thêm SDK FCM vào ứng dụng của mình; tuy nhiên, điều này có thể làm mất hiệu lực mã thông báo được SDK Parse sử dụng để nhận thông báo. Nếu muốn tránh điều đó, bạn có thể thiết lập SDK Parse để sử dụng cả ID người gửi của Parse và ID người gửi của bạn. Bằng cách này, bạn không làm mất hiệu lực mã thông báo được sử dụng bởi Parse SDK nhưng hãy lưu ý rằng cách giải quyết này sẽ ngừng hoạt động khi Parse tắt dự án của nó.

Di chuyển kênh sang chủ đề FCM

Nếu bạn đang sử dụng các kênh Phân tích cú pháp để gửi thông báo, bạn có thể di chuyển sang các chủ đề FCM, nơi cung cấp cùng mô hình nhà xuất bản-người đăng ký. Để xử lý quá trình chuyển đổi từ Parse sang FCM, bạn có thể viết phiên bản mới của ứng dụng sử dụng SDK Parse để hủy đăng ký các kênh Parse và SDK FCM để đăng ký các chủ đề FCM tương ứng. Trong phiên bản ứng dụng này, bạn nên tắt tính năng nhận thông báo trên SDK Parse, xóa nội dung sau khỏi bảng kê khai ứng dụng của mình:

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

Ví dụ: nếu người dùng của bạn đăng ký chủ đề "Người khổng lồ", bạn sẽ làm những việc như:

ParsePush.unsubscribeInBackground("Giants", new SaveCallback() {
    @Override
    public void done(ParseException e) {
        if (e == null) {
            FirebaseMessaging.getInstance().subscribeToTopic("Giants");
        } else {
            // Something went wrong unsubscribing
        }
    }
});

Sử dụng chiến lược này, bạn có thể gửi tin nhắn đến cả kênh Parse và chủ đề FCM tương ứng, hỗ trợ người dùng cả phiên bản cũ và mới. Khi đã có đủ người dùng di chuyển từ phiên bản chỉ phân tích cú pháp của ứng dụng, bạn có thể ngừng phiên bản đó và bắt đầu chỉ gửi bằng FCM.

Xem tài liệu về chủ đề FCM để tìm hiểu thêm.

Cấu hình từ xa Firebase

Firebase Remote Config là dịch vụ đám mây cho phép bạn thay đổi hành vi và giao diện của ứng dụng mà không yêu cầu người dùng tải xuống bản cập nhật ứng dụng. Khi sử dụng Cấu hình từ xa, bạn tạo các giá trị mặc định trong ứng dụng để kiểm soát hành vi và giao diện của ứng dụng. Sau đó, sau này bạn có thể sử dụng bảng điều khiển Firebase để ghi đè các giá trị mặc định trong ứng dụng cho tất cả người dùng ứng dụng hoặc cho các phân đoạn cơ sở người dùng của bạn.

Cấu hình từ xa Firebase có thể rất hữu ích trong quá trình di chuyển của bạn trong trường hợp bạn muốn thử nghiệm các giải pháp khác nhau và có thể linh hoạt chuyển nhiều khách hàng hơn sang một nhà cung cấp khác. Ví dụ: nếu bạn có phiên bản ứng dụng sử dụng cả Firebase và Parse cho dữ liệu, bạn có thể sử dụng quy tắc phần trăm ngẫu nhiên để xác định ứng dụng nào đọc từ Firebase và tăng dần tỷ lệ phần trăm.

Để tìm hiểu thêm về Cấu hình từ xa Firebase, hãy xem phần giới thiệu Cấu hình từ xa .

Sự khác biệt với cấu hình phân tích cú pháp

Với cấu hình Parse, bạn có thể thêm các cặp khóa/giá trị vào ứng dụng của mình trên Bảng thông tin cấu hình phân tích cú pháp, sau đó tìm nạp ParseConfig trên máy khách. Mọi phiên bản ParseConfig mà bạn nhận được luôn không thay đổi. Khi bạn truy xuất một ParseConfig mới trong tương lai từ mạng, nó sẽ không sửa đổi bất kỳ phiên bản ParseConfig hiện có nào mà thay vào đó sẽ tạo một phiên bản mới và cung cấp nó thông qua getCurrentConfig() .

Với Cấu hình từ xa Firebase, bạn tạo các giá trị mặc định trong ứng dụng cho các cặp khóa/giá trị mà bạn có thể ghi đè từ bảng điều khiển Firebase, đồng thời bạn có thể sử dụng các quy tắc và điều kiện để cung cấp các biến thể về trải nghiệm người dùng trong ứng dụng của mình cho các phân đoạn khác nhau trong cơ sở người dùng của bạn. Cấu hình từ xa Firebase triển khai một lớp đơn giúp cung cấp các cặp khóa/giá trị cho ứng dụng của bạn. Ban đầu, singleton trả về các giá trị mặc định mà bạn xác định trong ứng dụng. Bạn có thể tìm nạp một bộ giá trị mới từ máy chủ bất cứ lúc nào thuận tiện cho ứng dụng của bạn; sau khi bộ mới được tìm nạp thành công, bạn có thể chọn thời điểm kích hoạt bộ đó để cung cấp các giá trị mới cho ứng dụng.

Chiến lược di chuyển được đề xuất

Bạn có thể chuyển sang Cấu hình từ xa Firebase bằng cách sao chép các cặp khóa/giá trị của cấu hình Phân tích cú pháp vào bảng điều khiển Firebase, sau đó triển khai phiên bản mới của ứng dụng sử dụng Cấu hình từ xa Firebase.

Nếu muốn thử nghiệm cả Cấu hình phân tích cú pháp và Cấu hình từ xa Firebase, bạn có thể triển khai phiên bản mới của ứng dụng sử dụng cả hai SDK cho đến khi có đủ người dùng di chuyển từ phiên bản chỉ Phân tích cú pháp.

So sánh mã

Phân tích cú pháp

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

căn cứ hỏa lực

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