Google is committed to advancing racial equity for Black communities. See how.
This page was translated by the Cloud Translation API.
Switch to English

আপনার পার্স অ্যান্ড্রয়েড অ্যাপ ফায়ারবেসে স্থানান্তর করুন

আপনি যদি কোনও পার্স ব্যবহারকারী হন তবে পরিষেবা সমাধান হিসাবে বিকল্প ব্যাকএন্ডের সন্ধান করছেন, ফায়ারবেস আপনার অ্যান্ড্রয়েড অ্যাপের জন্য আদর্শ পছন্দ হতে পারে।

এই গাইডটিতে কীভাবে আপনার অ্যাপ্লিকেশনে নির্দিষ্ট পরিষেবাদি একীভূত করা যায় তা বর্ণনা করে। বেসিক ফায়ারবেস সেটআপ নির্দেশাবলীর জন্য, অ্যান্ড্রয়েড সেটআপ গাইড দেখুন।

গুগল বিশ্লেষক

গুগল অ্যানালিটিক্স একটি নিখরচায় অ্যাপ্লিকেশন পরিমাপ সমাধান যা অ্যাপ্লিকেশন ব্যবহার এবং ব্যবহারকারীর ব্যস্ততার জন্য অন্তর্দৃষ্টি সরবরাহ করে। অ্যানালিটিক্স ফায়ারবেস বৈশিষ্ট্য জুড়ে একীভূত করে এবং ফায়ারবেস এসডিকে ব্যবহার করে আপনি সংজ্ঞা দিতে পারবেন এমন 500 টি পৃথক ইভেন্টের জন্য সীমাহীন প্রতিবেদন সরবরাহ করে।

আরও জানতে গুগল অ্যানালিটিক্স ডক্স দেখুন।

প্রস্তাবিত মাইগ্রেশন কৌশল

বিভিন্ন অ্যানালিটিক্স সরবরাহকারী ব্যবহার করা একটি সাধারণ দৃশ্য যা সহজেই গুগল অ্যানালিটিকসে প্রয়োগ হয়। প্রথম ওপেন, অ্যাপ আপডেট, ডিভাইস মডেল, বয়স ইত্যাদির মতো বিশ্লেষণ স্বয়ংক্রিয়ভাবে সংগ্রহ করে এমন ইভেন্ট এবং ব্যবহারকারীর বৈশিষ্ট্যগুলি থেকে উপকার পেতে কেবল আপনার অ্যাপ্লিকেশনটিতে এটি যুক্ত করুন।

কাস্টম ইভেন্ট এবং ব্যবহারকারীর বৈশিষ্ট্যগুলির জন্য, আপনি পার্স অ্যানালিটিক্স এবং গুগল অ্যানালিটিক্স উভয়কে ইভেন্ট এবং বৈশিষ্ট্যগুলিতে লগ করতে ব্যবহার করে একটি ডাবল রাইটিং কৌশল নিয়োগ করতে পারেন যা আপনাকে ধীরে ধীরে নতুন সমাধানটি রোল আউট করার অনুমতি দেয়।

কোড তুলনা

বিশ্লেষণ বিশ্লেষণ

 // 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 ক্লাউড-হোস্টেড ডাটাবেস database ডেটা জেএসএন হিসাবে সংরক্ষণ করা হয় এবং প্রতিটি সংযুক্ত ক্লায়েন্টের সাথে রিয়েল টাইমে সিঙ্ক্রোনাইজ হয়।

আরও জানতে ফায়ারবেস রিয়েলটাইম ডেটাবেস ডক্স দেখুন।

পার্স ডেটার সাথে পার্থক্য

অবজেক্টস

ParseObject আপনি একটি ParseObject বা ParseObject একটি সাবক্লাস সংরক্ষণ করেন, এতে জেএসওএন-সামঞ্জস্যপূর্ণ ডেটার কী-মান জোড়া রয়েছে। ডেটাটি স্কিমহীন, যার অর্থ প্রতিটি ParseObject কী কী বিদ্যমান তা নির্দিষ্ট করার দরকার নেই।

সমস্ত ফায়ারবেস রিয়েলটাইম ডাটাবেস ডেটা JSON অবজেক্ট হিসাবে সংরক্ষণ করা হয় এবং ParseObject জন্য কোনও সমতুল্য নেই; আপনি কেবল প্রকারের 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();
 
Firebase
 // 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();
 
Firebase
 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"
    }
    ...
  }
}
আরও বিশদের জন্য আপনার ডেটাবেস গাইডের কাঠামোটি চেক করুন।

তথ্য পড়া Data

পার্সে আপনি কোনও নির্দিষ্ট ParseQuery অবজেক্টের আইডি ব্যবহার করে ডেটা পড়েন বা ParseQuery ব্যবহার করে 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());
        }
    }
});
 
Firebase
 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());
    }
});
 
উপলভ্য প্রকারের ইভেন্ট শ্রোতার উপর এবং কীভাবে ডেটা অর্ডার করতে এবং ফিল্টার করতে হয় সে সম্পর্কে আরও বিশদ জানতে অ্যান্ড্রয়েড গাইডে রিড এবং রাইটিং ডেটা পরীক্ষা করুন।

প্রস্তাবিত মাইগ্রেশন কৌশল

আপনার ডেটা পুনর্বিবেচনা

ফায়ারবেস রিয়েলটাইম ডেটাবেস সমস্ত সংযুক্ত ক্লায়েন্ট জুড়ে মিলসেকেন্ডে ডেটা সিঙ্ক করতে অনুকূলিত হয়েছে, এবং ফলাফল ডেটা কাঠামো পার্স কোর ডেটার থেকে পৃথক। এর অর্থ হ'ল আপনার মাইগ্রেশনের প্রথম পদক্ষেপটি হ'ল আপনার ডেটাগুলির জন্য কী কী পরিবর্তন প্রয়োজন তা বিবেচনা করা:

  • আপনার পার্স বস্তুগুলি ফায়ারবেস ডেটাতে কীভাবে মানচিত্র তৈরি করবে
  • যদি আপনার পিতামাতার-সন্তানের সম্পর্ক থাকে তবে কীভাবে আপনার ডেটাটিকে বিভিন্ন পাথের মধ্যে বিভক্ত করবেন যাতে এটি আলাদা আলাদা কলগুলিতে দক্ষতার সাথে ডাউনলোড করা যায়।

আপনার ডেটা স্থানান্তর করুন

ফায়ারবেসে আপনার ডেটা কীভাবে গঠন করবেন তা স্থির করার পরে, আপনার অ্যাপ্লিকেশনটিকে উভয় ডাটাবেসে লিখতে হবে এমন সময়কালে কীভাবে পরিচালনা করবেন তা আপনার পরিকল্পনা করা উচিত। আপনার পছন্দগুলি হ'ল:

পটভূমি সিঙ্ক

এই দৃশ্যে আপনার কাছে অ্যাপটির দুটি সংস্করণ রয়েছে: পার্স ব্যবহার করা পুরানো সংস্করণ এবং ফায়ারবেস ব্যবহার করা একটি নতুন সংস্করণ। দুটি ডাটাবেসের মধ্যে সিঙ্কগুলি পার্স ক্লাউড কোড (পার্সে ফায়ারবেস) দ্বারা পরিচালিত হয়, আপনার কোডটি ফায়ারবেসে পরিবর্তনগুলি শোনার সাথে এবং পার্সের সাথে এই পরিবর্তনগুলি সিঙ্ক করার সাথে। নতুন সংস্করণ ব্যবহার শুরু করার আগে আপনার অবশ্যই:

  • আপনার বিদ্যমান পার্স ডেটাটিকে নতুন ফায়ারবেস স্ট্রাকচারে রূপান্তর করুন এবং এটি ফায়ারবেস রিয়েলটাইম ডেটাবেজে লিখুন।
  • পার্স ক্লাউড কোড ফাংশনগুলি লিখুন যা পুরাতন ক্লায়েন্টদের দ্বারা পার্স ডেটাতে করা ফায়ারবেস রিয়েলটাইম ডেটাবেস পরিবর্তনগুলিতে লিখতে ফায়ারবেস রিয়েলটাইম ডেটাবেস লিখতে ফায়ারবেস আরএসটি এপিআই ব্যবহার করে।
  • ফায়ারবেসে পরিবর্তনগুলি শুনুন এবং পার্স ডেটাবেসে সিঙ্ক করে এমন কোডটি লিখুন এবং স্থাপন করুন।

এই দৃশ্যটি পুরানো এবং নতুন কোডের পরিষ্কার বিচ্ছিন্নতা নিশ্চিত করে এবং ক্লায়েন্টকে সহজ রাখে। এই দৃশ্যের চ্যালেঞ্জগুলি প্রাথমিক রফতানিতে বড় ডেটাসেটগুলি পরিচালনা করছে এবং দ্বি-নির্দেশমূলক সিঙ্কটি অসীম পুনরাবৃত্তি ঘটায় না তা নিশ্চিত করে।

ডাবল লিখুন

এই পরিস্থিতিতে, আপনি পার্স ডেটা থেকে ফায়ারবেস রিয়েলটাইম ডেটাবেস-এ পুরানো ক্লায়েন্টদের করা পরিবর্তনগুলি সিঙ্ক করতে পার্স ক্লাউড কোড ব্যবহার করে ফায়ারবেস এবং পার্স উভয়ই অ্যাপ্লিকেশনটির একটি নতুন সংস্করণ লিখেছেন। অ্যাপ্লিকেশনটির পার্স-একমাত্র সংস্করণ থেকে পর্যাপ্ত লোকেরা স্থানান্তরিত হয়ে গেলে, আপনি ডাবল রাইট সংস্করণ থেকে পার্স কোডটি মুছতে পারেন।

এই পরিস্থিতিতে কোনও সার্ভার সাইড কোডের প্রয়োজন নেই। এর অসুবিধাগুলি হ'ল যে ডেটা অ্যাক্সেস করা হয় না তা স্থানান্তরিত হয় না এবং উভয় এসডিকে ব্যবহার করে আপনার অ্যাপ্লিকেশনটির আকার বাড়িয়ে দেওয়া হয়।

ফায়ারবেস প্রমাণীকরণ

ফায়ারবেস প্রমাণীকরণ ব্যবহারকারীগণকে গুগল, ফেসবুক এবং টুইটারের মতো পাসওয়ার্ড এবং জনপ্রিয় সংযুক্ত পরিচয় সরবরাহকারী ব্যবহার করে প্রমাণীকরণ করতে পারে। এটি সমস্ত প্ল্যাটফর্ম জুড়ে আপনার অ্যাপ্লিকেশনটির জন্য একটি সম্পূর্ণ প্রমাণীকরণের অভিজ্ঞতা প্রয়োগ এবং বজায় রাখতে প্রয়োজনীয় উল্লেখযোগ্য বিনিয়োগ সংরক্ষণ করতে এটি ইউআই লাইব্রেরিও সরবরাহ করে।

আরও জানতে ফায়ারবেস প্রমাণীকরণ ডক্স দেখুন।

পার্স আথের সাথে পার্থক্য

পার্স 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
        }
    }
});
 
Firebase
 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());
            }
        }
    });
 

প্রস্তাবিত মাইগ্রেশন কৌশল

অ্যাকাউন্টগুলি মাইগ্রেট করুন

পার্স থেকে ফায়ারবেসে ইউজার অ্যাকাউন্টগুলি স্থানান্তর করতে, আপনার ব্যবহারকারী ডাটাবেসটিকে একটি জেএসএন বা সিএসভি ফাইলে রফতানি করুন, তারপরে ফায়ারবেস সিএলআইয়ের লেখক auth:import কমান্ড ব্যবহার করে আপনার ফায়ারবেস প্রকল্পে ফাইলটি আমদানি করুন।

প্রথমে পার্স কনসোল বা আপনার স্ব-হোস্টেড ডাটাবেস থেকে আপনার ব্যবহারকারীর ডাটাবেস রফতানি করুন। উদাহরণস্বরূপ, পার্স কনসোল থেকে রফতানি হওয়া একটি জেএসওএন ফাইল নিম্নলিখিতগুলির মতো দেখতে পারে:

{ // 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 আপনার Firebase ব্যবহারকারীদের। এছাড়াও, বেস 64 bcryptPassword থেকে 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 auth:import account_file.json --hash-algo=BCRYPT

ব্যবহারকারী ডেটা স্থানান্তর করুন

আপনি যদি আপনার ব্যবহারকারীদের জন্য অতিরিক্ত ডেটা সঞ্চয় করে রাখেন তবে ডেটা মাইগ্রেশন বিভাগে বর্ণিত কৌশলগুলি ব্যবহার করে আপনি এটি ফায়ারবেস রিয়েলটাইম ডেটাবেসে স্থানান্তর করতে পারেন। আপনি যদি অ্যাকাউন্টগুলি মাইগ্রেশন বিভাগে বর্ণিত প্রবাহটি ব্যবহার করে অ্যাকাউন্টগুলি মাইগ্রেট করে থাকেন তবে আপনার ফায়ারবেস অ্যাকাউন্টগুলিতে আপনার পার্স অ্যাকাউন্টগুলির একই আইডিসি রয়েছে, যা আপনাকে ব্যবহারকারীর আইডি দ্বারা চিহ্নিত কোনও সম্পর্ক সহজেই মাইগ্রেট এবং পুনরুত্পাদন করতে দেয়।

ফায়ারবেস ক্লাউড মেসেজিং

ফায়ারবেস ক্লাউড মেসেজিং (এফসিএম) একটি ক্রস-প্ল্যাটফর্ম মেসেজিং সমাধান যা আপনাকে কোনও মূল্য ছাড়াই নির্ভরযোগ্যভাবে বার্তা এবং বিজ্ঞপ্তিগুলি সরবরাহ করতে দেয়। বিজ্ঞপ্তি রচয়িতা ফায়ারবেস ক্লাউড মেসেজিং-এ নির্মিত একটি নিখরচায় পরিষেবা যা মোবাইল অ্যাপ্লিকেশন বিকাশকারীদের জন্য লক্ষ্যযুক্ত ব্যবহারকারী বিজ্ঞপ্তিগুলি সক্ষম করে।

আরও জানতে ফায়ারবেস ক্লাউড মেসেজিং ডক্স দেখুন।

পার্স পুশ বিজ্ঞপ্তিগুলির সাথে পার্থক্য

বিজ্ঞপ্তিগুলির জন্য নিবন্ধিত একটি ডিভাইসে ইনস্টল হওয়া প্রতিটি পার্স অ্যাপ্লিকেশনটির একটি সম্পর্কিত Installation বস্তু রয়েছে, যেখানে আপনি বিজ্ঞপ্তিগুলি লক্ষ্য করার জন্য প্রয়োজনীয় সমস্ত ডেটা সঞ্চয় করেন। Installation ParseUser একটি সাবক্লাস, যার অর্থ আপনি আপনার Installation দৃষ্টান্তে আপনি যে কোনও অতিরিক্ত ডেটা যুক্ত করতে পারেন।

বিজ্ঞপ্তি রচয়িতা অ্যাপ্লিকেশন, অ্যাপ্লিকেশন সংস্করণ এবং ডিভাইসের ভাষার মতো তথ্যের ভিত্তিতে পূর্বনির্ধারিত ব্যবহারকারী বিভাগগুলি সরবরাহ করে। আপনি গুগল অ্যানালিটিক্স ইভেন্টগুলি এবং শ্রোতাদের তৈরি করতে বৈশিষ্ট্যগুলি ব্যবহার করে আরও জটিল ব্যবহারকারী বিভাগ তৈরি করতে পারেন। আরও জানার জন্য শ্রোতাদের সহায়তা গাইড দেখুন। এই লক্ষ্যবস্তু তথ্যগুলি ফায়ারবেস রিয়েলটাইম ডেটাবেসে দৃশ্যমান নয়।

প্রস্তাবিত মাইগ্রেশন কৌশল

ডিভাইস টোকেনগুলি স্থানান্তরিত হচ্ছে

লেখার সময়, পার্স অ্যান্ড্রয়েড এসডিকে বিজ্ঞপ্তি সুরকারের দেওয়া বৈশিষ্ট্যের সাথে সামঞ্জস্য না করে, এফসিএম নিবন্ধকরণ টোকেনগুলির একটি পুরানো সংস্করণ ব্যবহার করে।

আপনি আপনার অ্যাপ্লিকেশন এফসিএম এসডিকে যুক্ত করে একটি নতুন টোকেন পেতে পারেন; তবে, এটি পার্স এসডিকে নোটিফিকেশনগুলি প্রাপ্ত করতে ব্যবহৃত টোকেনটিকে অবৈধ করতে পারে। যদি আপনি এড়াতে চান তবে পার্সের প্রেরক আইডি এবং আপনার প্রেরক আইডি উভয়ই ব্যবহার করতে পার্স এসডিকে সেট করতে পারেন। এইভাবে আপনি পার্সে এসডিকে ব্যবহৃত টোকেনটি অকার্যকর করবেন না, তবে সচেতন হন যে পার্সের প্রকল্পটি বন্ধ করে দিলে এই কাজটি বন্ধ হয়ে যাবে।

চ্যানেলগুলিকে এফসিএম বিষয়গুলিতে স্থানান্তরিত করা হচ্ছে

আপনি বিজ্ঞপ্তি প্রেরণের জন্য পার্স চ্যানেলগুলি ব্যবহার করছেন, আপনি এফসিএম বিষয়গুলিতে স্থানান্তর করতে পারেন, যা একই প্রকাশক-গ্রাহক মডেল সরবরাহ করে। পার্সে থেকে এফসিএম এ রূপান্তর পরিচালনা করতে, আপনি পার্সি চ্যানেলগুলি থেকে সাবস্ক্রাইব করতে পার্স এসডিকে এবং এফসিএম এসডিকে সংশ্লিষ্ট এফসিএম বিষয়গুলিতে সাবস্ক্রাইব করতে অ্যাপ্লিকেশনটির একটি নতুন সংস্করণ লিখতে পারেন। অ্যাপ্লিকেশনটির এই সংস্করণে আপনার পার্স এসডিকে নথিভুক্তকরণগুলি আপনার অ্যাপ্লিকেশনটির ম্যানিফেস্ট থেকে অপসারণ করা নিষ্ক্রিয় করা উচিত:

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

এই কৌশলটি ব্যবহার করে, আপনি পার্সি চ্যানেল এবং সম্পর্কিত FCM বিষয় উভয়কেই পুরানো এবং নতুন সংস্করণ উভয়ের ব্যবহারকারীদের সমর্থন করে বার্তা পাঠাতে পারেন। পর্যাপ্ত ব্যবহারকারীরা কেবলমাত্র অ্যাপ্লিকেশানের পার্স-একমাত্র সংস্করণ থেকে স্থানান্তরিত হয়ে গেলে, আপনি সেই সংস্করণটি সূর্যাস্ত করতে পারেন এবং কেবলমাত্র এফসিএম ব্যবহার করে প্রেরণ শুরু করতে পারেন।

আরও জানতে FCM বিষয়গুলির ডক্স দেখুন।

ফায়ারবেস রিমোট কনফিগার

ফায়ারবেস রিমোট কনফিগারেশন এমন একটি ক্লাউড পরিষেবা যা আপনাকে ব্যবহারকারীদের কোনও অ্যাপ্লিকেশন আপডেট ডাউনলোড না করেই আপনার অ্যাপ্লিকেশনটির আচরণ এবং চেহারা পরিবর্তন করতে দেয়। রিমোট কনফিগারেশন ব্যবহার করার সময়, আপনি অ্যাপ্লিকেশন ডিফল্ট মানগুলি তৈরি করেন যা আপনার অ্যাপ্লিকেশনটির আচরণ এবং উপস্থিতি নিয়ন্ত্রণ করে। তারপরে, আপনি পরে সমস্ত অ্যাপ ব্যবহারকারীর জন্য বা আপনার ব্যবহারকারীর অংশগুলির জন্য ইন-অ্যাপ্লিকেশন ডিফল্ট মানগুলিকে ওভাররাইড করতে ফায়ারবেস কনসোলটি ব্যবহার করতে পারেন।

আপনার মাইগ্রেশনের সময় ফায়ারবেস রিমোট কনফিগারেশন খুব কার্যকর হতে পারে যেখানে আপনি বিভিন্ন সমাধানের পরীক্ষা করতে চান এবং গতিশীলভাবে আরও ক্লায়েন্টকে অন্য সরবরাহকারীর কাছে স্থানান্তরিত করতে সক্ষম হন। উদাহরণস্বরূপ, যদি আপনার অ্যাপ্লিকেশনটির কোনও সংস্করণ থাকে যা ডেটার জন্য ফায়ারবেস এবং পার্স উভয়ই ব্যবহার করে তবে আপনি ক্লায়েন্টরা ফায়ারবেস থেকে কী পড়বেন তা নির্ধারণ করতে এবং এটিকে ধীরে ধীরে শতাংশ বৃদ্ধি করতে আপনি এলোমেলো পারসেন্টাইল বিধি ব্যবহার করতে পারেন।

ফায়ারবেস রিমোট কনফিগারেশন সম্পর্কে আরও জানতে, রিমোট কনফিগারেশন পরিচিতি দেখুন

পার্স কনফিগারেশনের সাথে পার্থক্য

পার্সে কনফিগারেশনের মাধ্যমে আপনি ParseConfig কনফিগারেশন ড্যাশবোর্ডে আপনার অ্যাপ্লিকেশনে কী / মান ParseConfig যুক্ত করতে পারেন এবং তারপরে ক্লায়েন্টে 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!");
    }
});
 

Firebase

 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");