फायरबेस (FCM) टोकन कैसे प्राप्त करें


97

यह एफसीएम का उपयोग करते हुए पहली बार है।

मैं firebase / quickstart-android से एक नमूना डाउनलोड करता हूं और मैं FCM क्विकस्टार्ट स्थापित करता हूं। लेकिन मुझे लॉग से कोई टोकन नहीं मिल सकता है यहां तक कि ऐप में लॉग टूकेन बटन भी मारा जा सकता है ।

फिर मैं फायरबेस कंसोल के साथ एक संदेश भेजने की कोशिश करता हूं और अपने ऐप पैकेज नाम को लक्षित करने के लिए सेट करता हूं। मुझे आने वाले संदेश मिले।

मैं जानना चाहता हूं कि FCM का उपयोग किया जा सकता है? GCM सब कुछ ठीक है।

समाधान:

क्योंकि मैं Android डेवलपर नहीं हूं, सिर्फ बैकएंड डेवलपर हूं। इसलिए मुझे इसे हल करने में कुछ समय लगता है। मेरी राय में, नमूना ऐप में कुछ कीड़े हैं।

यहाँ छवि विवरण दर्ज करें

कोड:

RegistrationIntentService.java

public class RegistrationIntentService extends IntentService {

    private static final String TAG = "RegIntentService";


    public RegistrationIntentService() {
        super(TAG);
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        String token = FirebaseInstanceId.getInstance().getToken();
        Log.i(TAG, "FCM Registration Token: " + token);
    }
}

MyFirebaseInstanceIDService.java

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);
//
        Intent intent = new Intent(this, RegistrationIntentService.class);
        startService(intent);
    }
    // [END refresh_token]

    /**
     * Persist token to third-party servers.
     * <p>
     * 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.
    }
}

इसे MainActivity.java में जोड़ें।

 Intent intent = new Intent(this, RegistrationIntentService.class);
        startService(intent);

ऊपर get करने के बाद आपको Logcat में टोकन मिलता है। लेकिन आखिरकार, मुझे इसे प्राप्त करने का एक सुविधाजनक तरीका मिल गया है। नमूना एप्लिकेशन को स्थापित करने के लिए बस डिबग मोड का उपयोग करें और जब आप पहली बार इसे स्थापित करने के लिए टोकन प्राप्त कर सकते हैं।

लेकिन मुझे नहीं पता कि जब मैं इसे स्थापित करता हूं तो यह लॉग को प्रिंट क्यों नहीं कर सकता। शायद मोबाइल सिस्टम से संबंधित हो।

और फिर मुझे अधिसूचना क्यों नहीं मिल रही है। FirebaseMessagingService.onMessageReceived ने SendNotification को कॉल नहीं किया


यदि लॉग मारा जाता है, तो यह नमूना ऐप में इसके साथ टोकन दिखाएगा
शुभांक

नहीं, नमूना ऐप ने कहा। यदि मैं बटन दबाता हूं तो यह केवल लॉगकैट में टोकन दिखाएगा। लेकिन मुझे logcat में कुछ नहीं मिला। @ Shubhank
wyx

इस पंक्तियों को अधूरा String refreshedToken = FirebaseInstanceId.getInstance().getToken(); Log.d(TAG, "Refreshed token: " + refreshedToken);
गौरव

जवाबों:


127

PROSTOTYPE के लिए सबसे बढ़िया और अच्छा

त्वरित समाधान इसे शेअरप्रेफ़्फ़ में संग्रहीत करना है और इस तर्क को onCreateअपने MainActivity या क्लास में विधि में जोड़ना है जो अनुप्रयोग का विस्तार कर रहा है।

FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(this, instanceIdResult -> {
    String newToken = instanceIdResult.getToken();
    Log.e("newToken", newToken);
    getActivity().getPreferences(Context.MODE_PRIVATE).edit().putString("fb", newToken).apply();
});

Log.d("newToken", getActivity().getPreferences(Context.MODE_PRIVATE).getString("fb", "empty :("));

सफाई का रास्ता

एक बेहतर विकल्प एक सेवा बनाना और एक समान तर्क के अंदर रखना है। सबसे पहले नई सर्विस बनाएं

public class MyFirebaseMessagingService extends FirebaseMessagingService {

    @Override
    public void onNewToken(String s) {
        super.onNewToken(s);
        Log.e("newToken", s);
        getSharedPreferences("_", MODE_PRIVATE).edit().putString("fb", s).apply();
    }

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

    public static String getToken(Context context) {
        return context.getSharedPreferences("_", MODE_PRIVATE).getString("fb", "empty");
    }
}

और फिर इसे AndroidManifest फ़ाइल में जोड़ें

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

अंत में, आप अपनी सेवा से एक स्थिर विधि का उपयोग करने में सक्षम हैं MyFirebaseMessagingService.getToken(Context);

सबसे तेजी से काट दिया

Log.d("Firebase", "token "+ FirebaseInstanceId.getInstance().getToken());

यह तब भी काम कर रहा है जब आप संस्करण 17.xx की तुलना में पुराने फायरबेस लाइब्रेरी का उपयोग कर रहे हैं


6
लेकिन दूसरा दृष्टिकोण केवल तब तक काम करता है जब तक कि साझा प्राथमिकताएं साफ न हो जाएं। क्या होगा अगर ऐप डेटा क्लियर हो जाए और वह स्ट्रिंग वैल्यू खो जाए? एंड्रॉइड "onNewtoken ()" को कॉल नहीं करता है क्योंकि कोई नया टोकन नहीं है। लेकिन फिर हम टोकन का अनुरोध कैसे करते हैं? हर जगह यह कहा जाता है "बस onNewToken ()" का उपयोग करें, लेकिन यह विधि केवल तब चलती है जब एक नया टोकन होता है। मान लीजिए कि विधि पहले ही चल चुकी है, लेकिन हमने टोकन स्टोर करने की जहमत नहीं उठाई। बाद में हम एक चेक करते हैं और देखते हैं कि टोकन सेट नहीं है, तब क्या? मुझे फिर से टोकन बताने के लिए एफसीएम को कैसे ट्रिगर किया जाए?
जेनरलजम्स


1
आप उपयोग कर सकते हैं FirebaseInstanceId.getInstance().getInstanceId()के बजाय FirebaseInstanceId.getInstance().getToken(), देखने के इस उत्तर
वादिम Kotov

@JeneralJames यदि कोई उपयोगकर्ता ऐप डेटा को साफ़ करता है, तो onNewTokenउसे हमेशा दस्तावेज़ों से ट्रिगर किया जाएगा, यहाँ firebase.google.com/docs/cloud-messaging/android/…
sarah

26

फायरबेस एंड्रॉयड एसडीके के पीछे की टीम एपीआई को थोड़ा बदल देती है। मैंने "टोकन टू सर्वर" तर्क को इस तरह लागू किया है:

FirebaseMessagingService के मेरे उदाहरण में:

public class FirebaseCloudMessagingService extends FirebaseMessagingService {

    ...

    @Override
    public void onNewToken(String token) {
        // sending token to server here
    }

    ...

}

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

  1. जब कोई नया उपयोगकर्ता लॉग इन करता है, तो आपको टोकन को नए उपयोगकर्ता (सर्वर पर भेजना) से बांधना होगा। क्योंकि पुराने उपयोगकर्ता के सत्र के दौरान टोकन को अद्यतन किया जा सकता है और सर्वर नए उपयोगकर्ता के टोकन को नहीं जानता है।
  2. जब उपयोगकर्ता लॉग आउट करता है, तो आपको टोकन को खोलना होगा। क्योंकि उपयोगकर्ता को अब सूचनाएं / संदेश प्राप्त नहीं होने चाहिए।

नए API का उपयोग करके, आप इस तरह टोकन प्राप्त कर सकते हैं:

FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(new OnSuccessListener<InstanceIdResult>() {
        @Override
        public void onSuccess(InstanceIdResult instanceIdResult) {
            String token = instanceIdResult.getToken();
            // send it to server
        }
    });

सौभाग्य!


OnSuccess के बाहर मान प्राप्त करने की कोशिश शून्य दे रही है।
DragonFire

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

@milosmns, आप मार्केटिंग / प्रोमो नोटिफिकेशन के मामले में सही हैं। फिर भी टोकन स्थिति के संकेत की आवश्यकता है। सरल उपाय यह होगा कि आप किसी प्रकार की हिस्ट्री टेबल में अनबाउंड टोकन स्टोर करें और फिर उन अतीत के टोकन का उपयोग करके वापस लॉग इन करने के लिए प्रोत्साहित करें।
razaeeff

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

@milosmns, Firebaseland में, टोकन समाप्त नहीं होते हैं, बल्कि नए सिरे से मिलते हैं। जब आप FCM API के साथ किसी भी टोकन संबंधित गतिविधि को ट्रिगर करते हैं, बशर्ते टोकन मान्य हो। यदि टोकन अमान्य है, तो आपको त्रुटि मिलेगी: MissingRegistration या त्रुटि: InvalidRegistration। आप यहां अधिक त्रुटि कोड पा सकते हैं: firebase.google.com/docs/cloud-messaging/…
rzaaeeff

24

महत्वपूर्ण जानकारी।

अगर google play service लटका हुआ है या नहीं चल रहा है, तो fcm return टोकन = null

यदि ठीक से काम करने वाली सेवा खेलें, तो FirebaseInstanceId.getInstance().getToken()विधि रिटर्न करती हैtoken

Log.d("FCMToken", "token "+ FirebaseInstanceId.getInstance().getToken());

हां, लेकिन ऐसा बहुत बार होता है
होउंग ड्यूक तुआन

एक बार लाने के बाद टोकन को कैश किया जाता है (इन-मेम सबसे अधिक संभावना है)। तो इसका मतलब है कि आपको इसे एक बार लाने की जरूरत है या फायरबेस को किसी और तरह से आपके लिए एक और टोकन जारी करने की आवश्यकता है। मैन्युअल रूप से stackoverflow.com/a/51630819/2102748
milosmns

13

डॉक्टर के अनुसार

एक GCM क्लाइंट ऐप को FCM में माइग्रेट करें

onTokenRefresh()

InstanceID टोकन अपडेट होने पर ही कॉल किया जाता है

तो यह केवल पहली बार में कॉल करेगा जब आप अपने डिवाइस पर एक ऐप इंस्टॉल करेंगे।

इसलिए मेरा सुझाव है कि कृपया अपने ऐप को मैन्युअल रूप से अनइंस्टॉल करें और फिर से चलाने का प्रयास करें

निश्चित रूप से आप टोकन प्राप्त करेंगे


2
फिर से स्थापित न करें, इसे मैन्युअल रूप से अनइंस्टॉल करें और फिर प्रोजेक्ट चलाएं
गौरव

इस पंक्तियों को अधूरा String refreshedToken = FirebaseInstanceId.getInstance().getToken(); Log.d(TAG, "Refreshed token: " + refreshedToken);
गौरव

1
@ गौरव, दूसरे लॉगिन के बाद मुझे टोकन कैसे मिल सकता है? onTokenRefreshप्रत्येक लॉगिन को कॉल नहीं कर रहा है। मैं अपनी लॉगिन स्क्रीन में टोकन कैसे प्राप्त कर सकता हूं?
डेलवेगा66

3
@ de_la_vega_66, आपको पहले लॉगिन पर अपना टोकन स्टोर करना होगा
गौरव

आपका सेवा Android: name = "com.google.firebase.INSTANCE_ID_EVENT" /> </ आशय-फ़िल्टर> </ सेवा>
किरिल कर्मज़ीन

9

इसे इस्तेमाल करे। क्यों इस्तेमाल कर रहे हो RegistrationIntentService?

public class FirebaseInstanceIDService extends FirebaseInstanceIdService {    
    @Override
    public void onTokenRefresh() {    
        String token = FirebaseInstanceId.getInstance().getToken();    
        registerToken(token);
    }

    private void registerToken(String token) {

    }
}

8

यह लाइन आपको फायरबेस एफसीएम टोकन मिलनी चाहिए।

String token = FirebaseInstanceId.getInstance().getToken();
Log.d("MYTAG", "This is your Firebase token" + token);

Android मॉनिटर पर प्रिंट करने के लिए Log.d को करें।



7

इसके अलावा:

    // [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);
//
        Intent intent = new Intent(this, RegistrationIntentService.class);
        startService(intent);
    }
    // [END refresh_token]

यह करो:

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

        // Implement this method to send token to your app's server
       sendRegistrationToServer(refreshedToken);

    }
    // [END refresh_token]

एक और बात:

आपको कॉल sendRegistrationToServer()विधि की आवश्यकता होगी जो सर्वर पर टोकन अपडेट करेगी, यदि आप सर्वर से पुश सूचनाएं भेज रहे हैं।

अपडेट करें:

नया फायरबेस टोकन onTokenRefresh()तब उत्पन्न होता है ( जब उसे कॉल किया जाता है):

  • एप्लिकेशन इंस्टेंस आईडी को हटा देता है
  • एप्लिकेशन को एक नए डिवाइस पर पुनर्स्थापित किया जाता है
  • उपयोगकर्ता एप्लिकेशन को पुनर्स्थापित / पुनर्स्थापित करता है
  • उपयोगकर्ता एप्लिकेशन डेटा को साफ़ करता है।

मुझे Instance ID FirebaseInstanceId.getInstance () हटाना था। DeleteInstanceId () लेकिन एक सर्विस ERROR मिल गया,
Hardik9850

2
आपको FirebaseInstanceId.getInstance().deleteInstanceId()एक और थ्रेड में चलने की आवश्यकता है
rockar06

5

उसी समय टोकन आईडी प्राप्त करने के लिए अपनी घोषणा फ़ाइल में इसे शामिल करना न भूलें

<service
    android:name=".MyFirebaseInstanceIDService">
    <intent-filter>
        <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
    </intent-filter>
</service>

5

विधि getToken()पदावनत है। आप उपयोग कर सकते हैंgetInstanceId() इसके बजाय ।

यदि आप अनुरोध करते समय परिणामों को संभालना चाहते हैं instanceId(token), तो इस कोड की जांच करें।

FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(instanceIdResult -> {
        if (instanceIdResult != null) {
            String token = instanceIdResult.getToken();
            if (!TextUtils.isEmpty(token)) {
                Log.d(TAG, "retrieve token successful : " + token);
            }
        } else{
            Log.w(TAG, "instanceIdResult should not be null..");
        }
    }).addOnFailureListener(e -> {
        //do something with e
    }).addOnCanceledListener(() -> {
        //request has canceled
    }).addOnCompleteListener(task -> Log.v(TAG, "task result : " + task.getResult().getToken()));

4

In firebase-messaging:17.1.0और New FirebaseInstanceIdService पदावनत है, आप https://stackoverflow.com/a/51475096/1351469 पर बताए onNewTokenअनुसार FirebaseMessagingServiceकक्षा में प्राप्त कर सकते हैं।

लेकिन अगर आप किसी भी समय केवल टोकन प्राप्त करना चाहते हैं, तो अब आप इसे इस तरह से कर सकते हैं:

FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener( this.getActivity(),  new OnSuccessListener<InstanceIdResult>() {
  @Override
  public void onSuccess(InstanceIdResult instanceIdResult) {
    String newToken = instanceIdResult.getToken();
    Log.e("newToken",newToken);
  }
});

क्या इसे लौटाया जा सकता है, इसलिए एक ही फ़ंक्शन का उपयोग कई स्थानों पर किया जा सकता है या हमें फायरबेस की अतुल्यकालिक प्रकृति के कारण कॉपी और पेस्ट करना होगा
ड्रैगनफायर

3

यदि आप फायरबेस के कुछ नियम का उपयोग कर रहे हैं, तो आप इसका उपयोग करके टोकन ले सकते हैं:

//------GET USER TOKEN-------
FirebaseUser mUser = FirebaseAuth.getInstance().getCurrentUser();
mUser.getToken(true)
        .addOnCompleteListener(new OnCompleteListener<GetTokenResult>() {
            public void onComplete(@NonNull Task<GetTokenResult> task) {
                if (task.isSuccessful()) {
                    String idToken = task.getResult().getToken();
                      // ...
                }
            }
        });

यदि उपयोगकर्ता लॉग इन है तो अच्छी तरह से काम करें। getCurrentUser ()



1

उन लोगों के लिए जो यहाँ FirebaseInstanceIdServiceउतरते हैं, अब अपदस्थ हो गए हैं, इसके बजाय उपयोग करें:

public class MyFirebaseMessagingService extends FirebaseMessagingService {
    @Override
    public void onNewToken(String token) {
        Log.d("MY_TOKEN", "Refreshed token: " + token);

        // 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.
        // sendRegistrationToServer(token);
    }
}

और AndroidManifest में घोषणा करें

<application... >

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

1
FirebaseInstanceId.getInstance().getInstanceId().addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
            @Override
            public void onComplete(@NonNull Task<InstanceIdResult> task) {
                if (!task.isSuccessful()) {
                    Log.w(TAG, "getInstanceId failed", task.getException());
                    return;
                }

                // Get new Instance ID token
                String **token** = task.getResult().getToken();

            }
        });

-1

टोकन प्राप्त करने के लिए आप Firebase (FCM) में निम्नलिखित का उपयोग कर सकते हैं:

FirebaseInstanceId.getInstance().getToken();

2
getToken () विधि पदावनत है! सबसे अच्छा जवाब, अब, @rzaaeeff से है।
दामी

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.