अपने पार्स आईओएस ऐप को फायरबेस पर माइग्रेट करें

यदि आप एक पार्स उपयोगकर्ता हैं जो सेवा समाधान के रूप में वैकल्पिक बैकएंड की तलाश कर रहे हैं, तो फायरबेस आपके आईओएस ऐप के लिए आदर्श विकल्प हो सकता है।

यह मार्गदर्शिका बताती है कि विशिष्ट सेवाओं को अपने ऐप में कैसे एकीकृत किया जाए। बुनियादी फायरबेस सेटअप निर्देशों के लिए, iOS+ सेटअप गाइड देखें।

गूगल विश्लेषिकी

Google Analytics एक मुफ़्त ऐप मापन समाधान है जो ऐप के उपयोग और उपयोगकर्ता सहभागिता पर जानकारी प्रदान करता है। एनालिटिक्स फायरबेस सुविधाओं को एकीकृत करता है और आपको 500 अलग-अलग घटनाओं के लिए असीमित रिपोर्टिंग प्रदान करता है जिन्हें आप फायरबेस एसडीके का उपयोग करके परिभाषित कर सकते हैं।

अधिक जानने के लिए Google Analytics दस्तावेज़ देखें।

सुझाई गई प्रवासन रणनीति

विभिन्न एनालिटिक्स प्रदाताओं का उपयोग करना एक सामान्य परिदृश्य है जो Google 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];

गूगल विश्लेषिकी

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

फायरबेस रीयलटाइम डेटाबेस

फायरबेस रीयलटाइम डेटाबेस एक NoSQL क्लाउड-होस्टेड डेटाबेस है। डेटा को JSON के रूप में संग्रहीत किया जाता है और प्रत्येक कनेक्टेड क्लाइंट के साथ वास्तविक समय में सिंक्रनाइज़ किया जाता है।

अधिक जानने के लिए फायरबेस रीयलटाइम डेटाबेस दस्तावेज़ देखें।

पार्स डेटा के साथ अंतर

वस्तुओं

पार्स में आप एक PFObject , या उसका एक उपवर्ग संग्रहीत करते हैं, जिसमें JSON-संगत डेटा के कुंजी-मूल्य जोड़े होते हैं। डेटा स्कीमरहित है, जिसका अर्थ है कि आपको यह निर्दिष्ट करने की आवश्यकता नहीं है कि प्रत्येक PFObject पर कौन सी कुंजियाँ मौजूद हैं।

सभी फायरबेस रीयलटाइम डेटाबेस डेटा को 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
  }
}];
फायरबेस
// 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 के साथ संबंध हो सकता है: कोई भी ऑब्जेक्ट अन्य ऑब्जेक्ट को मान के रूप में उपयोग कर सकता है।

फायरबेस रीयलटाइम डेटाबेस में, फ्लैट डेटा संरचनाओं का उपयोग करके संबंधों को बेहतर ढंग से व्यक्त किया जाता है जो डेटा को अलग-अलग पथों में विभाजित करते हैं, ताकि उन्हें अलग-अलग कॉल में कुशलतापूर्वक डाउनलोड किया जा सके।

निम्नलिखित एक उदाहरण है कि आप ब्लॉगिंग ऐप में पोस्ट और उनके लेखकों के बीच संबंध कैसे बना सकते हैं।

पार्स
// 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];
फायरबेस
// 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 का उपयोग करके क्वेरी निष्पादित करके डेटा पढ़ते हैं।

फायरबेस में, आप एक एसिंक्रोनस श्रोता को डेटाबेस संदर्भ में संलग्न करके डेटा पुनर्प्राप्त करते हैं। श्रोता को डेटा की प्रारंभिक स्थिति के लिए एक बार ट्रिगर किया जाता है और डेटा बदलने पर दोबारा ट्रिगर किया जाता है, इसलिए आपको यह निर्धारित करने के लिए कोई कोड जोड़ने की आवश्यकता नहीं होगी कि डेटा बदल गया है या नहीं।

निम्नलिखित एक उदाहरण है कि आप "ऑब्जेक्ट्स" अनुभाग में प्रस्तुत उदाहरण के आधार पर किसी विशेष खिलाड़ी के लिए स्कोर कैसे प्राप्त कर सकते हैं।

पार्स
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]);
  }
}];
फायरबेस
// 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 प्लेटफ़ॉर्म पर डेटा पढ़ें और लिखें गाइड देखें।

सुझाई गई प्रवासन रणनीति

अपने डेटा पर पुनर्विचार करें

फायरबेस रीयलटाइम डेटाबेस को सभी कनेक्टेड क्लाइंट्स में मिलीसेकंड में डेटा सिंक करने के लिए अनुकूलित किया गया है, और परिणामी डेटा संरचना पार्स कोर डेटा से अलग है। इसका मतलब यह है कि आपके माइग्रेशन का पहला कदम यह विचार करना है कि आपके डेटा में किन बदलावों की आवश्यकता है, जिनमें शामिल हैं:

  • आपके पार्स ऑब्जेक्ट को फ़ायरबेस डेटा पर कैसे मैप करना चाहिए
  • यदि आपके माता-पिता-बच्चे के संबंध हैं, तो अपने डेटा को विभिन्न पथों में कैसे विभाजित करें ताकि इसे अलग-अलग कॉल में कुशलतापूर्वक डाउनलोड किया जा सके।

अपना डेटा माइग्रेट करें

फायरबेस में अपने डेटा को कैसे संरचित करना है, यह तय करने के बाद, आपको यह योजना बनाने की आवश्यकता है कि उस अवधि को कैसे संभालना है जिसके दौरान आपके ऐप को दोनों डेटाबेस में लिखने की आवश्यकता होती है। आपकी पसंद हैं:

पृष्ठभूमि समन्वयन

इस परिदृश्य में, आपके पास ऐप के दो संस्करण हैं: पुराना संस्करण जो पार्स का उपयोग करता है और एक नया संस्करण जो फायरबेस का उपयोग करता है। दो डेटाबेस के बीच सिंक को पार्स क्लाउड कोड (पार्स से फायरबेस) द्वारा नियंत्रित किया जाता है, जिसमें आपका कोड फायरबेस पर परिवर्तनों को सुनता है और पार्स के साथ उन परिवर्तनों को सिंक करता है। इससे पहले कि आप नए संस्करण का उपयोग शुरू कर सकें, आपको यह करना होगा:

  • अपने मौजूदा पार्स डेटा को नई फ़ायरबेस संरचना में बदलें, और इसे फ़ायरबेस रीयलटाइम डेटाबेस में लिखें।
  • पार्स क्लाउड कोड फ़ंक्शन लिखें जो पुराने क्लाइंट द्वारा पार्स डेटा में किए गए फायरबेस रीयलटाइम डेटाबेस परिवर्तनों को लिखने के लिए फायरबेस रेस्ट एपीआई का उपयोग करते हैं।
  • कोड लिखें और तैनात करें जो फायरबेस पर परिवर्तनों को सुनता है और उन्हें पार्स डेटाबेस में सिंक करता है।

यह परिदृश्य पुराने और नए कोड का स्पष्ट पृथक्करण सुनिश्चित करता है, और ग्राहकों को सरल रखता है। इस परिदृश्य की चुनौतियाँ प्रारंभिक निर्यात में बड़े डेटासेट को संभालना और यह सुनिश्चित करना है कि द्विदिश सिंक अनंत पुनरावृत्ति उत्पन्न नहीं करता है।

दोहरा लिखें

इस परिदृश्य में, आप ऐप का एक नया संस्करण लिखते हैं जो पार्स डेटा से फायरबेस रीयलटाइम डेटाबेस में पुराने क्लाइंट द्वारा किए गए परिवर्तनों को सिंक करने के लिए पार्स क्लाउड कोड का उपयोग करके फायरबेस और पार्स दोनों का उपयोग करता है। जब पर्याप्त लोग ऐप के पार्स-केवल संस्करण से माइग्रेट हो गए हैं, तो आप पार्स कोड को डबल राइट संस्करण से हटा सकते हैं।

इस परिदृश्य के लिए किसी सर्वर साइड कोड की आवश्यकता नहीं है। इसका नुकसान यह है कि जिस डेटा तक पहुंच नहीं है वह माइग्रेट नहीं होता है, और दोनों एसडीके के उपयोग से आपके ऐप का आकार बढ़ जाता है।

फायरबेस प्रमाणीकरण

फायरबेस प्रमाणीकरण पासवर्ड और Google, Facebook और Twitter जैसे लोकप्रिय फ़ेडरेटेड पहचान प्रदाताओं का उपयोग करके उपयोगकर्ताओं को प्रमाणित कर सकता है। यह आपको सभी प्लेटफ़ॉर्म पर आपके ऐप के लिए पूर्ण प्रमाणीकरण अनुभव को लागू करने और बनाए रखने के लिए आवश्यक महत्वपूर्ण निवेश को बचाने के लिए यूआई लाइब्रेरी भी प्रदान करता है।

अधिक जानने के लिए फायरबेस प्रमाणीकरण दस्तावेज़ देखें।

पार्स प्रामाणिक के साथ मतभेद

पार्स PFUser नामक एक विशेष उपयोगकर्ता वर्ग प्रदान करता है जो उपयोगकर्ता खाता प्रबंधन के लिए आवश्यक कार्यक्षमता को स्वचालित रूप से संभालता है। PFUser PFObject का एक उपवर्ग है, जिसका अर्थ है कि उपयोगकर्ता डेटा पार्स डेटा में उपलब्ध है और इसे किसी अन्य PFObject की तरह अतिरिक्त फ़ील्ड के साथ बढ़ाया जा सकता है।

एक FIRUser के पास बुनियादी गुणों का एक निश्चित सेट होता है - एक अद्वितीय आईडी, एक प्राथमिक ईमेल पता, एक नाम और एक फोटो URL - एक अलग प्रोजेक्ट के उपयोगकर्ता डेटाबेस में संग्रहीत होता है; उन गुणों को उपयोगकर्ता द्वारा अद्यतन किया जा सकता है। आप FIRUser ऑब्जेक्ट में सीधे अन्य गुण नहीं जोड़ सकते; इसके बजाय, आप अतिरिक्त संपत्तियों को अपने फायरबेस रीयलटाइम डेटाबेस में संग्रहीत कर सकते हैं।

निम्नलिखित एक उदाहरण है कि आप किसी उपयोगकर्ता को कैसे साइन अप कर सकते हैं और एक अतिरिक्त फ़ोन नंबर फ़ील्ड जोड़ सकते हैं।

पार्स
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"];
  }
}];
फायरबेस
[[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"];
  }
}];

सुझाई गई प्रवासन रणनीति

खाते स्थानांतरित करें

उपयोगकर्ता खातों को पार्स से फ़ायरबेस में स्थानांतरित करने के लिए, अपने उपयोगकर्ता डेटाबेस को JSON या CSV फ़ाइल में निर्यात करें, फिर फ़ायरबेस सीएलआई के auth:import कमांड का उपयोग करके फ़ाइल को अपने फ़ायरबेस प्रोजेक्ट में आयात करें।

सबसे पहले, अपने उपयोगकर्ता डेटाबेस को पार्स कंसोल या अपने स्वयं-होस्ट किए गए डेटाबेस से निर्यात करें। उदाहरण के लिए, पार्स कंसोल से निर्यात की गई 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",
  ...
}

फिर, निर्यात की गई फ़ाइल को फायरबेस सीएलआई द्वारा आवश्यक प्रारूप में बदलें। अपने पार्स उपयोगकर्ताओं के objectId अपने फायरबेस उपयोगकर्ताओं के localId के रूप में उपयोग करें। साथ ही, बेस64 पार्स से 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
        }
      ]
    }
  ]
}

अंत में, bcrypt को हैश एल्गोरिथम के रूप में निर्दिष्ट करते हुए, Firebase CLI के साथ रूपांतरित फ़ाइल को आयात करें:

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

उपयोगकर्ता डेटा माइग्रेट करें

यदि आप अपने उपयोगकर्ताओं के लिए अतिरिक्त डेटा संग्रहीत कर रहे हैं, तो आप डेटा माइग्रेशन अनुभाग में वर्णित रणनीतियों का उपयोग करके इसे फायरबेस रीयलटाइम डेटाबेस में माइग्रेट कर सकते हैं। यदि आप खाता माइग्रेशन अनुभाग में वर्णित प्रवाह का उपयोग करके खातों को माइग्रेट करते हैं, तो आपके फायरबेस खातों में आपके पार्स खातों की समान आईडी होती हैं, जिससे आप उपयोगकर्ता आईडी द्वारा कुंजीबद्ध किसी भी संबंध को आसानी से माइग्रेट और पुन: उत्पन्न कर सकते हैं।

फायरबेस क्लाउड मैसेजिंग

फायरबेस क्लाउड मैसेजिंग (एफसीएम) एक क्रॉस-प्लेटफ़ॉर्म मैसेजिंग समाधान है जो आपको बिना किसी लागत के विश्वसनीय रूप से संदेश और सूचनाएं वितरित करने की सुविधा देता है। नोटिफिकेशन कंपोजर फायरबेस क्लाउड मैसेजिंग पर निर्मित एक निःशुल्क सेवा है जो मोबाइल ऐप डेवलपर्स के लिए लक्षित उपयोगकर्ता नोटिफिकेशन को सक्षम बनाता है।

अधिक जानने के लिए फायरबेस क्लाउड मैसेजिंग दस्तावेज़ देखें।

पार्स पुश अधिसूचनाओं के साथ अंतर

सूचनाओं के लिए पंजीकृत डिवाइस पर इंस्टॉल किए गए प्रत्येक पार्स एप्लिकेशन में एक संबद्ध Installation ऑब्जेक्ट होता है, जहां आप सूचनाओं को लक्षित करने के लिए आवश्यक सभी डेटा संग्रहीत करते हैं। Installation PFUser का एक उपवर्ग है, जिसका अर्थ है कि आप अपने Installation इंस्टेंसेस में कोई भी अतिरिक्त डेटा जोड़ सकते हैं।

नोटिफिकेशन कंपोजर ऐप, ऐप संस्करण और डिवाइस भाषा जैसी जानकारी के आधार पर पूर्वनिर्धारित उपयोगकर्ता सेगमेंट प्रदान करता है। आप ऑडियंस बनाने के लिए Google Analytics ईवेंट और प्रॉपर्टी का उपयोग करके अधिक जटिल उपयोगकर्ता सेगमेंट बना सकते हैं। अधिक जानने के लिए ऑडियंस सहायता मार्गदर्शिका देखें। ये लक्ष्यीकरण जानकारी फायरबेस रीयलटाइम डेटाबेस में दिखाई नहीं देती हैं।

सुझाई गई प्रवासन रणनीति

डिवाइस टोकन माइग्रेट करना

जबकि पार्स सूचनाओं के लिए इंस्टॉलेशन को लक्षित करने के लिए एपीएन डिवाइस टोकन का उपयोग करता है, एफसीएम एपीएन डिवाइस टोकन पर मैप किए गए एफसीएम पंजीकरण टोकन का उपयोग करता है। बस अपने ऐप्पल ऐप में एफसीएम एसडीके जोड़ें और यह स्वचालित रूप से एक एफसीएम टोकन प्राप्त करेगा।

चैनलों को एफसीएम विषयों पर स्थानांतरित करना

यदि आप सूचनाएं भेजने के लिए पार्स चैनल का उपयोग कर रहे हैं, तो आप एफसीएम विषयों पर माइग्रेट कर सकते हैं, जो समान प्रकाशक-ग्राहक मॉडल प्रदान करते हैं। पार्स से एफसीएम में संक्रमण को संभालने के लिए, आप ऐप का एक नया संस्करण लिख सकते हैं जो पार्स चैनलों से सदस्यता समाप्त करने के लिए पार्स एसडीके और संबंधित एफसीएम विषयों की सदस्यता लेने के लिए एफसीएम एसडीके का उपयोग करता है।

उदाहरण के लिए, यदि आपका उपयोगकर्ता "दिग्गज" विषय का सदस्य है, तो आप कुछ ऐसा करेंगे:

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

इस रणनीति का उपयोग करके, आप पुराने और नए दोनों संस्करणों के उपयोगकर्ताओं का समर्थन करते हुए, पार्स चैनल और संबंधित एफसीएम विषय दोनों पर संदेश भेज सकते हैं। जब पर्याप्त उपयोगकर्ता ऐप के पार्स-केवल संस्करण से माइग्रेट हो गए हैं, तो आप उस संस्करण को बंद कर सकते हैं और केवल एफसीएम का उपयोग करके भेजना शुरू कर सकते हैं।

अधिक जानने के लिए एफसीएम विषय दस्तावेज़ देखें।

फायरबेस रिमोट कॉन्फ़िगरेशन

फायरबेस रिमोट कॉन्फिग एक क्लाउड सेवा है जो उपयोगकर्ताओं को ऐप अपडेट डाउनलोड करने की आवश्यकता के बिना आपको अपने ऐप के व्यवहार और स्वरूप को बदलने की सुविधा देती है। रिमोट कॉन्फिग का उपयोग करते समय, आप इन-ऐप डिफ़ॉल्ट मान बनाते हैं जो आपके ऐप के व्यवहार और उपस्थिति को नियंत्रित करते हैं। फिर, आप बाद में सभी ऐप उपयोगकर्ताओं या अपने यूजरबेस के सेगमेंट के लिए इन-ऐप डिफ़ॉल्ट मानों को ओवरराइड करने के लिए फायरबेस कंसोल का उपयोग कर सकते हैं।

फायरबेस रिमोट कॉन्फिग आपके माइग्रेशन के दौरान उन मामलों में बहुत उपयोगी हो सकता है जहां आप विभिन्न समाधानों का परीक्षण करना चाहते हैं और अधिक ग्राहकों को एक अलग प्रदाता में गतिशील रूप से स्थानांतरित करने में सक्षम होना चाहते हैं। उदाहरण के लिए, यदि आपके पास अपने ऐप का एक संस्करण है जो डेटा के लिए फायरबेस और पार्स दोनों का उपयोग करता है, तो आप यह निर्धारित करने के लिए यादृच्छिक प्रतिशत नियम का उपयोग कर सकते हैं कि कौन से क्लाइंट फायरबेस से पढ़ते हैं, और धीरे-धीरे प्रतिशत बढ़ा सकते हैं।

फायरबेस रिमोट कॉन्फिग के बारे में अधिक जानने के लिए, रिमोट कॉन्फिग परिचय देखें।

पार्स कॉन्फ़िगरेशन के साथ अंतर

पार्स कॉन्फ़िगरेशन के साथ आप पार्स कॉन्फ़िगरेशन डैशबोर्ड पर अपने ऐप में कुंजी/मूल्य जोड़े जोड़ सकते हैं, और फिर क्लाइंट पर PFConfig ला सकते हैं। आपको मिलने वाला प्रत्येक PFConfig उदाहरण हमेशा अपरिवर्तनीय होता है। जब आप भविष्य में नेटवर्क से एक नया PFConfig पुनर्प्राप्त करते हैं, तो यह किसी भी मौजूदा PFConfig उदाहरण को संशोधित नहीं करेगा, बल्कि एक नया बनाएगा और इसे currentConfig के माध्यम से उपलब्ध कराएगा।

फायरबेस रिमोट कॉन्फ़िगरेशन के साथ आप कुंजी/मूल्य जोड़े के लिए इन-ऐप डिफॉल्ट बनाते हैं जिन्हें आप फायरबेस कंसोल से ओवरराइड कर सकते हैं, और आप अपने ऐप के उपयोगकर्ता अनुभव पर अपने यूजरबेस के विभिन्न सेगमेंट में विविधताएं प्रदान करने के लिए नियमों और शर्तों का उपयोग कर सकते हैं। फायरबेस रिमोट कॉन्फिग एक सिंगलटन क्लास लागू करता है जो आपके ऐप के लिए कुंजी/मूल्य जोड़े उपलब्ध कराता है। प्रारंभ में सिंगलटन उन डिफ़ॉल्ट मानों को लौटाता है जिन्हें आप इन-ऐप परिभाषित करते हैं। आप अपने ऐप के लिए सुविधाजनक किसी भी समय सर्वर से मूल्यों का एक नया सेट प्राप्त कर सकते हैं; नया सेट सफलतापूर्वक प्राप्त होने के बाद, आप चुन सकते हैं कि ऐप को नए मान उपलब्ध कराने के लिए इसे कब सक्रिय करना है।

सुझाई गई प्रवासन रणनीति

आप अपने पार्स कॉन्फिगरेशन के कुंजी/मूल्य जोड़े को फायरबेस कंसोल पर कॉपी करके और फिर फायरबेस रिमोट कॉन्फिग का उपयोग करने वाले ऐप का एक नया संस्करण तैनात करके फायरबेस रिमोट कॉन्फिग में जा सकते हैं।

यदि आप पार्स कॉन्फिग और फायरबेस रिमोट कॉन्फिग दोनों के साथ प्रयोग करना चाहते हैं, तो आप ऐप का एक नया संस्करण तैनात कर सकते हैं जो दोनों एसडीके का उपयोग करता है जब तक कि पर्याप्त उपयोगकर्ता केवल पार्स संस्करण से माइग्रेट नहीं हो जाते।

कोड तुलना

पार्स

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

फायरबेस

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;