2016-10-19 12 views
6

मैं क्लाइंट (एंड्रॉइड ऐप) से विषय सदस्यता प्रबंधित करना चाहता हूं। मैं वर्तमान में क्रिएट() पर गतिविधि में कर रहा हूं। मैं सोच रहा हूं कि अगर InstanceIdService :: onTokenRefresh() पर किसी भी समय सुविधाजनक (बटन क्लिक आदि पर) सदस्यता लेने/सदस्यता समाप्त करने का सही तरीका है।क्या मुझे एफसीएम विषयों की सदस्यता लेने के लिए FirebaseInstanceIdService का विस्तार करने की आवश्यकता है?

संक्षेप में, यदि मैं क्लाइंट साइड (कोई सर्वर नहीं) पर विषय सदस्यता प्रबंधित करता हूं, तो क्या मुझे अभी भी InstanceIdService से परेशान होना है?

दस्तावेज के विभिन्न स्रोत फायरबेस क्लाउड मैसेजिंग (एफसीएम) विषय सदस्यता पर अलग-अलग लेते हैं। कुछ InstanceIdService का उल्लेख करते हैं, कुछ नहीं। यहाँ वे हैं:

  1. Firebase Send Topic Messages with Firebase Console

पर गाइड यह InstanceIdService का उल्लेख नहीं है जब विषय सदस्यता के बारे में बात।

एक बार जब आप सेटअप कार्य पूरा कर लेंगे, तो आप पर क्लाइंट कोड जोड़ सकते हैं और फिर विषय पर भेजे गए संदेशों को संभाल सकते हैं।

क्लाइंट ऐप्स किसी भी मौजूदा विषय की सदस्यता ले सकते हैं, या वे नया विषय बना सकते हैं। जब कोई ग्राहक ऐप किसी नए विषय के नाम की सदस्यता लेता है (एक आपके फ़ायरबेस परियोजना के लिए पहले से मौजूद नहीं है), तो नाम का एक नया विषय एफसीएम में बनाया गया है और कोई भी ग्राहक बाद में पर सब्सक्राइब कर सकता है।

एक विषय की सदस्यता के लिए, ग्राहक एप्लिकेशन FCM विषय नाम के साथ Firebase क्लाउड संदेश subscribeToTopic() कहता है:

FirebaseMessaging.getInstance().subscribeToTopic("news"); 
  1. Firebase Android Codelab

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

फ़ायरबेस इंस्टेंस आईडी सेवा का विस्तार करने के लिए इसे संशोधित करें और किसी विषय की सदस्यता लेने के लिए पर टोकन रिफ्रेश विधि को ओवरराइड करें। इस तरह देखो करने के लिए MyFirebaseInstanceIdService में onTokenRefresh विधि को अपडेट करने के लिए निम्न कोड का उपयोग करें:

public class MyFirebaseInstanceIdService extends FirebaseInstanceIdService { 

    private static final String TAG = "MyFirebaseIIDService"; 
    private static final String FRIENDLY_ENGAGE_TOPIC = "friendly_engage"; 

    /** 
    * The Application's current Instance ID token is no longer valid 
    * and thus a new one must be requested. 
    */ 
    @Override 
    public void onTokenRefresh() { 
     // If you need to handle the generation of a token, initially or 
     // after a refresh this is where you should do that. 
     String token = FirebaseInstanceId.getInstance().getToken(); 
     Log.d(TAG, "FCM Token: " + token); 

     // Once a token is generated, we subscribe to topic. 
     FirebaseMessaging.getInstance() 
       .subscribeToTopic(FRIENDLY_ENGAGE_TOPIC); 
    } 
} 
  1. Firebase quickstart project on github

यह InstanceIdService का उपयोग करता है, लेकिन विषय सदस्यता वहां नहीं होता है।यह एक गतिविधि में बटन क्लिक के हिस्से के रूप में ग्राहक बस किया जाता है:

Button subscribeButton = (Button) findViewById(R.id.subscribeButton); 
subscribeButton.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     // [START subscribe_topics] 
     FirebaseMessaging.getInstance().subscribeToTopic("news"); 
     // [END subscribe_topics] 

     // Log and toast 
     String msg = getString(R.string.msg_subscribed); 
     Log.d(TAG, msg); 
     Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show(); 
    } 
}); 

प्रबंधक सदस्यता के लिए InstanceIdService कोड पर टिप्पणी से पता चलता है onTokenRefresh()

@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. 
    sendRegistrationToServer(refreshedToken); 
} 
+0

दिलचस्प। वास्तव में पहले यह ध्यान नहीं दिया है। मैं चारों तरफ देखूंगा और जवाब दूंगा। –

उत्तर

2

आप पहले से ही जानते हैं, FirebaseInstanceId शायद एक सिंगलटन वर्ग है , जहां आप अपना पंजीकरण टोकन पुनर्प्राप्त करते हैं। तो मुझे लगता है कि subscribeToTopic() विधि, क्योंकि केवल विषय का नाम पारित किया गया है, आप यह मान सकते हैं कि यह पहले से ही FirebaseInstanceId का एक उदाहरण कहता है या फिर संबंधित पंजीकरण टोकन के साथ एफसीएम सर्वर की ओर से अनुरोध भेजता है और विषय सब्सक्राइब किया जाना चाहिए।

लंबी कहानी कम, मुझे नहीं लगता कि यह कोई आवश्यकता है आप FirebaseInstanceIdService का विस्तार करने के लिए subscribeToTopic() कॉल करने के लिए, हालांकि, मुझे लगता है कि यह जरूरी है, क्योंकि (docs में वर्णित है) यह है:

फायरबेस इंस्टेंस आईडी टोकन रीफ्रेश ईवेंट को संभालने के लिए बेस क्लास।


अपने अन्य पूछताछ के लिए

मैं ग्राहक (एंड्रॉइड ऐप) से विषय सदस्यता प्रबंधित करना चाहता हूं। मैं वर्तमान में गतिविधि onCreate() पर कर रहा हूं। मैं सोच रहा हूं कि InstanceIdService::onTokenRefresh() पर या किसी भी समय सुविधाजनक (बटन क्लिक आदि पर) सदस्यता लेने/सदस्यता समाप्त करने का सही तरीका है?

मुझे लगता है कि onCreate() में ऐसा करना ठीक है। यदि आप मेरा उत्तर here देखते हैं, तो @ फ्रैंकवनपफेलन ने उल्लेख किया:

ऐप शुरू करने पर विषयों की सदस्यता लेना ठीक है।

हालांकि, मुझे लगता है कि यह भी onTokenRefresh() में एक subscribeToTopic() कॉल में जोड़ने के लिए है, ताकि जैसे ही नया टोकन एप्लिकेशन उदाहरण के लिए प्रदान की जाती है, तो आप तुरंत यह तदनुसार सदस्यता ले जाएगा अच्छा है।

नोट कि व्यवहार मैं यहाँ सोच रहा हूँ जब एक पंजीकरण टोकन अवैध है, यह सदस्यता भी खो दिया है और onRefreshToken() में subscribeToTopic() जोड़ने तुरंत उन्हें आप के लिए फिर से सदस्यता ले जाएगा (बेशक यह अभी भी निर्भर करता है कि है कि है आपका कार्यान्वयन जिस विषय पर आप इसे सब्सक्राइब करना चाहते हैं)।

+0

फायरबेस लड़के से पुष्टि के संदर्भ के लिए धन्यवाद। हालांकि, मेरे पास एक बुनियादी सवाल है। यदि ऐप स्टार्ट/गतिविधि शुरू से सदस्यता लेना ठीक है, तो RefreshToken() पर सदस्यता लेने की आवश्यकता क्या है। अगर टोकन रीफ्रेश होने पर सदस्यता को नवीनीकृत करना है, तो केवल RefreshToken() के माध्यम से सदस्यता लेना पर्याप्त और अधिक सही है, है ना? – rpattabi

+1

जरूरी नहीं है। 'onRefreshToken() 'केवल [विशिष्ट कारणों] के लिए बुलाया जाता है (https://firebase.google.com/docs/reference/android/com/google/firebase/iid/FirebaseInstanceIdService#onTokenRefresh()), इसलिए यह हमेशा नहीं होता है गारंटी है कि 'subscribeToTopic() 'कहा जाएगा।आप बस इस परिदृश्य में इसके बारे में सोच सकते हैं: ऐप की शुरुआत पर 'subscribeToTopic()' को कॉल करना सुनिश्चित करता है कि आपका वर्तमान पंजीकरण टोकन सब्सक्राइब हुआ है। 'OnTokenRefresh()' में एक कॉल जोड़ना सुनिश्चित करता है कि यदि टोकन समाप्त हो जाता है, तो आप तुरंत इसे फिर से सब्सक्राइब करते हैं, इसलिए ऐप को फिर से शुरू करने के लिए आपको फिर से शुरू करने की आवश्यकता नहीं है –

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

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