ย้ายการแยกวิเคราะห์แอป iOS ไปยัง Firebase

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

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

Google Analytics

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

ดูข้อมูลเพิ่มเติมที่เอกสาร Google Analytics

กลยุทธ์การย้ายข้อมูลที่แนะนำ

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

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

การเปรียบเทียบโค้ด

แยกวิเคราะห์ 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 Realtime Database

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

ดูข้อมูลเพิ่มเติมที่เอกสาร Firebase Realtime Database

ความแตกต่างกับการแยกวิเคราะห์ข้อมูล

วัตถุ

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

ระบบจัดเก็บข้อมูล Firebase Realtime Database ทั้งหมดเป็นออบเจ็กต์ 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 Realtime Database จะแสดงความสัมพันธ์ได้ดีกว่าโดยใช้โครงสร้างข้อมูลแบบเดี่ยว จะแยกข้อมูลออกเป็นเส้นทางที่แตกต่างกันเพื่อให้สามารถดาวน์โหลดได้อย่างมีประสิทธิภาพในการโทรแต่ละสาย

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

แยกวิเคราะห์
// 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"
    }
    ...
  }
}
ดูรายละเอียดเพิ่มเติมได้ที่ จัดโครงสร้างฐานข้อมูล

กำลังอ่านข้อมูล

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

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

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

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

กลยุทธ์การย้ายข้อมูลที่แนะนำ

ทบทวนข้อมูลของคุณ

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

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

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

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

การซิงค์ในเบื้องหลัง

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

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

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

การเขียนแบบคู่

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

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

Firebase Authentication

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

ดูข้อมูลเพิ่มเติมที่เอกสาร Firebase Authentication

ความแตกต่างกับการตรวจสอบสิทธิ์แบบแยกวิเคราะห์

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

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

ต่อไปนี้เป็นตัวอย่างวิธีที่คุณสามารถลงชื่อสมัครใช้ให้ผู้ใช้และเพิ่มช่องหมายเลขโทรศัพท์เพิ่มเติม

แยกวิเคราะห์
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"];
  }
}];

กลยุทธ์การย้ายข้อมูลที่แนะนำ

ย้ายข้อมูลบัญชี

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

ก่อนอื่น ให้ส่งออกฐานข้อมูลผู้ใช้จากคอนโซลแยกวิเคราะห์หรือโฮสต์ด้วยตนเอง ฐานข้อมูล ตัวอย่างเช่น ไฟล์ JSON ที่ส่งออกจากคอนโซลการแยกวิเคราะห์อาจมีลักษณะดังนี้ ดังนี้

{ // 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 ของผู้ใช้การแยกวิเคราะห์เป็น localId ของผู้ใช้ Firebase นอกจากนี้ ให้เข้ารหัส base64 bcryptPassword ค่าจากการแยกวิเคราะห์และใช้ใน passwordHash ด้วย เช่น

{
  "users": [
    {
      "localId": "abcde1234",  // Parse objectId
      "email": "user@example.com",
      "displayName": "testuser",
      "passwordHash": "JDJhJDEwJE9CcDJoeEI3VGFZWmdLeVRpWTQ4bHVhd2xUdVlBVTZCcXp4SmZwSG9KTWRabWphRjRIRmg2",
    },
    {
      "localId": "fghij5678",  // Parse objectId
      "displayName": "wXyZ987654321StUv",
      "providerUserInfo": [
        {
          "providerId": "facebook.com",
          "rawId": "1000000000",  // Facebook ID
        }
      ]
    }
  ]
}

สุดท้าย ให้นำเข้าไฟล์ที่เปลี่ยนรูปแบบด้วย Firebase CLI โดยระบุ bcrypt เป็นอัลกอริทึมของแฮช

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

ย้ายข้อมูลผู้ใช้

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

Firebase Cloud Messaging

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

ดูข้อมูลเพิ่มเติมได้ที่เอกสาร Firebase Cloud Messaging

ความแตกต่างกับการแยกวิเคราะห์ข้อความ Push

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

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

กลยุทธ์การย้ายข้อมูลที่แนะนำ

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

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

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

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

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

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

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

โปรดดู เอกสาร FCM หัวข้อ เพื่อดูข้อมูลเพิ่มเติม

Firebase Remote Config

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

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

ดูข้อมูลเพิ่มเติมเกี่ยวกับ Firebase Remote Config ได้ที่ ข้อมูลเบื้องต้นเกี่ยวกับ Remote Config

ความแตกต่างจากการกำหนดค่าการแยกวิเคราะห์

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

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

กลยุทธ์การย้ายข้อมูลที่แนะนำ

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

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

การเปรียบเทียบโค้ด

แยกวิเคราะห์

[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;