Di chuyển ứng dụng Parse iOS 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 iOS 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 iOS+ .

Google Analytics

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
[PFAnalytics trackAppOpenedWithLaunchOptions:launchOptions];

NSDictionary *dimensions = @{
  // Define ranges to bucket data points into meaningful segments
  @"priceRange": @"1000-1500",
  // Did the user filter the query?
  @"source": @"craigslist",
  // Do searches happen more often on weekdays or weekends?
  @"dayType": @"weekday"
};
// Send the dimensions to Parse along with the 'search' event
[PFAnalytics trackEvent:@"search" dimensions:dimensions];

Google Analytics

// Obtain the AppMeasurement instance and start collecting data
[FIRApp configure];

// Send the event with your params
[FIRAnalytics logEventWithName:@"search" parameters:@{
  // Define ranges to bucket data points into meaningful segments
  @"priceRange": @"1000-1500",
  // Did the user filter the query?
  @"source": @"craigslist",
  // Do searches happen more often on weekdays or weekends?
  @"dayType": @"weekday"
}];

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 PFObject 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 PFObject .

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 với PFObject ; 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.

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
PFObject *gameScore = [PFObject objectWithClassName:@"GameScore"];
gameScore[@"score"] = @1337;
gameScore[@"playerName"] = @"Sean Plott";
gameScore[@"cheatMode"] = @NO;
[gameScore saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
  if (succeeded) {
    // The object has been saved.
  } else {
    // There was a problem, check error.description
  }
}];
căn cứ hỏa lực
// Create a reference to the database
FIRDatabaseReference *ref = [[FIRDatabase database] reference];
NSString *key = [[ref child:@"scores"] childByAutoId].key;
NSDictionary *score = @{@"score": @1337,
                        @"playerName": @"Sean Plott",
                        @"cheatMode": @NO};
[key setValue:score withCompletionBlock:^(NSError *error,  FIRDatabaseReference *ref) {
  if (error) {
    // The object has been saved.
  } else {
    // There was a problem, check error.description
  }
}];
Để biết thêm chi tiết, hãy xem hướng dẫn Đọc và ghi dữ liệu trên nền tảng Apple .

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

Một PFObject có thể có mối quan hệ với một PFObject 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
PFObject *myAuthor = [PFObject objectWithClassName:@"Author"];
myAuthor[@"name"] = @"Grace Hopper";
myAuthor[@"birthDate"] = @"December 9, 1906";
myAuthor[@"nickname"] = @"Amazing Grace";

// Create the post
PFObject *myPost = [PFObject objectWithClassName:@"Post"];
myPost[@"title"] = @"Announcing COBOL, a New Programming Language";

// Add a relation between the Post and the Author
myPost[@"parent"] = myAuthor;

// This will save both myAuthor and myPost
[myPost saveInBackground];
căn cứ hỏa lực
// Create a reference to the database
FIRDatabaseReference *ref = [[FIRDatabase database] reference];

// Create the author
NSString *myAuthorKey = @"ghopper";
NSDictionary *author = @{@"name": @"Grace Hopper",
                         @"birthDate": @"December 9, 1906",
                         @"nickname": @"Amazing Grace"};
// Save the author
[[ref child:myAuthorKey] setValue:author]

// Create and save the post
NSString *key = [[ref child:@"posts"] childByAutoId].key;
NSDictionary *post = @{@"author": myAuthorKey,
                       @"title": @"Announcing COBOL, a New Programming Language"};
[key setValue:post]

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 PFQuery .

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
PFQuery *query = [PFQuery queryWithClassName:@"GameScore"];
[query whereKey:@"playerName" equalTo:@"Dan Stemkoski"];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
  if (!error) {
    for (PFObject *score in objects) {
      NSString *gameScore = score[@"score"];
      NSLog(@"Retrieved: %@", gameScore);
    }
  } else {
    // Log details of the failure
    NSLog(@"Error: %@ %@", error, [error userInfo]);
  }
}];
căn cứ hỏa lực
// Create a reference to the database
FIRDatabaseReference *ref = [[FIRDatabase database] reference];

// This type of listener is not one time, and you need to cancel it to stop
// receiving updates.
[[[[ref child:@"scores"] queryOrderedByChild:@"playerName"] queryEqualToValue:@"Dan Stemkoski"]
    observeEventType:FIRDataEventTypeChildAdded withBlock:^(FIRDataSnapshot *snapshot) {
  // This will fire for each matching child node.
  NSDictionary *score = snapshot.value;
  NSString gameScore = score[@"score"];
  NSLog(@"Retrieved: %@", gameScore);
}];
Để 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 nền tảng Apple .

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 biệt gọi là PFUser tự động xử lý chức năng cần thiết để quản lý tài khoản người dùng. PFUser là một lớp con của PFObject , 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ỳ PFObject nào khác.

FIRUser 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 FIRUser ; 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
PFUser *user = [PFUser user];
user.username = @"my name";
user.password = @"my pass";
user.email = @"email@example.com";

// other fields can be set just like with PFObject
user[@"phone"] = @"415-392-0202";

[user signUpInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
  if (!error) {
    // Hooray! Let them use the app now.
  } else {
    // Something went wrong
    NSString *errorString = [error userInfo][@"error"];
  }
}];
căn cứ hỏa lực
[[FIRAuth auth] createUserWithEmail:@"email@example.com"
                           password:@"my pass"
                         completion:^(FIRUser *_Nullable user, NSError *_Nullable error) {
  if (!error) {
    FIRDatabaseReference *ref = [[FIRDatabase database] reference];
    [[[[ref child:@"users"] child:user.uid] child:@"phone"] setValue:@"415-392-0202"
  } else {
    // Something went wrong
    NSString *errorString = [error userInfo][@"error"];
  }
}];

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 PFUser , 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ị

Trong khi Parse sử dụng mã thông báo thiết bị APN để nhắm mục tiêu cài đặt cho thông báo thì FCM sử dụng mã thông báo đăng ký FCM được ánh xạ tới mã thông báo thiết bị APN. Chỉ cần thêm SDK FCM vào ứng dụng Apple của bạn và nó sẽ tự động tìm nạp mã thông báo FCM .

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.

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ư:

PFInstallation *currentInstallation = [PFInstallation currentInstallation];
[currentInstallation removeObject:@"Giants" forKey:@"channels"];
[currentInstallation saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
  if (succeeded) {
    [[FIRMessaging messaging] subscribeToTopic:@"/topics/Giants"];
  } else {
    // Something went wrong unsubscribing
  }
}];

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 điều khiển cấu hình phân tích cú pháp, sau đó tìm nạp PFConfig trên máy khách. Mọi phiên bản PFConfig mà bạn nhận được luôn không thay đổi. Khi bạn truy xuất một PFConfig mới trong tương lai từ mạng, nó sẽ không sửa đổi bất kỳ phiên bản PFConfig 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 currentConfig .

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

[PFConfig getConfigInBackgroundWithBlock:^(PFConfig *config, NSError *error) {
  if (!error) {
    NSLog(@"Yay! Config was fetched from the server.");
  } else {
    NSLog(@"Failed to fetch. Using Cached Config.");
    config = [PFConfig currentConfig];
  }

  NSString *welcomeMessage = config[@"welcomeMessage"];
  if (!welcomeMessage) {
    NSLog(@"Falling back to default message.");
    welcomeMessage = @"Welcome!";
  }
}];

căn cứ hỏa lực

FIRRemoteConfig remoteConfig = [FIRRemoteConfig remoteConfig];
// Set defaults from a plist file
[remoteConfig setDefaultsFromPlistFileName:@"RemoteConfigDefaults"];

[remoteConfig fetchWithCompletionHandler:^(FIRRemoteConfigFetchStatus status, NSError *error) {
  if (status == FIRRemoteConfigFetchStatusSuccess) {
    NSLog(@"Yay! Config was fetched from the server.");
    // Once the config is successfully fetched it must be activated before newly fetched
    // values are returned.
    [self.remoteConfig activateFetched];
  } else {
    NSLog(@"Failed to fetch. Using last fetched or default.");
  }
}];

// ...

// When this is called, the value of the latest fetched and activated config is returned;
// if there's none, the default value is returned.
NSString welcomeMessage = remoteConfig[@"welcomeMessage"].stringValue;