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

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

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

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

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

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

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

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

कस्टम इवेंट और उपयोगकर्ता प्रॉपर्टी के लिए, आप इवेंट और प्रॉपर्टी को लॉग करने के लिए पार्स एनालिटिक्स और Google Analytics दोनों का उपयोग करके दोहरी लेखन रणनीति को नियोजित कर सकते हैं, जो आपको धीरे-धीरे नए समाधान को रोल आउट करने की अनुमति देता है।

कोड तुलना

पार्स एनालिटिक्स

// Start collecting data
ParseAnalytics.trackAppOpenedInBackground(getIntent());

Map<String, String> dimensions = new HashMap<String, String>();
// Define ranges to bucket data points into meaningful segments
dimensions.put("priceRange", "1000-1500");
// Did the user filter the query?
dimensions.put("source", "craigslist");
// Do searches happen more often on weekdays or weekends?
dimensions.put("dayType", "weekday");

// Send the dimensions to Parse along with the 'search' event
ParseAnalytics.trackEvent("search", dimensions);

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

// Obtain the FirebaseAnalytics instance and start collecting data
mFirebaseAnalytics = FirebaseAnalytics.getInstance(this);

Bundle params = new Bundle();
// Define ranges to bucket data points into meaningful segments
params.putString("priceRange", "1000-1500");
// Did the user filter the query?
params.putString("source", "craigslist");
// Do searches happen more often on weekdays or weekends?
params.putString("dayType", "weekday");

// Send the event
mFirebaseAnalytics.logEvent("search", params);

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

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

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

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

वस्तुओं

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

सभी फायरबेस रीयलटाइम डेटाबेस डेटा को JSON ऑब्जेक्ट के रूप में संग्रहीत किया जाता है, और ParseObject के लिए कोई समकक्ष नहीं है; आप बस JSON ट्री पर उन प्रकारों के मान लिखें जो उपलब्ध JSON प्रकारों के अनुरूप हों। आप डेटाबेस से पढ़ने और लिखने को सरल बनाने के लिए जावा ऑब्जेक्ट का उपयोग कर सकते हैं।

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

पार्स
@ParseClassName("GameScore")
public class GameScore {
        public GameScore() {}
        public GameScore(Long score, String playerName, Boolean cheatMode) {
            setScore(score);
            setPlayerName(playerName);
            setCheatMode(cheatMode);
        }

        public void setScore(Long score) {
            set("score", score);
        }

        public Long getScore() {
            return getLong("score");
        }

        public void setPlayerName(String playerName) {
            set("playerName", playerName);
        }

        public String getPlayerName() {
            return getString("playerName");
        }

        public void setCheatMode(Boolean cheatMode) {
            return set("cheatMode", cheatMode);
        }

        public Boolean getCheatMode() {
            return getBoolean("cheatMode");
        }
}

// Must call Parse.registerSubclass(GameScore.class) in Application.onCreate
GameScore gameScore = new GameScore(1337, "Sean Plott", false);
gameScore.saveInBackground();
फायरबेस
// Assuming we defined the GameScore class as:
public class GameScore {
        private Long score;
        private String playerName;
        private Boolean cheatMode;

        public GameScore() {}
        public GameScore(Long score, String playerName, Boolean cheatMode) {
            this.score = score;
            this.playerName = playerName;
            this.cheatMode = cheatMode;
        }

        public Long getScore() {
            return score;
        }

        public String getPlayerName() {
            return playerName;
        }

        public Boolean getCheatMode() {
            return cheatMode;
        }
}

// We would save it to our list of high scores as follows:
DatabaseReference mFirebaseRef = FirebaseDatabase.getInstance().getReference();
GameScore score = new GameScore(1337, "Sean Plott", false);
mFirebaseRef.child("scores").push().setValue(score);
अधिक विवरण के लिए, एंड्रॉइड गाइड पर डेटा पढ़ें और लिखें की जांच करें।

डेटा के बीच संबंध

एक ParseObject दूसरे ParseObject के साथ संबंध हो सकता है: कोई भी ऑब्जेक्ट अन्य ऑब्जेक्ट को मान के रूप में उपयोग कर सकता है।

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

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

पार्स
// Create the author
ParseObject myAuthor = new ParseObject("Author");
myAuthor.put("name", "Grace Hopper");
myAuthor.put("birthDate", "December 9, 1906");
myAuthor.put("nickname", "Amazing Grace");

// Create the post
ParseObject myPost = new ParseObject("Post");
myPost.put("title", "Announcing COBOL, a New Programming Language");

// Add a relation between the Post and the Author
myPost.put("parent", myAuthor);

// This will save both myAuthor and myPost
myPost.saveInBackground();
फायरबेस
DatabaseReference firebaseRef = FirebaseDatabase.getInstance().getReference();
// Create the author
Map<String, String> myAuthor = new HashMap<String, String>();
myAuthor.put("name", "Grace Hopper");
myAuthor.put("birthDate", "December 9, 1906");
myAuthor.put("nickname", "Amazing Grace");

// Save the author
String myAuthorKey = "ghopper";
firebaseRef.child('authors').child(myAuthorKey).setValue(myAuthor);

// Create the post
Map<String, String> post = new HashMap<String, String>();
post.put("author", myAuthorKey);
post.put("title", "Announcing COBOL, a New Programming Language");
firebaseRef.child('posts').push().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"
    }
    ...
  }
}
अधिक जानकारी के लिए, स्ट्रक्चर योर डेटाबेस गाइड की जाँच करें।

डेटा पढ़ना

पार्स में आप किसी विशिष्ट पार्स ऑब्जेक्ट की आईडी का उपयोग करके या ParseQuery का उपयोग करके क्वेरी निष्पादित करके डेटा पढ़ते हैं।

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

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

पार्स
ParseQuery<ParseObject> query = ParseQuery.getQuery("GameScore");
query.whereEqualTo("playerName", "Dan Stemkoski");
query.findInBackground(new FindCallback<ParseObject>() {
    public void done(List<ParseObject> scoreList, ParseException e) {
        if (e == null) {
            for (ParseObject score: scoreList) {
                Log.d("score", "Retrieved: " + Long.toString(score.getLong("score")));
            }
        } else {
            Log.d("score", "Error: " + e.getMessage());
        }
    }
});
फायरबेस
DatabaseReference mFirebaseRef = FirebaseDatabase.getInstance().getReference();
Query mQueryRef = mFirebaseRef.child("scores").orderByChild("playerName").equalTo("Dan Stemkoski");

// This type of listener is not one time, and you need to cancel it to stop
// receiving updates.
mQueryRef.addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(DataSnapshot snapshot, String previousChild) {
        // This will fire for each matching child node.
        GameScore score = snapshot.getValue(GameScore.class);
        Log.d("score", "Retrieved: " + Long.toString(score.getScore());
    }
});
उपलब्ध प्रकार के ईवेंट श्रोताओं और डेटा को ऑर्डर करने और फ़िल्टर करने के तरीके के बारे में अधिक जानकारी के लिए, एंड्रॉइड गाइड पर डेटा पढ़ें और लिखें की जांच करें।

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

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

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

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

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

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

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

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

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

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

दोहरा लिखें

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

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

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

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

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

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

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

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

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

पार्स
ParseUser user = new ParseUser();
user.setUsername("my name");
user.setPassword("my pass");
user.setEmail("email@example.com");

// other fields can be set just like with ParseObject
user.put("phone", "650-253-0000");

user.signUpInBackground(new SignUpCallback() {
    public void done(ParseException e) {
        if (e == null) {
            // Hooray! Let them use the app now.
        } else {
            // Sign up didn't succeed. Look at the ParseException
            // to figure out what went wrong
        }
    }
});
फायरबेस
FirebaseAuth mAuth = FirebaseAuth.getInstance();

mAuth.createUserWithEmailAndPassword("email@example.com", "my pass")
    .continueWithTask(new Continuation<AuthResult, Task<Void>> {
        @Override
        public Task<Void> then(Task<AuthResult> task) {
            if (task.isSuccessful()) {
                FirebaseUser user = task.getResult().getUser();
                DatabaseReference firebaseRef = FirebaseDatabase.getInstance().getReference();
                return firebaseRef.child("users").child(user.getUid()).child("phone").setValue("650-253-0000");
            } else {
                // User creation didn't succeed. Look at the task exception
                // to figure out what went wrong
                Log.w(TAG, "signInWithEmail", task.getException());
            }
        }
    });

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

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

उपयोगकर्ता खातों को पार्स से फ़ायरबेस में स्थानांतरित करने के लिए, अपने उपयोगकर्ता डेटाबेस को 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 ParseUser का एक उपवर्ग है, जिसका अर्थ है कि आप अपने Installation इंस्टेंसेस में कोई भी अतिरिक्त डेटा जोड़ सकते हैं।

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

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

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

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

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

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

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

<service android:name="com.parse.PushService" />
<receiver android:name="com.parse.ParsePushBroadcastReceiver"
  android:exported="false">
<intent-filter>
<action android:name="com.parse.push.intent.RECEIVE" />
<action android:name="com.parse.push.intent.DELETE" />
<action android:name="com.parse.push.intent.OPEN" />
</intent-filter>
</receiver>
<receiver android:name="com.parse.GcmBroadcastReceiver"
  android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />

<!--
IMPORTANT: Change "com.parse.starter" to match your app's package name.
-->
<category android:name="com.parse.starter" />
</intent-filter>
</receiver>

<!--
IMPORTANT: Change "YOUR_SENDER_ID" to your GCM Sender Id.
-->
<meta-data android:name="com.parse.push.gcm_sender_id"
  android:value="id:YOUR_SENDER_ID" />;

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

ParsePush.unsubscribeInBackground("Giants", new SaveCallback() {
    @Override
    public void done(ParseException e) {
        if (e == null) {
            FirebaseMessaging.getInstance().subscribeToTopic("Giants");
        } else {
            // Something went wrong unsubscribing
        }
    }
});

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

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

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

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

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

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

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

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

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

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

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

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

कोड तुलना

पार्स

ParseConfig.getInBackground(new ConfigCallback() {
    @Override
    public void done(ParseConfig config, ParseException e) {
        if (e == null) {
            Log.d("TAG", "Yay! Config was fetched from the server.");
        } else {
            Log.e("TAG", "Failed to fetch. Using Cached Config.");
            config = ParseConfig.getCurrentConfig();
        }

        // Get the message from config or fallback to default value
        String welcomeMessage = config.getString("welcomeMessage", "Welcome!");
    }
});

फायरबेस

mFirebaseRemoteConfig = FirebaseRemoteConfig.getInstance();
// Set defaults from an XML resource file stored in res/xml
mFirebaseRemoteConfig.setDefaults(R.xml.remote_config_defaults);

mFirebaseRemoteConfig.fetch()
    .addOnSuccessListener(new OnSuccessListener<Void>() {
        @Override
        public void onSuccess(Void aVoid) {
            Log.d("TAG", "Yay! Config was fetched from the server.");
            // Once the config is successfully fetched it must be activated before newly fetched
            // values are returned.
            mFirebaseRemoteConfig.activateFetched();
        }
    })
    .addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception exception) {
            Log.e("TAG", "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.
String welcomeMessage = mFirebaseRemoteConfig.getString("welcomeMessage");