টোকেনআরফ্রেশ () কল করতে ফায়ারবেস এফসিএম ফোর্স


111

আমি আমার অ্যাপ্লিকেশনটি জিসিএম থেকে এফসিএম-তে স্থানান্তরিত করছি।

যখন কোনও নতুন ব্যবহারকারী আমার অ্যাপটি ইনস্টল করেন onTokenRefresh(), স্বয়ংক্রিয়ভাবে কল করা হবে is সমস্যাটি হ'ল ব্যবহারকারী এখনও লগইন হয়নি (কোনও ব্যবহারকারী আইডি নেই)।

onTokenRefresh()ব্যবহারকারী লগ-ইন হওয়ার পরে আমি কীভাবে ট্রিগার করতে পারি ?


1
ইতিমধ্যে নিম্নলিখিত লিঙ্কে একটি খুব অনুরূপ প্রশ্ন জিজ্ঞাসা করা হয়েছে। উত্তরটি আপনার পক্ষে কার্যকর কিনা তা পরীক্ষা করে দেখুন: stackoverflow.com/questions/37517254/…
দিয়েগো জর্জিণী

উত্তর:


172

onTokenRefresh()পদ্ধতি যখনই একটি নতুন টোকেন উত্পন্ন করা হয় না বলা যেতে যাচ্ছে। অ্যাপ্লিকেশন ইনস্টল করার পরে, এটি অবিলম্বে উত্পন্ন করা হবে (আপনি যেমনটি দেখতে পেয়েছেন)। টোকেন পরিবর্তিত হয়ে গেলে এটিও ডাকা হবে।

FirebaseCloudMessagingগাইড অনুসারে :

আপনি একটি একক, নির্দিষ্ট ডিভাইসে বিজ্ঞপ্তিগুলি লক্ষ্য করতে পারেন। আপনার অ্যাপ্লিকেশনটির প্রারম্ভিক সময়ে, FCM SDK ক্লায়েন্ট অ্যাপ্লিকেশনটির জন্য একটি নিবন্ধকরণ টোকেন উত্পন্ন করে।

স্ক্রিনশট

উত্স লিঙ্ক: https://firebase.google.com/docs/notifications/android/console-device#access_t__regifications_token

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

আপনি যদি ম্যানুয়ালি জোর করতে চান তবে আপনি onTokenRefresh()একটি ইনটেন্ট সার্ভিস তৈরি করতে এবং টোকেন দৃষ্টান্তটি মুছতে পারেন। তারপরে, আপনি getToken কল করার সময়, onTokenRefresh()পদ্ধতিটি আবার কল করা হবে।

উদাহরণ কোড:

public class DeleteTokenService extends IntentService
{
    public static final String TAG = DeleteTokenService.class.getSimpleName();

    public DeleteTokenService()
    {
        super(TAG);
    }

    @Override
    protected void onHandleIntent(Intent intent)
    {
        try
        {
            // Check for current token
            String originalToken = getTokenFromPrefs();
            Log.d(TAG, "Token before deletion: " + originalToken);

            // Resets Instance ID and revokes all tokens.
            FirebaseInstanceId.getInstance().deleteInstanceId();

            // Clear current saved token
            saveTokenToPrefs("");

            // Check for success of empty token
            String tokenCheck = getTokenFromPrefs();
            Log.d(TAG, "Token deleted. Proof: " + tokenCheck);

            // Now manually call onTokenRefresh()
            Log.d(TAG, "Getting new token");
            FirebaseInstanceId.getInstance().getToken();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }

    private void saveTokenToPrefs(String _token)
    {
        // Access Shared Preferences
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
        SharedPreferences.Editor editor = preferences.edit();

        // Save to SharedPreferences
        editor.putString("registration_id", _token);
        editor.apply();
    }

    private String getTokenFromPrefs()
    {
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
        return preferences.getString("registration_id", null);
    }
}

সম্পাদনা

FirebaseInstanceIdService

পাবলিক ক্লাস ফায়ারবেসআইনস্ট্যান্সআইডি সার্ভিস পরিষেবা প্রসারিত করে

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

অন ​​টোকেনআরফ্রেস () অবচয় করা হয়েছে । ব্যবহার করুন onNewToken()মধ্যেMyFirebaseMessagingService

public class MyFirebaseMessagingService extends FirebaseMessagingService {

@Override
public void onNewToken(String s) {
    super.onNewToken(s);
    Log.e("NEW_TOKEN",s);
    }

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    super.onMessageReceived(remoteMessage);
    }
} 

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

10
ফায়ারবেস চতুর এবং এটি টোকেনআরফ্রেশ () পদ্ধতিতে কল করবে, কেবলমাত্র যদি সেখানে টোকেন না থাকে (এটি মুছে ফেলা হয় বা এটি প্রথমবারের জন্য বলা হয়) বা অন্য কিছু ঘটে এবং টোকেন পরিবর্তন করা হয়েছে। যদি কেউ টোকেনআরফ্রেস কল করতে চান তবে টোকেনটি মুছতে পারে এবং ফায়ারবেসআইনস্ট্যান্সআইড.জেটইনস্ট্যান্স ()। GetToken () কল করতে পারে। অপারেশন ফায়ারব্যাসআইনস্ট্যান্সআইডি.জেটইনস্ট্যান্স ()। মুছে ফেলা ইনডসেন্স আইড () অ্যাসিঙ্কটাস্ক বা নতুন থ্রেডে থাকা দরকার, এটি মেইনথ্রেডে থাকতে পারে না !!!
স্টোইচো আন্দ্রিভ

3
কেন শুধু ফায়ারবেসআইনস্ট্যান্সআইড.জেট টোকেন কল করবেন না?
esong

1
ভাল, ইনটেন্ট সার্ভিসে কল করার সময় নিখুঁতভাবে কাজ করেছিল এবং প্রিফেসগুলিতে টোকেন সংরক্ষণ করার দরকার নেই বলে আমার ধারণা। যেহেতু ফায়ারবেসআইনস্ট্যান্সআইডি.জেটআইএনস্ট্যান্স ()। ডিলিটইনস্ট্যান্সআইডি () না হওয়া পর্যন্ত মান পরিবর্তন হয় না; বলা হয়. কিন্ডা আমার দিনকে বাঁচিয়েছিল। :)
ডিটক্সিক-সোল

5
ভাগ করা পছন্দগুলিতে টোকনটি কেন সংরক্ষণ করবেন - আপনি যদি ফায়ারবেসআইনস্ট্যান্সআইড.জেটইনস্ট্যান্স () কল করতে পারেন তবে যে কোনও সময়ে এর মান পেতে গেট টোকেন () কে?
আলেকজান্ডার ফারবার

18

FirebaseInstanceIdServiceরিফ্রেশ টোকেন পেতে বাস্তবায়নের চেষ্টা করুন।

নিবন্ধকরণ টোকেন অ্যাক্সেস করুন:

আপনি ফায়ারবেইস ইনস্ট্যান্সআইডসোসভারটি বাড়িয়ে টোকেনের মানটি অ্যাক্সেস করতে পারেন । নিশ্চিত হয়ে নিন যে আপনি পরিষেবাটি আপনার ম্যানিফেস্টে যুক্ত করেছেন , তারপরে getTokenপ্রসঙ্গে কল করুন এবং onTokenRefreshমান হিসাবে দেখানো হয়েছে:

     @Override
public void onTokenRefresh() {
    // Get updated InstanceID token.
    String refreshedToken = FirebaseInstanceId.getInstance().getToken();
    Log.d(TAG, "Refreshed token: " + refreshedToken);

    // TODO: Implement this method to send any registration to your app's servers.
    sendRegistrationToServer(refreshedToken);
}

সম্পূর্ণ কোড:

   import android.util.Log;

import com.google.firebase.iid.FirebaseInstanceId;
import com.google.firebase.iid.FirebaseInstanceIdService;


public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {

    private static final String TAG = "MyFirebaseIIDService";

    /**
     * Called if InstanceID token is updated. This may occur if the security of
     * the previous token had been compromised. Note that this is called when the InstanceID token
     * is initially generated so this is where you would retrieve the token.
     */
    // [START refresh_token]
    @Override
    public void onTokenRefresh() {
        // Get updated InstanceID token.
        String refreshedToken = FirebaseInstanceId.getInstance().getToken();
        Log.d(TAG, "Refreshed token: " + refreshedToken);

        // TODO: Implement this method to send any registration to your app's servers.
        sendRegistrationToServer(refreshedToken);
    }
    // [END refresh_token]

    /**
     * Persist token to third-party servers.
     *
     * Modify this method to associate the user's FCM InstanceID token with any server-side account
     * maintained by your application.
     *
     * @param token The new token.
     */
    private void sendRegistrationToServer(String token) {
        // Add custom implementation, as needed.
    }
}

আমার উত্তর এখানে দেখুন

সম্পাদনাগুলি:

আপনি নিজেই একটি ফায়ারবেইন্সট্যান্স আইডি সার্ভিস শুরু করবেন না ।

সিস্টেমটি নির্ধারণ করে যে টোকেনকে রিফ্রেশ করা দরকার। অ্যাপ্লিকেশনটির getToken () কল করা উচিত এবং সমস্ত অ্যাপ্লিকেশন সার্ভারে টোকেন প্রেরণ করা উচিত।

এটি খুব ঘন ঘন বলা হবে না, মূল ঘোরার জন্য এবং ইনস্ট্যান্স আইডি পরিবর্তনগুলি হ্যান্ডেল করার কারণে এটি প্রয়োজন:

  • অ্যাপ্লিকেশন আইডেন্স আইডি মোছা করে
  • অ্যাপ্লিকেশনটি একটি নতুন ডিভাইস ব্যবহারকারীকে পুনরুদ্ধার করা হয়েছে
  • অ্যাপটি আনইনস্টল / পুনরায় ইনস্টল করুন
  • ব্যবহারকারী অ্যাপ্লিকেশন ডেটা সাফ করে

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

নীচে উপায় চেষ্টা করুন :

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


2
আমি ফায়ারবেসআইনস্ট্যান্সআইডি সার্ভিস বাস্তবায়ন করেছি, সমস্যাটি হল টোকেনআরফ্রেশ () ব্যবহারকারীকে অ্যাপ ইনস্টল করার প্রায় অবিলম্বে কল করা হচ্ছে। লগইন / সাইনআপ করার পরে আমার এটিকে কল করা দরকার
তারেক খুরি

1
সুতরাং ফায়ারবেসআইনস্ট্যান্সআইডি মুছে ফেলা টোকেনটি রিফ্রেশ করবে, ধন্যবাদ!
লুই সিএডি

GCM এফসিএম করার পরে, ফায়ারবেসআইনস্ট্যান্সআইডি.জেটইনস্ট্যান্স ()। getToken (); সর্বদা নাল ফিরে। কোন সমাধান?
গোবিন্দ পালিওয়াল

@ তারেকৌরি আপনি এই পদ্ধতিটি কল করতে পারেন যেখানে কখনও টোকেন নেওয়া দরকার। । FirebaseInstanceId.getInstance () getToken ();
sssvrock

@pRaNaY এর ক্ষেত্রে ক্লায়েন্ট অ্যাপ আপডেট হবে onTokenRefresh()?
পীযূষ কুকদিয়া

2

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

public static void  sendRegistrationToServer(final Context context) {

if(Common.getBooleanPerf(context,Constants.isTokenSentToServer,false) ||
        Common.getStringPref(context,Constants.userId,"").isEmpty()){

    return;
}

String token =  FirebaseInstanceId.getInstance().getToken();
String userId = Common.getUserId(context);
if(!userId.isEmpty()) {
    HashMap<String, Object> reqJson = new HashMap<>();
    reqJson.put("deviceToken", token);
    ApiInterface apiService =
            ApiClient.getClient().create(ApiInterface.class);

    Call<JsonElement> call = apiService.updateDeviceToken(reqJson,Common.getUserId(context),Common.getAccessToken(context));
    call.enqueue(new Callback<JsonElement>() {
        @Override
        public void onResponse(Call<JsonElement> call, Response<JsonElement> serverResponse) {

            try {
                JsonElement jsonElement = serverResponse.body();
                JSONObject response = new JSONObject(jsonElement.toString());
                if(context == null ){
                    return;
                }
                if(response.getString(Constants.statusCode).equalsIgnoreCase(Constants.responseStatusSuccess)) {

                    Common.saveBooleanPref(context,Constants.isTokenSentToServer,true);
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }

        @Override
        public void onFailure(Call<JsonElement> call, Throwable throwable) {

            Log.d("", "RetroFit2.0 :getAppVersion: " + "eroorrrrrrrrrrrr");
            Log.e("eroooooooorr", throwable.toString());
        }
    });

}

}

মাইফায়ারবেসআইনস্ট্যান্সআইডি সার্ভিস ক্লাসে

    @Override
public void onTokenRefresh() {
    // Get updated InstanceID token.
    String refreshedToken = FirebaseInstanceId.getInstance().getToken();
    Log.d(TAG, "Refreshed token: " + refreshedToken);

    // If you want to send messages to this application instance or
    // manage this apps subscriptions on the server side, send the
    // Instance ID token to your app server.
    Common.saveBooleanPref(this,Constants.isTokenSentToServer,false);
    Common.sendRegistrationToServer(this);
    FirebaseMessaging.getInstance().subscribeToTopic("bloodRequest");
}

2

বলছি এটির খুব সহজ সমাধান রয়েছে

https://developers.google.com/instance-id/guides/android-implementation#generate_a_token

দ্রষ্টব্য: যদি আপনার অ্যাপ্লিকেশনটি টোকেনগুলি মুছে ফেলা হয়েছে যা মুছে ফেলা আইডেনস্ট্যান্সআইডি দ্বারা মুছে ফেলা হয়েছে, আপনার অ্যাপ্লিকেশনটির প্রতিস্থাপন টোকেনগুলি তৈরি করতে হবে।

উদাহরণ আইডি মোছার স্থলে কেবল টোকেনটি মুছুন:

String authorizedEntity = PROJECT_ID;
String scope = "GCM";
InstanceID.getInstance(context).deleteToken(authorizedEntity,scope);

2
আমার পক্ষে কাজ করেনি। ডিলিটটোকেন () কল করার পরে, getToken () আগের মতো একই টোকেনটি দেয় এবং টোকেনআরফ্রেশকে কল করা হয়নি was
লেরা

1

এটি যখন আপনার অ্যাপ্লিকেশন থেকে একজন ব্যবহারকারী এবং অন্যান্য ব্যবহারকারী লগইন করে (একই অ্যাপ্লিকেশন) লগইন করে (একই অ্যাপ্লিকেশন) যখন ব্যবহারকারী কোনও ইউজারের ডিভাইসে ক্রিয়াকলাপ শুরু হওয়ার আগে ইন্টারনেট সংযোগ না থাকত এবং আমাদের টোকন প্রেরণ করতে হবে তখন এটি দৃশ্যে RxJava2 এ রয়েছে scenario লগইন এপিআই)

Single.fromCallable(() -> FirebaseInstanceId.getInstance().getToken())
            .flatMap( token -> Retrofit.login(userName,password,token))
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(simple -> {
                if(simple.isSuccess){
                    loginedSuccessfully();
                }
            }, throwable -> Utils.longToast(context, throwable.getLocalizedMessage()));

প্রবেশ করুন

@FormUrlEncoded
@POST(Site.LOGIN)
Single<ResponseSimple> login(@Field("username") String username,
                         @Field("password") String pass,
                         @Field("token") String token

);

0

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

strings.xml

<string name="pref_firebase_instance_id_key">pref_firebase_instance_id</string>
<string name="pref_firebase_instance_id_default_key">default</string>

ইউটিলিটি.জেভা (যে কোনও শ্রেণি যেখানে আপনি পছন্দগুলি সেট করতে / পেতে চান)

public static void setFirebaseInstanceId(Context context, String InstanceId) {
    SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
    SharedPreferences.Editor editor;
    editor = sharedPreferences.edit();
    editor.putString(context.getString(R.string.pref_firebase_instance_id_key),InstanceId);
    editor.apply();
}

public static String getFirebaseInstanceId(Context context) {
    SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
    String key = context.getString(R.string.pref_firebase_instance_id_key);
    String default_value = context.getString(R.string.pref_firebase_instance_id_default_key);
    return sharedPreferences.getString(key, default_value);
}

মাইফায়ারবেসআইনস্ট্যান্সআইডি সার্ভিস.জভা (ফায়ারবেসআইনস্ট্যান্সআইডি সার্ভিসাকে প্রসারিত করে)

@Override
public void onCreate()
{
    String CurrentToken = FirebaseInstanceId.getInstance().getToken();

    //Log.d(this.getClass().getSimpleName(),"Inside Instance on onCreate");
    String savedToken = Utility.getFirebaseInstanceId(getApplicationContext());
    String defaultToken = getApplication().getString(R.string.pref_firebase_instance_id_default_key);

    if(CurrentToken != null && !savedToken.equalsIgnoreCase(defaultToken))
    //currentToken is null when app is first installed and token is not available
    //also skip if token is already saved in preferences...
    {
        Utility.setFirebaseInstanceId(getApplicationContext(),CurrentToken);
    }
    super.onCreate();
}

@Override
public void onTokenRefresh() {
     .... prev code
      Utility.setFirebaseInstanceId(getApplicationContext(),refreshedToken);
     ....

}

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

এটি মেইনএকটিভিটির সূচনাতে বা যে কোনও পয়েন্টে আপনার মনে হয় উদাহরণ আইডি দরকার।

MyFirebaseInstanceIdService myFirebaseInstanceIdService = new MyFirebaseInstanceIdService();
Intent intent= new Intent(getApplicationContext(),myFirebaseInstanceIdService.getClass());
//Log.d(this.getClass().getSimpleName(),"Starting MyFirebaseInstanceIdService");
startService(intent); //invoke onCreate

এবং পরিশেষে,

Utility.getFirebaseInstanceId(getApplicationContext())

দ্রষ্টব্য , আপনি ফাইরবেসআইন্সট্যান্সআইডি পদ্ধতিতে স্টার্টজারিস () কোডটি সরানোর চেষ্টা করে এটিকে আরও বাড়িয়ে তুলতে পারেন।


আপনি যদি অ্যাপটি পুনরায় সেট করেন / প্রথমবার চালান তবে টোকেনটি রিফ্রেশ করতে এটি কিছুটা সময় নেয়। সুতরাং আপনি মিনিট বা দু'বারের জন্য স্ট্রিং "ডিফল্ট" পাবেন।
বরুণ গার্গ

0
    [Service]
[IntentFilter(new[] { "com.google.firebase.INSTANCE_ID_EVENT" })]
class MyFirebaseIIDService: FirebaseInstanceIdService
{
    const string TAG = "MyFirebaseIIDService";
    NotificationHub hub;

    public override void OnTokenRefresh()
    {
        var refreshedToken = FirebaseInstanceId.Instance.Token;
        Log.Debug(TAG, "FCM token: " + refreshedToken);
        SendRegistrationToServer(refreshedToken);
    }

    void SendRegistrationToServer(string token)
    {
        // Register with Notification Hubs
        hub = new NotificationHub(Constants.NotificationHubName,
                                    Constants.ListenConnectionString, this);
        Employee employee = JsonConvert.DeserializeObject<Employee>(Settings.CurrentUser);
        //if user is not logged in 
        if (employee != null)
        {
            var tags = new List<string>() { employee.Email};
            var regID = hub.Register(token, tags.ToArray()).RegistrationId;

            Log.Debug(TAG, $"Successful registration of ID {regID}");
        }
        else
        {
            FirebaseInstanceId.GetInstance(Firebase.FirebaseApp.Instance).DeleteInstanceId();
            hub.Unregister();
        }
    }
}

0

FirebaseInstanceIdService

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

এটি করার নতুন উপায় হ'ল onNewTokenপদ্ধতিটি ওভাররাইড করাFirebaseMessagingService

public class MyFirebaseMessagingService extends FirebaseMessagingService {
    @Override
    public void onNewToken(String s) {
        super.onNewToken(s);
        Log.e("NEW_TOKEN",s);
    }

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);
    }
} 

এছাড়াও ম্যানিফেস্ট.এক্সএমএলে পরিষেবা যুক্ত করতে ভুলবেন না

<service
    android:name=".MyFirebaseMessagingService"
    android:stopWithTask="false">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>

0

আমি কীভাবে আমার ডিভাইস টোকেন আপডেট করি

প্রথমে যখন আমি লগইন করি আমি ব্যবহারকারী সংগ্রহের অধীনে এবং বর্তমান লগইন থাকা ব্যবহারকারীর অধীনে প্রথম ডিভাইস টোকেন প্রেরণ করি।

এর পরে, আমি কেবল onNewToken(token:String)আমার মধ্যে ওভাররাইড করব FirebaseMessagingService()এবং যদি সেই ব্যবহারকারীর জন্য একটি নতুন টোকেন উত্পন্ন হয় তবে কেবলমাত্র সেই মানটি আপডেট করব

class MyFirebaseMessagingService: FirebaseMessagingService() {
    override fun onMessageReceived(p0: RemoteMessage) {
        super.onMessageReceived(p0)
    }

    override fun onNewToken(token: String) {
    super.onNewToken(token)
    val currentUser= FirebaseAuth.getInstance().currentUser?.uid
    if(currentUser != null){
        FirebaseFirestore.getInstance().collection("user").document(currentUser).update("deviceToken",token)
    }
 }
} 

প্রতিবার আপনার অ্যাপ্লিকেশনটি খোলার পরে এটি একটি নতুন টোকেন চেক করবে, যদি ব্যবহারকারী এখনও সাইন ইন না করে থাকে তবে টোকেনটি আপডেট হবে না, যদি ব্যবহারকারী ইতিমধ্যে লগ ইন থাকে তবে আপনি এটি পরীক্ষা করতে পারবেন newToken

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.