15

भेजने के बाद अनियंत्रित टोकन त्रुटि फ़ायरबेस का उपयोग करते समय मुझे अपने एंड्रॉइड ऐप के साथ इस नाटकीय समस्या का सामना करना पड़ रहा है। 1. मेरा ऐप पहले लॉन्च पर टोकन प्राप्त करता है 2. मैं फायरबेस कंसोल से पंजीकृत टोकन पर अधिसूचना भेज सकता हूं 3. यदि मैं चरण 2 के बाद कंसोल के साथ एक अधिसूचना दोबारा भेजने की कोशिश करता हूं तो यह मुझे " अनियंत्रित टोकन "बाद में दूसरे प्रयास के बाद।एक अधिसूचना

मेरे पास पहले से मौजूद सभी आवश्यक कॉन्फ़िगरेशन हैं और google service.json फ़ाइल भी सही कॉन्फ़िगरेशन के साथ है। मेरा मानना ​​है कि चीजें सही हैं क्योंकि ऐप एक बार अधिसूचना प्राप्त करने में सक्षम है और समस्या उसके बाद ही शुरू हो रही है।

अद्यतन 1: यदि मैं ऐप को अनइंस्टॉल करता हूं और इसे पुनर्स्थापित करता हूं तो भी मैं केवल एक बार अधिसूचना प्राप्त करने में सक्षम हूं।

जो लोग कोड को देखने के लिए चाहता है, यह कैसे मैं टोकन हो रही है:

@Override 
public void onTokenRefresh() { 

    //Getting registration token 
    refreshedToken = FirebaseInstanceId.getInstance().getToken(); 

    //Displaying token on logcat 
    Log.d(TAG, "Refreshed token: " + refreshedToken); 
    saveDeviceToken(refreshedToken); 
} 

यह कॉल केवल पहले लॉन्च हो जाता है और उसके बाद, मैं इसे कहा जाता हो रही है नहीं देखा है (जो मुझे लगता है व्यवहार की उम्मीद है)।

OnMessage भी प्राप्त पहले अधिसूचना पर बुलाया जाता है और फिर इसे वापस ले लिया हो जाता है कभी नहीं:

@Override 
public void onMessageReceived(RemoteMessage remoteMessage) { 
    Log.d("FCM", "From: " + remoteMessage.getFrom()); 

    if (remoteMessage.getNotification() != null) { 
     Log.d("FCM", "Notification Message Body: " + remoteMessage.getNotification().getBody()); 
     sendNotification(remoteMessage.getNotification().getBody()); 
    } 
} 

अद्यतन 2: एक ही सर्वर कुंजी और टोकन का उपयोग FCM के HTTP एपीआई हिट करने के लिए कोशिश की और निम्नलिखित प्रतिक्रिया मिली :

{ 
    "multicast_id": 6286279702096230688, 
    "success": 0, 
    "failure": 1, 
    "canonical_ids": 0, 
    "results": [ 
    { 
     "error": "NotRegistered" 
    } 
    ] 
} 

बस पार सवालों से बचने के लिए यहां कुछ और विवरण हैं:

  • एंड्रॉयड स्टूडियो: v2.3.1
  • Google Play सेवा संस्करण: 10.0.1
  • पुस्तकालय में शामिल हैं: कोर, डेटाबेस, भंडारण, संदेश - गूगल के रूप में सभी चल रहा है एक ही संस्करण खेलने सेवा 10.0.1

अद्यतन 3: फायरबेस क्रैश, डेटाबेस और स्टोरेज एक ही प्रोजेक्ट में काम कर रहा है (जो दिखाता है कि google service.json फ़ाइल सही है)।

कृपया इसे ठीक करने में मेरी सहायता करें। जब

+0

परीक्षण करते समय, क्या आपने पहले ऐप को अनइंस्टॉल करने और पुनः इंस्टॉल करने का प्रयास किया है? –

+1

हां! मैंने कोशिश की मैंने कैशों का पुनर्निर्माण करने, पैकेजों और जेसन फ़ाइल के पूर्ण परिवर्तन की भी कोशिश की। –

+0

मैं आपको सुझाव देता हूं कि ** ** Google Play सेवाओं और फ़ायरबेस को नवीनतम 10.2.4 ** अपडेट करें। फायरबेस अभी भी अपने बीटा चरणों में है और इसके कई कार्यों को तोड़ने और उदाहरण के लिए अद्यतनों में तय हो जाता है, उदाहरण के लिए फ़ायरबेस 10.0.x से 10.2.x तक उपयोगकर्ता नाम/फोटो का परिवर्तन खराब था और बिना किसी वास्तविक समय में दिखाई नहीं दे रहा था -लॉग इन करें। फायरबेस को कई बार संपर्क करने के बाद अब तय किया गया है। इसके अलावा ** onMessageReceived() ** को कॉल किया जाता है जब आपका ऐप पृष्ठभूमि में चल रहा है। यदि आपका ऐप रुक गया है तो अधिसूचना को डिफ़ॉल्ट सिस्टम अधिसूचना द्वारा नियंत्रित किया जाता है। – Nihal

उत्तर

0

यहां मैंने कैसे तय किया।

जैसा कि सभी ने इंगित किया है कि .json फ़ाइल का पैकेज नाम इस विफलता का मुख्य कारण हो सकता है जो यहां भी मोड़ के साथ सच साबित हुआ।

मैंने फायरबेस से .json फ़ाइल डाउनलोड की थी और यह मान रहा था कि सही। जेसन फ़ाइल डाउनलोड हो रही थी। दुर्भाग्य से फ़ाइल डाउनलोड करने पर फायरबेस में कुछ बग के कारण, मुझे हमेशा मेरी कुछ अन्य परियोजनाओं (फायरबेस ऐप) की .json फ़ाइल मिल रही थी। डाउनलोड की गई फ़ाइल का निवेश करने पर, मैंने इसे समझ लिया और पैकेज नाम और चाबियाँ मैन्युअल रूप से .json फ़ाइल पर बदल दी।

मुझे सलाह दी गई थी कि किसी और चीज की कोशिश करने से पहले शामिल .json फ़ाइल को जांचें क्योंकि यह इस प्रकार के मुद्दे का प्राथमिक कारण है।

1

पंजीकरण टोकन बदलना हो सकता है:

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

आप प्रलेखन here

देख सकते हैं और आप FCM त्रुटियों के बारे में भी पढ़ सकते हैं here इस डिबग मोड के लिए होता है केवल ताकि आप अपने लांचर गतिविधि में इस विधि कॉल कर सकते हैं इस टेस्ट के HTTPS प्रमाणपत्र स्वीकार करेंगे/विकास सर्वर, क्योंकि HTTPS प्रमाणपत्र अमान्य/भरोसेमंद नहीं है रिलीज में यह ठीक रहेगा।

private void RegisterFireBase() 
     { 

if (BuildConfig.DEBUG) {  
      Task.Run(() => 
      { 
       var instanceId = FirebaseInstanceId.Instance; 
       instanceId.DeleteInstanceId(); 
       Android.Util.Log.Debug("TAG", "{0} {1}", instanceId?.Token?.ToString(), instanceId.GetToken(GetString(Resource.String.gcm_defaultSenderId), Firebase.Messaging.FirebaseMessaging.InstanceIdScope)); 

      }); 


      ServicePointManager.ServerCertificateValidationCallback += (o, certificate, chain, errors) => true; 



     } 
0

एफसीएम जीसीएम के विपरीत है।

जीसीएम कक्षाओं का उपयोग करते समय, टोकन आईडी को हर समय ताज़ा किया जाता है और फिर यह सर्वर पर डेटाबेस में भी अपडेट किया जाता है।

एफसीएम का उपयोग करते समय। एफसीएम बुनियादी वास्तुकला अद्वितीय टोकन आईडी पर काम करता है, यही कारण है कि टोकन रिफ्रेश कई बार नहीं आती है। यह केवल एक बार आमंत्रित करता है।

आपको केवल को बचाने के लिए क्या करना है टोकन आईडी उत्पन्न किया और तदनुसार इसका उपयोग करें।

पीएस: एफसीएम टोकन में तब तक रीफ्रेश नहीं होता है जब तक ऐप को पुनर्स्थापित नहीं किया जाता है।

+0

बस आपको सूचित करने के लिए कि मैं अपने डेटाबेस पर टोकन आईडी सहेज रहा हूं और जब मैं इसे अधिसूचना भेजता हूं तो यह पहली अधिसूचना के लिए काम करता है और उसके बाद सभी अधिसूचनाओं के बाद यह मुझे ऊपर उल्लिखित त्रुटि दिखाता है। –

1

मुझे पहले इसी तरह की समस्या का सामना करना याद है। यहां मैंने जो किया है और यह मेरे लिए चिकनी काम कर रहा है। उम्मीद है कि यह मदद करता है,

वरीयता स्टोर साझा प्राथमिकताओं को सहेजने, संपादित करने और हटाने के लिए एक सहायक वर्ग है।

@Override 
public void onTokenRefresh() { 
    String token = FirebaseInstanceId.getInstance().getToken(); 
    Log.i(TAG, "New FCM Token: " + token); 

    setup_flag = PreferenceStore.getBoolean(getApplicationContext(), PrefKeys.IS_FIRST_FCM_TOKEN); 
    if (!setup_flag) { 
     // save token and boolean value in shared preferences for 
     // the first time you run the app after install 
     PreferenceStore.saveString(getApplicationContext(), "FCM_TOKEN", token); 
     PreferenceStore.saveBoolean(getApplicationContext(), "IS_FIRST_FCM_TOKEN", true); 
    } else { 
     // other time your app loads, update the token (like call the API endpoint). 
    } 
} 
संबंधित मुद्दे