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

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

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

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

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

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

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

विभिन्न विश्लेषिकी प्रदाताओं का उपयोग करना एक सामान्य परिदृश्य है जो आसानी से Google Analytics पर लागू होता है। 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"
}];

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

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

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

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

वस्तुओं

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

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

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

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

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

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

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

बैकग्राउंड सिंक

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

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

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

दोहरा लिखें

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

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

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

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

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

पार्स ऑथ के साथ अंतर

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

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

खाते माइग्रेट करें

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

FCM विषयों पर चैनल माइग्रेट करना

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

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

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

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

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

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

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

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

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

पार्स कॉन्फ़िगरेशन के साथ मतभेद

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

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

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

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

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

कोड तुलना

पार्स

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