ย้าย Parse iOS App ของคุณไปที่ Firebase

หากคุณเป็นผู้ใช้ Parse ที่กำลังมองหา Backend ทางเลือกสำหรับโซลูชันบริการ Firebase อาจเป็นตัวเลือกที่เหมาะสำหรับแอป iOS ของคุณ

คู่มือนี้อธิบายวิธีผสานรวมบริการเฉพาะเข้ากับแอปของคุณ สำหรับคำแนะนำในการตั้งค่า Firebase พื้นฐาน โปรดดูคู่มือการ ตั้งค่า iOS+

Google Analytics

Google Analytics เป็นโซลูชันการวัดผลแอปฟรีที่ให้ข้อมูลเชิงลึกเกี่ยวกับการใช้แอปและการมีส่วนร่วมของผู้ใช้ Analytics ผสานรวมฟีเจอร์ต่างๆ ของ Firebase และให้การรายงานแบบไม่จำกัดสำหรับเหตุการณ์ที่แตกต่างกันสูงสุด 500 รายการที่คุณกำหนดได้โดยใช้ Firebase SDK

ดู เอกสาร Google Analytics เพื่อเรียนรู้เพิ่มเติม

กลยุทธ์การย้ายถิ่นฐานที่แนะนำ

การใช้ผู้ให้บริการวิเคราะห์ต่างๆ เป็นสถานการณ์ทั่วไปที่นำไปใช้กับ Google Analytics ได้อย่างง่ายดาย เพียงเพิ่มลงในแอปเพื่อรับประโยชน์จากเหตุการณ์และพร็อพเพอร์ตี้ผู้ใช้ที่ Analytics รวบรวมโดยอัตโนมัติ เช่น เปิดครั้งแรก อัปเดตแอป รุ่นอุปกรณ์ อายุ

สำหรับเหตุการณ์ที่กำหนดเองและพร็อพเพอร์ตี้ผู้ใช้ คุณสามารถใช้กลยุทธ์การเขียนซ้ำโดยใช้ทั้ง Parse Analytics และ Google Analytics เพื่อบันทึกเหตุการณ์และคุณสมบัติ ซึ่งช่วยให้คุณค่อยๆ เปิดตัวโซลูชันใหม่

การเปรียบเทียบรหัส

วิเคราะห์วิเคราะห์

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

ฐานข้อมูลเรียลไทม์ของ Firebase

ฐานข้อมูลเรียลไทม์ของ Firebase เป็นฐานข้อมูลที่โฮสต์บนคลาวด์ NoSQL ข้อมูลจะถูกจัดเก็บเป็น JSON และซิงโครไนซ์ตามเวลาจริงกับทุกไคลเอนต์ที่เชื่อมต่อ

ดู เอกสารฐานข้อมูลเรียลไทม์ของ Firebase เพื่อเรียนรู้เพิ่มเติม

ความแตกต่างด้วย Parse Data

วัตถุ

ใน Parse คุณเก็บ PFObject หรือคลาสย่อยของมัน ที่มีคู่คีย์-ค่าของข้อมูลที่เข้ากันได้กับ JSON ข้อมูลเป็นแบบไม่มีสคีมา ซึ่งหมายความว่าคุณไม่จำเป็นต้องระบุคีย์ที่มีอยู่ในแต่ละ PFObject

ข้อมูลฐานข้อมูลเรียลไทม์ของ Firebase ทั้งหมดถูกจัดเก็บเป็นวัตถุ JSON และไม่มีสิ่งใดเทียบเท่ากับ PFObject คุณเพียงแค่เขียนค่าทรี JSON ของประเภทที่สอดคล้องกับประเภท JSON ที่มีอยู่

ต่อไปนี้คือตัวอย่างวิธีบันทึกคะแนนสูงสำหรับเกม

พาร์เซ
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
  }
}];
Firebase
// 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
  }
}];
สำหรับรายละเอียดเพิ่มเติม ให้ดูคู่มือการ อ่านและเขียนข้อมูลบนแพลตฟอร์ม Apple

ความสัมพันธ์ระหว่างข้อมูล

PFObject สามารถมีความสัมพันธ์กับ PFObject อื่นได้: วัตถุใด ๆ สามารถใช้วัตถุอื่นเป็นค่าได้

ในฐานข้อมูลเรียลไทม์ของ Firebase ความสัมพันธ์จะแสดงได้ดีขึ้นโดยใช้โครงสร้างข้อมูลแบบเรียบที่แยกข้อมูลออกเป็นเส้นทางแยกกัน เพื่อให้สามารถดาวน์โหลดได้อย่างมีประสิทธิภาพในการเรียกแยกกัน

ต่อไปนี้คือตัวอย่างวิธีจัดโครงสร้างความสัมพันธ์ระหว่างโพสต์ในแอปบล็อกและผู้เขียน

พาร์เซ
// 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];
Firebase
// 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]

เค้าโครงข้อมูลต่อไปนี้เป็นผล

{
  // 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"
    }
    ...
  }
}
สำหรับรายละเอียดเพิ่มเติม ตรวจสอบ โครงสร้างฐานข้อมูลของคุณ คู่มือ

การอ่านข้อมูล

ใน Parse คุณอ่านข้อมูลโดยใช้ ID ของวัตถุ Parse ที่ระบุ หรือดำเนินการค้นหาโดยใช้ PFQuery

ใน Firebase คุณดึงข้อมูลโดยแนบ Listener แบบอะซิงโครนัสกับการอ้างอิงฐานข้อมูล Listener จะถูกทริกเกอร์หนึ่งครั้งสำหรับสถานะเริ่มต้นของข้อมูล และอีกครั้งเมื่อข้อมูลเปลี่ยนแปลง ดังนั้นคุณไม่จำเป็นต้องเพิ่มโค้ดใดๆ เพื่อตรวจสอบว่าข้อมูลมีการเปลี่ยนแปลงหรือไม่

ต่อไปนี้คือตัวอย่างวิธีการดึงคะแนนสำหรับผู้เล่นรายใดรายหนึ่ง โดยอ้างอิงจากตัวอย่างที่แสดงในส่วน "วัตถุ"

พาร์เซ
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]);
  }
}];
Firebase
// 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);
}];
สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับประเภทผู้ฟังเหตุการณ์ที่มีให้บริการและวิธีสั่งซื้อและกรองข้อมูล โปรดดูคู่มือการ อ่านและเขียนข้อมูลบนแพลตฟอร์ม Apple

กลยุทธ์การย้ายถิ่นฐานที่แนะนำ

คิดใหม่ข้อมูลของคุณ

ฐานข้อมูลเรียลไทม์ของ Firebase ได้รับการปรับให้เหมาะสมเพื่อซิงค์ข้อมูลในหน่วยมิลลิวินาทีในไคลเอนต์ที่เชื่อมต่อทั้งหมด และโครงสร้างข้อมูลที่เป็นผลลัพธ์จะแตกต่างจากข้อมูลหลักของ Parse ซึ่งหมายความว่าขั้นตอนแรกของการย้ายข้อมูลคือการพิจารณาว่าข้อมูลของคุณต้องการการเปลี่ยนแปลงใดบ้าง ซึ่งรวมถึง:

  • วิธีที่อ็อบเจ็กต์ Parse ของคุณควรแมปกับข้อมูล Firebase
  • หากคุณมีความสัมพันธ์แบบพ่อแม่และลูก วิธีแบ่งข้อมูลของคุณไปตามเส้นทางต่างๆ เพื่อให้สามารถดาวน์โหลดข้อมูลได้อย่างมีประสิทธิภาพในการโทรแยกกัน

ย้ายข้อมูลของคุณ

หลังจากที่คุณตัดสินใจว่าจะจัดโครงสร้างข้อมูลใน Firebase อย่างไร คุณต้องวางแผนวิธีจัดการกับช่วงเวลาที่แอปต้องเขียนลงในฐานข้อมูลทั้งสอง ตัวเลือกของคุณคือ:

ซิงค์พื้นหลัง

ในสถานการณ์นี้ คุณมีแอปสองเวอร์ชัน: เวอร์ชันเก่าที่ใช้ Parse และเวอร์ชันใหม่ที่ใช้ Firebase การซิงค์ระหว่างฐานข้อมูลทั้งสองได้รับการจัดการโดย Parse Cloud Code (Parse to Firebase) โดยที่โค้ดของคุณจะรับฟังการเปลี่ยนแปลงบน Firebase และซิงค์การเปลี่ยนแปลงเหล่านั้นด้วย Parse ก่อนที่คุณจะเริ่มใช้เวอร์ชันใหม่ คุณต้อง:

  • แปลงข้อมูล Parse ที่มีอยู่ของคุณเป็นโครงสร้าง Firebase ใหม่และเขียนลงในฐานข้อมูลเรียลไทม์ของ Firebase
  • เขียนฟังก์ชัน Parse Cloud Code ที่ใช้ Firebase REST API เพื่อเขียนการเปลี่ยนแปลงฐานข้อมูลเรียลไทม์ของ Firebase ที่ทำใน Parse Data โดยไคลเอ็นต์เก่า
  • เขียนและปรับใช้โค้ดที่รับฟังการเปลี่ยนแปลงบน Firebase และซิงค์กับฐานข้อมูล Parse

ภาพจำลองนี้ช่วยให้แน่ใจว่ามีการแยกโค้ดเก่าและใหม่ออกอย่างสมบูรณ์ และทำให้ไคลเอ็นต์ใช้งานได้ง่าย ความท้าทายของสถานการณ์นี้คือการจัดการชุดข้อมูลขนาดใหญ่ในการส่งออกเริ่มต้น และทำให้มั่นใจว่าการซิงค์แบบสองทิศทางจะไม่สร้างการเรียกซ้ำแบบไม่มีที่สิ้นสุด

เขียนสองครั้ง

ในสถานการณ์นี้ คุณเขียนเวอร์ชันใหม่ของแอปที่ใช้ทั้ง Firebase และ Parse โดยใช้ Parse Cloud Code เพื่อซิงค์การเปลี่ยนแปลงที่ทำโดยไคลเอ็นต์เก่าจาก Parse Data ไปยัง Firebase Realtime Database เมื่อมีคนโยกย้ายจากแอปเวอร์ชัน Parse เท่านั้นมากพอ คุณสามารถลบโค้ด Parse ออกจากเวอร์ชันเขียนซ้ำได้

สถานการณ์นี้ไม่ต้องการโค้ดฝั่งเซิร์ฟเวอร์ใดๆ ข้อเสียคือไม่มีการย้ายข้อมูลที่ไม่มีการเข้าถึง และขนาดของแอปเพิ่มขึ้นตามการใช้ SDK ทั้งสอง

การตรวจสอบสิทธิ์ Firebase

การรับรองความถูกต้องของ Firebase สามารถรับรองความถูกต้องของผู้ใช้โดยใช้รหัสผ่านและผู้ให้บริการข้อมูลประจำตัวแบบรวมศูนย์ยอดนิยม เช่น Google, Facebook และ Twitter นอกจากนี้ยังมีไลบรารี UI เพื่อช่วยให้คุณประหยัดการลงทุนที่สำคัญที่จำเป็นในการติดตั้งและรักษาประสบการณ์การตรวจสอบสิทธิ์แบบสมบูรณ์สำหรับแอปของคุณในทุกแพลตฟอร์ม

ดู เอกสารการตรวจสอบสิทธิ์ Firebase เพื่อเรียนรู้เพิ่มเติม

ความแตกต่างด้วย Parse Auth

Parse มีคลาสผู้ใช้เฉพาะที่เรียกว่า PFUser ซึ่งจะจัดการฟังก์ชันที่จำเป็นสำหรับการจัดการบัญชีผู้ใช้โดยอัตโนมัติ PFUser เป็นคลาสย่อยของ PFObject ซึ่งหมายความว่าข้อมูลผู้ใช้มีอยู่ใน Parse Data และสามารถขยายได้ด้วยฟิลด์เพิ่มเติม เช่นเดียวกับ PFObject อื่นๆ

FIRUser มีชุดคุณสมบัติพื้นฐานตายตัว—รหัสเฉพาะ, ที่อยู่อีเมลหลัก, ชื่อและ URL ของภาพถ่าย—จัดเก็บไว้ในฐานข้อมูลผู้ใช้ของโปรเจ็กต์แยกต่างหาก ผู้ใช้สามารถอัปเดตคุณสมบัติเหล่านั้นได้ คุณไม่สามารถเพิ่มคุณสมบัติอื่นๆ ให้กับวัตถุ FIRUser ได้โดยตรง คุณสามารถจัดเก็บคุณสมบัติเพิ่มเติมในฐานข้อมูลเรียลไทม์ของ Firebase แทนได้

ต่อไปนี้เป็นตัวอย่างวิธีการลงทะเบียนผู้ใช้และเพิ่มฟิลด์หมายเลขโทรศัพท์เพิ่มเติม

พาร์เซ
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"];
  }
}];
Firebase
[[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"];
  }
}];

กลยุทธ์การย้ายถิ่นฐานที่แนะนำ

ย้ายบัญชี

ในการย้ายบัญชีผู้ใช้จาก Parse ไปยัง Firebase ให้ส่งออกฐานข้อมูลผู้ใช้ของคุณเป็นไฟล์ JSON หรือ CSV จากนั้นนำเข้าไฟล์ไปยังโปรเจ็กต์ Firebase โดยใช้คำสั่ง auth:import ของ Firebase CLI

ขั้นแรก ส่งออกฐานข้อมูลผู้ใช้ของคุณจากคอนโซล 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 โดยใช้กลยุทธ์ที่อธิบายไว้ในส่วนการ ย้ายข้อมูล หากคุณย้ายข้อมูลบัญชีโดยใช้ขั้นตอนที่อธิบายไว้ในส่วนการ ย้ายบัญชี บัญชี Firebase ของคุณจะมีรหัสบัญชี Parse เหมือนกัน ช่วยให้คุณย้ายและสร้างความสัมพันธ์ที่คีย์โดย ID ผู้ใช้ได้อย่างง่ายดาย

การส่งข้อความบนคลาวด์ของ Firebase

Firebase Cloud Messaging (FCM) เป็นโซลูชันการส่งข้อความข้ามแพลตฟอร์มที่ให้คุณส่งข้อความและการแจ้งเตือนได้อย่างน่าเชื่อถือโดยไม่มีค่าใช้จ่าย นักแต่งเพลงการแจ้งเตือนเป็นบริการที่ไม่มีค่าใช้จ่ายซึ่งสร้างขึ้นบน Firebase Cloud Messaging ที่เปิดใช้งานการแจ้งเตือนผู้ใช้ที่เป็นเป้าหมายสำหรับนักพัฒนาแอปบนอุปกรณ์เคลื่อนที่

ดูเอกสาร Firebase Cloud Messaging เพื่อเรียนรู้เพิ่มเติม

ความแตกต่างด้วยการแจ้งเตือนแบบแยกวิเคราะห์

ทุกแอปพลิเคชัน Parse ที่ติดตั้งบนอุปกรณ์ที่ลงทะเบียนสำหรับการแจ้งเตือนมีอ็อบเจ็กต์การ Installation ที่เกี่ยวข้อง ซึ่งคุณเก็บข้อมูลทั้งหมดที่จำเป็นในการกำหนดเป้าหมายการแจ้งเตือน การ Installation เป็นคลาสย่อยของ PFUser ซึ่งหมายความว่าคุณสามารถเพิ่มข้อมูลเพิ่มเติมใดๆ ที่คุณต้องการให้กับอินสแตนซ์การ Installation ของคุณ

นักแต่งเพลงการแจ้งเตือนให้กลุ่มผู้ใช้ที่กำหนดไว้ล่วงหน้าตามข้อมูล เช่น แอป เวอร์ชันแอป และภาษาของอุปกรณ์ คุณสามารถสร้างกลุ่มผู้ใช้ที่ซับซ้อนมากขึ้นได้โดยใช้เหตุการณ์และคุณสมบัติของ Google Analytics เพื่อสร้างผู้ชม ดูคู่มือช่วยเหลือสำหรับ ผู้ชม เพื่อเรียนรู้เพิ่มเติม ข้อมูลการกำหนดเป้าหมายเหล่านี้ไม่ปรากฏในฐานข้อมูลเรียลไทม์ของ Firebase

กลยุทธ์การย้ายถิ่นฐานที่แนะนำ

การโยกย้ายโทเค็นอุปกรณ์

ในขณะที่ Parse ใช้โทเค็นอุปกรณ์ APN เพื่อกำหนดเป้าหมายการติดตั้งสำหรับการแจ้งเตือน FCM จะใช้โทเค็นการลงทะเบียน FCM ที่แมปกับโทเค็นอุปกรณ์ APN เพียงเพิ่ม FCM SDK ลงในแอพ Apple ของคุณแล้วมันจะ ดึงโทเค็น FCM โดยอัตโนมัติ

การย้ายช่องไปยังหัวข้อ FCM

หากคุณกำลังใช้ช่อง Parse เพื่อส่งการแจ้งเตือน คุณสามารถโยกย้ายไปยังหัวข้อ FCM ซึ่งมีรูปแบบผู้เผยแพร่และสมาชิกเหมือนกัน ในการจัดการการเปลี่ยนจาก Parse เป็น FCM คุณสามารถเขียนเวอร์ชันใหม่ของแอปที่ใช้ Parse SDK เพื่อยกเลิกการสมัครจากช่อง Parse และ FCM SDK เพื่อสมัครรับข้อมูลจากหัวข้อ FCM ที่เกี่ยวข้อง

ตัวอย่างเช่น หากผู้ใช้ของคุณสมัครรับข้อมูลในหัวข้อ "Giants" คุณจะทำสิ่งต่อไปนี้

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

เมื่อใช้กลยุทธ์นี้ คุณสามารถส่งข้อความไปยังทั้งช่อง Parse และหัวข้อ FCM ที่เกี่ยวข้อง ซึ่งสนับสนุนผู้ใช้ทั้งเวอร์ชันเก่าและเวอร์ชันใหม่ เมื่อมีผู้ใช้โยกย้ายจากแอปเวอร์ชัน Parse-only เพียงพอแล้ว คุณสามารถเลิกใช้เวอร์ชันนั้นและเริ่มส่งโดยใช้ FCM เท่านั้น

ดู เอกสารหัวข้อ FCM เพื่อเรียนรู้เพิ่มเติม

การกำหนดค่าระยะไกลของ Firebase

Firebase Remote Config เป็นบริการระบบคลาวด์ที่ให้คุณเปลี่ยนลักษณะการทำงานและรูปลักษณ์ของแอพของคุณโดยที่ผู้ใช้ไม่ต้องดาวน์โหลดแอพอัพเดท เมื่อใช้ Remote Config คุณจะสร้างค่าเริ่มต้นในแอพที่ควบคุมการทำงานและลักษณะที่ปรากฏของแอพของคุณ จากนั้น คุณสามารถใช้คอนโซล Firebase เพื่อแทนที่ค่าเริ่มต้นในแอปสำหรับผู้ใช้แอปทั้งหมดหรือสำหรับกลุ่มฐานผู้ใช้ของคุณ

การกำหนดค่าระยะไกลของ Firebase อาจมีประโยชน์มากในระหว่างการย้ายข้อมูลของคุณ ในกรณีที่คุณต้องการทดสอบโซลูชันต่างๆ และสามารถเปลี่ยนไคลเอ็นต์ให้มากขึ้นแบบไดนามิกไปยังผู้ให้บริการรายอื่นได้ ตัวอย่างเช่น หากคุณมีเวอร์ชันของแอปที่ใช้ทั้ง Firebase และ Parse สำหรับข้อมูล คุณสามารถใช้กฎเปอร์เซ็นไทล์แบบสุ่มเพื่อกำหนดว่าไคลเอ็นต์ใดที่อ่านจาก Firebase แล้วค่อยๆ เพิ่มเปอร์เซ็นต์

หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับการกำหนดค่าระยะไกลของ Firebase โปรดดูคำ แนะนำการกำหนดค่าระยะไกล

ความแตกต่างด้วย Parse Config

ด้วยการกำหนดค่า Parse คุณสามารถเพิ่มคู่คีย์/ค่าให้กับแอปของคุณบน Parse Config Dashboard จากนั้นดึง PFConfig บนไคลเอนต์ ทุกอินสแตนซ์ PFConfig ที่คุณได้รับจะไม่เปลี่ยนรูปเสมอ เมื่อคุณดึง PFConfig ใหม่จากเครือข่ายในอนาคต จะไม่แก้ไขอินสแตนซ์ PFConfig ที่มีอยู่ แต่จะสร้างอินสแตนซ์ใหม่และทำให้พร้อมใช้งานผ่าน currentConfig แทน

การกำหนดค่าระยะไกลของ Firebase ช่วยให้คุณสร้างค่าเริ่มต้นในแอปสำหรับคู่คีย์/ค่าที่คุณลบล้างได้จากคอนโซล Firebase และคุณสามารถใช้กฎและเงื่อนไขเพื่อมอบประสบการณ์ผู้ใช้แอปในรูปแบบต่างๆ ให้กับกลุ่มต่างๆ ของฐานผู้ใช้ การกำหนดค่าระยะไกลของ Firebase ใช้คลาสซิงเกิลตันที่ทำให้คู่คีย์/ค่าพร้อมใช้งานในแอปของคุณ เริ่มแรก singleton ส่งคืนค่าดีฟอลต์ที่คุณกำหนดในแอป คุณสามารถดึงค่าชุดใหม่จากเซิร์ฟเวอร์ได้ทุกเมื่อที่สะดวกสำหรับแอปของคุณ หลังจากที่ดึงชุดใหม่สำเร็จแล้ว คุณสามารถเลือกเวลาที่จะเปิดใช้งานเพื่อให้ค่าใหม่พร้อมใช้งานในแอป

กลยุทธ์การย้ายถิ่นฐานที่แนะนำ

คุณสามารถย้ายไปยังการกำหนดค่าระยะไกลของ Firebase ได้โดยการคัดลอกคู่คีย์/ค่าของการกำหนดค่า Parse ไปยังคอนโซล Firebase จากนั้นปรับใช้แอปเวอร์ชันใหม่ที่ใช้การกำหนดค่าระยะไกลของ Firebase

หากคุณต้องการทดสอบทั้ง Parse Config และ Firebase Remote Config คุณสามารถทำให้แอปเวอร์ชันใหม่ใช้งานได้ซึ่งใช้ SDK ทั้งสองจนกว่าผู้ใช้จะย้ายจากเวอร์ชัน Parse เท่านั้นได้เพียงพอ

การเปรียบเทียบรหัส

พาร์เซ

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

Firebase

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;