Google cam kết thúc đẩy công bằng chủng tộc cho Cộng đồng người da đen. Xem cách thực hiện.
Trang này được dịch bởi Cloud Translation API.
Switch to English

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

Nếu bạn là người dùng Parse đang tìm kiếm một Giải pháp cuối cùng thay thế như một giải pháp 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 Cài đặt Android .

Google Analytics

Google Analytics là một giải pháp đo lường ứng dụng miễn phí cung cấp cái nhìn sâu sắc về việc sử dụng ứng dụng và sự tham gia 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 cách sử dụng SDK Firebase.

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

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

Sử dụng các nhà cung cấp phân tích khác nhau là một tình huống 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 viết kép bằng cả Parse Analytics và Google Analytics để ghi nhật ký sự kiện và thuộc tính, cho phép bạn dần dần đưa ra giải pháp mới.

So sánh mã

Phân tích phân tích

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

Cơ sở dữ liệu thời gian thực 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 của NoQuery. Dữ liệu được lưu trữ dưới dạng JSON và được đồng bộ hóa theo thời gian thực cho 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á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-giá trị khóa. Dữ liệu là schemaless, 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 các đối tượng JSON và không có tương đương với ParseObject ; bạn chỉ cần viết 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à viết từ cơ sở dữ liệu.

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

Phân tích
 @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ác cấu trúc dữ liệu phẳng phân chia dữ liệu thành các đường dẫn riêng biệt, để chúng có thể được tải xuống một cách hiệu quả trong các cuộc gọi riêng biệt.

Sau đây là một 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
 // 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 các truy vấn bằng ParseQuery .

Trong Firebase, bạn truy xuất dữ liệu bằng cách đính kèm một 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 cho 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à một ví dụ về cách bạn có thể truy xuất điểm số cho 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
 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 lắng nghe sự kiện có sẵn và về cách đặt hàng 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 cư đượ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 kết quả 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 dữ liệu của bạn yêu cầu, bao gồm:

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

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

Sau khi bạn 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 kịch bản này, bạn có hai phiên bản của ứng dụng: phiên bản cũ sử dụng Parse và phiên bản mới sử dụng Firebase. Đồng bộ giữa hai cơ sở dữ liệu được xử lý bởi Parse Cloud Code (Parse to Firebase), với mã của bạn lắng nghe các thay đổi trên Firebase và đồng bộ hóa các thay đổi đó với Parse. Trước khi bạn có thể bắt đầu sử dụng phiên bản mới, bạn phải:

  • Chuyển đổi dữ liệu Parse hiện tại 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 Parse Cloud Code sử dụng API REST của Firebase để 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 máy khách cũ.
  • Viết và triển khai mã lắng nghe 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 phân tách rõ ràng mã cũ và mã mới và 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 bộ dữ liệu lớn trong lần xuất đầu tiên và đảm bảo rằng đồng bộ hai chiều không tạo ra đệ quy vô hạn.

Viết đôi

Trong kịch bản 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 Parse Cloud Code để đồng bộ hóa các thay đổi được thực hiện bởi các máy khách cũ từ Dữ liệu Parse sang Cơ sở dữ liệu thời gian thực Firebase. Khi đủ người đã di chuyển từ phiên bản chỉ dành cho ứng dụng Parse, bạn có thể xóa mã Parse 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ủ. Nhược điểm của nó là dữ liệu không được truy cập không được di chuyển và kích thước của ứng dụng của bạn được tăng lên bằng cách sử dụng cả hai SDK.

Xác thực căn cứ hỏa lực

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 nhận dạng liên kết phổ biến như Google, Facebook và Twitter. Nó cũng cung cấp các thư viện UI để tiết kiệm cho bạn khoản đầu tư đáng kể cần có để thực hiện 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 biệt gọi là ParseUser , tự động xử lý các 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 Parse và có thể được mở rộng với các trường bổ sung như bất kỳ ParseObject nào khác.

Một FirebaseUser có một tập hợp các thuộc tính cơ bản cố định một ID duy nhất, một địa chỉ email chính, một tên và một 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; những thuộc tính có thể được cập nhật bởi người dùng. Bạn không thể trực tiếp thêm 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 bạn.

Sau đây là một 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
 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 cư đượ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ụ: một 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 thành định dạng theo yêu cầu của Firebase CLI. Sử dụng objectId của người dùng Parse của bạn làm localId của người dùng Firebase của bạn. 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 với 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 bạn đ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 nó sang Cơ sở dữ liệu thời gian thực Firebase bằng cách sử dụ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 luồng được mô tả trong phần di chuyển tài khoản , tài khoản Firebase của bạn có cùng id của tài khoản Parse của bạn, cho phép bạn dễ dàng di chuyển và tái tạo bất kỳ mối quan hệ nào được khóa bởi id người dùng.

Tin nhắn đám mây Firebase

Firebase Cloud Messaging (FCM) là một 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 thông báo người dùng được nhắm mục tiêu cho các nhà phát triển ứng dụng di động.

Xem tài liệu Nhắn tin trên đám mây Firebase để tìm hiểu thêm.

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

Mỗi ứng dụng Parse được cài đặt trên thiết bị được đăng ký thông báo đều có một đối tượng Installation 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ể xây dựng 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 của Google Analytics để tạo đối tượng. Xem hướng dẫn 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 cư được đề xuất

Mã thông báo thiết bị di chuyển

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 nhạc 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 bạn; tuy nhiên, điều này có thể làm mất hiệu lực mã thông báo được sử dụng bởi Parse SDK để nhận thông báo. Nếu bạn muốn tránh điều đó, bạn có thể thiết lập Parse SDK để sử dụng cả ID người gửi của Parse và ID người gửi của bạn. Theo 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 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ó.

Chuyển kênh sang chủ đề FCM

Nếu bạn đang sử dụng các kênh Parse để gửi thông báo, bạn có thể di chuyển đến các chủ đề FCM, cung cấp cùng một mô hình thuê bao nhà xuất bản. Để 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 Parse SDK để hủy đăng ký 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 nhận thông báo trên Parse SDK, xóa phần sau khỏi bảng kê khai của ứng dụng:

 <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 một cái gì đó 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 đủ người dùng đã di chuyển từ phiên bản ứng dụng chỉ dành cho Parse, bạn có thể hoàng hôn phiên bản đó và bắt đầu gửi chỉ bằng FCM.

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

Cấu hình từ xa Firebase

Firebase Remote Config là một dịch vụ đám mây cho phép bạn thay đổi hành vi và diện mạo 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 đó 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 khúc trong cơ sở người dùng của bạn.

Firebase Remote Config 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ể tự động 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 vị ngẫu nhiên để xác định khách hàng nào đọc từ Firebase và tăng dần tỷ lệ phần trăm.

Để tìm hiểu thêm về Firebase Remote Config, 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

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 điều khiển cấu hình Parse, 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 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 Firebase Remote Config, bạn tạo 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 và 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 của ứng dụng cho các phân khúc khác nhau của cơ sở người dùng. Cấu hình từ xa Firebase thực hiện một lớp đơn để 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ải thành công, bạn có thể chọn thời điểm kích hoạt nó để cung cấp các giá trị mới cho ứng dụng.

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

Bạn có thể di chuyển đến Firebase Remote Config bằng cách sao chép các cặp khóa / giá trị của cấu hình Parse của bạn vào bảng điều khiển Firebase, sau đó triển khai một phiên bản mới của ứng dụng sử dụng Firebase Remote Config.

Nếu bạn muốn thử nghiệm với cả Parse Config và Firebase Remote Config, bạn có thể triển khai một phiên bản mới của ứng dụng sử dụng cả hai SDK cho đến khi đủ người dùng di chuyển từ phiên bản chỉ Parse.

So sánh mã

Phân tích

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