2016-07-12 11 views
12

ठीक है तो मेरे पास एक ऐप है जो पहली बार आपको कुछ स्वागत करने वाली स्लाइडों के माध्यम से ले जाता है, फिर आपको लॉगिन/रजिस्टर पेज पर ले जाता है और फिर MainActivity पर ले जाता है।फायरबेस एफसीएम टोकन - सर्वर पर कब भेजना है?

मैं सिर्फ FCM को लागू किया है और सेवाओं उत्पन्न एक token से पहले उन पृष्ठों के किसी भी उपयोगकर्ता द्वारा देखा गया है। मैं इसे कैसे बना सकता हूं ताकि के बाद सेवा MainActivity पर हो?

समस्या यह है कि जैसे ही इसे MySQL DB पर उचित उपयोगकर्ता खाते में रीफ्रेश किया जाता है, लेकिन चूंकि उपयोगकर्ता ने अभी तक साइन इन नहीं किया है, इसलिए null और सर्वर पर मेरा संदेश है विफल रहता है। इसे डिजाइन करने का एक अच्छा तरीका क्या है? मैंने SharedPreferences में टोकन को सहेजने और उपयोगकर्ता के लॉग इन करने के बाद इसे सर्वर पर भेजना सोचा था, लेकिन टोकन को बाद के बिंदु पर रीफ्रेश होने पर बहुत सारी जटिलताओं का निर्माण होता है ?!

संभव समाधान:

मुझे यकीन है कि मैं पूरी तरह से समझ कैसे 2 सेवाओं को चलाने लेकिन onTokenRefresh में कहते हैं कि मैं सिर्फ SharedPreferences में टोकन बचाने के लिए और MainActivity में मैं SP से मूल्य प्राप्त नहीं कर रहा हूँ और फिर मैं भेज यह सर्वर के लिए। उस स्थिति में जब टोकन को ताज़ा किया जाता है तो नया मान तुरंत SharedPreferences में जाएगा। लेकिन मुझे अभी भी यह जांचना होगा कि क्या यह एसपी में एक नया मान है और फिर इसे सर्वर पर दोबारा अपलोड करें। यह भ्रामक है!

+0

http://engineering.letsnurture.com/firebase-cloud-messaging/ –

उत्तर

8

हाँ एफसीएम टोकन स्वचालित रूप से जेनरेट किया जाता है। लेकिन इसे एक अलग कोण में देखने की कोशिश करें।

इस तरह मैंने इसे संभाला।

एफसीएम आपके ऐप के शुरू होने पर टोकन उत्पन्न करने दें। OnTokenRefresh को बुलाया जाएगा और आप इसे अपनी प्राथमिकताओं में सहेज लेंगे:

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

    sendRegistrationToServer(refreshedToken); 
} 

private void sendRegistrationToServer(String token) { 
    // Add custom implementation, as needed. 
    SharedPreferenceUtils.getInstance(this).setValue(getString(R.string.firebase_cloud_messaging_token), token); 

    // To implement: Only if user is registered, i.e. UserId is available in preference, update token on server. 
    int userId = SharedPreferenceUtils.getInstance(this).getIntValue(getString(R.string.user_id), 0); 
    if(userId != 0){ 
     // Implement code to update registration token to server 
    } 
} 

आशा है कि आप रास्ते से स्पष्ट हैं। पूछें कि क्या आपको इस पर अधिक मंजूरी की आवश्यकता है।

+0

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

5

हम इसे इस तरह से संभाला:

  1. हमारे सर्वर/एक प्रयोक्ता आईडी के खिलाफ टोकन मान अद्यतन (प्राथमिक कुंजी)
  2. उपयोग 2 SharedPreferences
    1. स्ट्रिंग बना सकते हैं - टोकन स्ट्रिंग
    2. बूलियन (अपडेटेड) - क्या सर्वर पर टोकन अपडेट किया गया है या नहीं।

टोकन ताज़ा के मामले में हम टोकन स्ट्रिंग को अद्यतन करने और गलत पर बूलियन सेट। बाद में जब भी उपयोगकर्ता लॉग इन करते हैं तो हम बूलियन (अपडेटेड) की जांच करते हैं, अगर यह गलत है - हम वर्तमान आईडी को अपनी आईडी में संलग्न करते हैं और इसे सर्वर पर भेजते हैं और अपडेट को सही पर सेट करते हैं।

+1

क्या किसी उपयोगकर्ता के ईमेल का उपयोग करके टोकन प्राप्त करने का कोई तरीका है (सर्वर के सभी में)? – Andrea

11

ध्यान दें कि आप हमेशा से टोकन प्राप्त कर सकते हैं:

FirebaseInstanceID.getInstance().getToken(); 

यह null वापस आ जाएगी, तो टोकन अभी तक नहीं तैयार की गई है या टोकन अगर यह तैयार की गई है। आपके मामले में यह बहुत संभावना है कि उपयोगकर्ता द्वारा साइन इन किए जाने तक टोकन जेनरेट किया जाएगा। इसलिए जैसे ही उपयोगकर्ता ने साइन इन किया है, आपको इसे अपने ऐप सर्वर पर भेजना चाहिए। यदि यह उपलब्ध नहीं है तो आप चिंतन सोनी के उल्लेख के रूप में इसे टोकन रिफ्रेश कॉलबैक में भेज देंगे।

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