2017-04-03 11 views
14

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

मैं

FirebaseInstanceId.getInstance().deleteToken(FirebaseInstanceId.getInstance().getId(), FirebaseMessaging.INSTANCE_ID_SCOPE) 

की कोशिश की लेकिन मैं अभी भी अपने डिवाइस के registration_id को सूचनाएं प्राप्त करते हैं।

मैं भी लगता है कि इस टोकन मेरे द्वारा हटाए जाने चाहिए बनाया:

FirebaseInstanceId.getInstance().getToken(FirebaseInstanceId.getInstance().getId(), FirebaseMessaging.INSTANCE_ID_SCOPE) 

या बस FirebaseInstanceId.getInstance().getToken())।

मैंने FirebaseInstanceId.getInstance().deleteInstanceId() भी कोशिश की, लेकिन अगली बार जब मैं FirebaseInstanceId.getInstance.getToken पर कॉल करता हूं तो मुझे शून्य मिलता है (यह दूसरी कोशिश पर काम करता है)।

मुझे लगता है, deleteInstanceId के बाद मैं तुरंत getToken() पर कॉल कर सकता हूं, लेकिन यह एक हैक जैसा दिखता है। और this answer भी कहता है कि यह नहीं किया जाना चाहिए, लेकिन यह टोकन को हटाने का प्रस्ताव करता है जो स्पष्ट रूप से काम नहीं करता है।

तो इसे संभालने का सही तरीका क्या है?

उत्तर

13

ठीक है। तो मैं कुछ परीक्षण करने में कामयाब रहे और निम्नलिखित निष्कर्ष निकाला है:

  1. deleteToken()getToken(String, String) के समकक्ष है, लेकिन getToken() के लिए नहीं है।

यह केवल तभी काम करता है जब आप प्रेषक आईडी पास कर रहे हैं तो एक अलग प्रेषक आईडी है (वही आईडी नहीं जो आपके google-services.json में देखी जा सकती है)। उदाहरण के लिए, आप अपने ऐप को भेजने के लिए एक अलग सर्वर को भेजने की अनुमति देना चाहते हैं, तो आप अपने एप को भेजने के लिए प्रमाणीकरण देने के लिए getToken("THEIR_SENDER_ID", "FCM") पर कॉल करें। यह एक अलग पंजीकरण टोकन वापस करेगा जो केवल उस विशिष्ट प्रेषक से मेल खाता है।

भविष्य में, अगर आप अपने ऐप में भेजने के लिए उनके प्राधिकरण दूर करने के लिए चुना है, तो आप deleteToken("THEIR_SENDER_ID", "FCM") का उपयोग करना होगा। यह संबंधित टोकन को अमान्य कर देगा, और जब प्रेषक एक संदेश भेजने का प्रयास करता है, इच्छित व्यवहार के रूप में, उन्हें NotRegistered त्रुटि प्राप्त होगी।

  1. अपने स्वयं के प्रेषक के लिए टोकन हटाने के लिए, सही हैंडलिंग deleteInstanceId() का उपयोग करना है।

विशेष रूप से इस answer by @Prince का उल्लेख करते हुए विशेष रूप से कोड नमूना इस के साथ मेरी मदद करने के लिए।

deleteInstanceId() पर कॉल करने के बाद @ MichałK पहले से ही अपने पोस्ट में कर रहा है, getToken() को नए टोकन के लिए अनुरोध भेजने के लिए बुलाया जाना चाहिए। हालांकि, आपको इसे दूसरी बार फोन करने की आवश्यकता नहीं है। onTokenRefresh() लागू होने तक, इसे स्वचालित रूप से आपको नया टोकन प्रदान करने के लिए ट्रिगर करना चाहिए।

संक्षिप्त के लिए, deleteInstanceId()>getToken()>onTokenRefresh() देखें।

नोट: deleteInstanceId() पर कॉल करने से न केवल आपके स्वयं के ऐप के लिए टोकन हटा दिया जाएगा। यह ऐप इंस्टेंस से जुड़े सभी विषय सदस्यता और अन्य सभी टोकन को हटा देगा।


आप सकारात्मक आप deleteToken() ठीक से कॉल कर रहे हैं? दर्शकों के लिए मूल्य होना चाहिए (आपके द्वारा लिंक किए गए मेरे उत्तर से भी देखा गया है) "ऐप सर्वर की प्रेषक आईडी पर सेट है"। आप getId() मान पास कर रहे हैं जो प्रेषक आईडी के समान नहीं है (इसमें ऐप इंस्टेंस आईडी मान शामिल है)। साथ ही, आप संदेश कैसे भेज रहे हैं (ऐप सर्वर या अधिसूचना कंसोल)?

getToken() और getToken(String, String) विभिन्न टोकन लौटाता है। मेरा उत्तर here देखें।

मैं भी FirebaseInstanceId.getInstance().deleteInstanceId() की कोशिश की है, लेकिन फिर अगली बार मैं FirebaseInstanceId.getInstance.getToken फोन मैं अशक्त (यह दूसरी कोशिश में काम करता है) प्राप्त करते हैं।

यह शायद इसलिए है क्योंकि पहली बार जब आप getToken() कॉल कर रहे हैं, यह अभी भी उत्पन्न किया जा रहा है है। यह सिर्फ इरादा व्यवहार है।

मुझे लगता है, deleteInstanceId के बाद मैं तुरंत फिर से getToken() कह सकते हैं, लेकिन यह एक हैक की तरह दिखता है।

वास्तव में नहीं। इस प्रकार आपको नया जेनरेट किया जाएगा (बशर्ते कि यह पहले से ही जेनरेट किया गया हो) टोकन। तो मुझे लगता है कि यह ठीक है।

+0

यह एकमात्र "प्रेषक आईडी" है जिसने मुझे गेटोकन या हटाए जाने के लिए एक त्रुटि नहीं फेंक दी। जब मैंने अपने फायरबेस कंसोल से टेक्स्ट प्रोजेक्ट आईडी का उपयोग किया तो दोनों विधियों ने फेंक दिया। तब मैंने संख्यात्मक आईडी का उपयोग किया जो मुझे googleservices.json में मिला और ऐसा लगता है कि यह काम करता है। फिर getId() पारित किया और यह या तो फेंक नहीं दिया। तो मैंने सोचा कि यह है। –

+0

हैक के लिए, मुझे इसे हटाने के तुरंत बाद इसे कॉल करना होगा, इसलिए यह पहली बार शून्य हो जाता है, और उसके बाद इसे काम करने के लिए लॉगिन के दौरान कॉल करें। यही कारण है कि मुझे लगता है कि यह एक हैक है। –

+0

मैं कोशिश करता हूं और देखता हूं कि मैं बाद में कुछ परीक्षण कर सकता हूं और व्यवहार को दोहरा सकता हूं। यदि मेरे पास समय है तो यहां वापस आ जाएगा। चीयर्स! –

2

प्रयास करें इस

मैं एक ही शर्त पर काम कर रहा था, जब मैं अपने आवेदन से मेरी लॉगआउट किया था लेकिन समस्या यह है कि लॉग आउट मैं अभी भी fire-base.so से पुश अधिसूचना हो रही थी के बाद करने की कोशिश की थी हटाना फायरबेस टॉकन लेकिन जब लॉग इन विधि में आता है तो लॉगआउट विधि में टोकन हटाने के बाद यह NULL दिखाता है जब फ्रिबेसबेस टोकन प्राप्त करने का प्रयास किया जाता है, इसलिए मेरा ऐप फ़ायरबेस टॉकन हटाने के बाद क्रैश हो रहा था। 2 दिनों के बाद काम करने के बाद मुझे अपने समाधान मिल गए ..होप यह आपके लिए भी काम करेगा।

  1. अपने लॉगआउट विधि में

    क्योंकि आप अपने प्रवेश पद्धति गतिविधि में मुख्य विधि

    new AsyncTask<Void,Void,Void>() 
    { 
        @Override 
        protected Void doInBackground(Void... params) 
        { 
         { 
          try 
          { 
           FirebaseInstanceId.getInstance().deleteInstanceId(); 
          } catch (IOException e) 
          { 
           e.printStackTrace(); 
          } 
         } 
         return null; 
        } 
        @Override 
        protected void onPostExecute(Void result) 
        { 
         //call your activity where you want to land after log out 
        } 
    }.execute(); 
    
  2. में firebase टोकन नहीं हटा सकते उत्पन्न फिर firebase टोकन (onresume विधि पसंद करते हैं) पृष्ठभूमि में firebase टोकन को नष्ट

    new AsyncTask<Void,Void,Void>() 
    { 
        @Override 
        protected Void doInBackground(Void... params) 
        { 
    
         String token = FirebaseInstanceId.getInstance().getToken(); 
         while(token == null)//this is used to get firebase token until its null so it will save you from null pointer exeption 
         { 
          token = FirebaseInstanceId.getInstance().getToken(); 
         } 
         return null; 
        } 
        @Override 
        protected void onPostExecute(Void result) 
        { 
    
        } 
    }.execute(); 
    

मेरे मामले में मेरे लिए काम करता है, तो मुझे कोई टिप्पणी नहीं है क्या समस्या

संबंधित मुद्दे