2011-07-06 14 views
9

मुझे आश्चर्य है कि किसी को इस समस्या का सामना Google C2DM के साथ हुआ है?एंड्रॉइड सी 2 डीएम: उसी डिवाइस और ऐप 0 डुप्लिकेट संदेश

  1. उपयोगकर्ता ऐप को स्थापित करता है और एक पंजीकरण कुंजी के लिए C2DM सर्वर के साथ पंजीकृत करता है: इस परिदृश्य मैं का सामना करना पड़ रहा है।
  2. उपयोगकर्ता ऐप को अनइंस्टॉल करता है।
  3. उपयोगकर्ता ऐप को पुनर्स्थापित करता है (और नए पंजीकरण कुंजी के लिए C2DM सर्वर के साथ पंजीयक)।

अब मैं अपने सर्वर से उपयोगकर्ता के फोन पर संदेश भेजता हूं और उन्हें एक डुप्लिकेट संदेश मिलता है।

क्या कोई भी गीलेर में कोई अंतर्दृष्टि डालेगा, यह अपेक्षित व्यवहार है या मैं इसे कैसे ठीक कर सकता हूं? धन्यवाद,

+1

क्या आपका मतलब है कि उन्हें त्वरित उत्तराधिकार में दो बार एक ही संदेश मिलता है? यह निश्चित रूप से अपेक्षित व्यवहार नहीं है - उनकी क्लाउड कुंजी को अब अनइंस्टॉल करते समय उपयोग नहीं किया जाना चाहिए। पूछने में मूर्ख सवाल और माफ़ी - लेकिन क्या आप सुनिश्चित हैं कि आपका सर्वर कोड उनके क्लाउड आईडी को डुप्लिकेट कर रहा है? क्या आप अपने सभी सी 2 डीएम सर्वर अनुरोधों और Google द्वारा भेजे गए प्रतिक्रियाओं का लॉग रखते हैं? –

उत्तर

7

सुनिश्चित नहीं हैं कि अगर यह सबसे अच्छा तरीका है, लेकिन वहां android-c2dm समूह, जहां पोस्टर एक तकनीक प्रदान करता है पर पर एक प्रासंगिक thread है:

मैं संदेश में पंजीकरण आईडी भेज रहा हूँ, इसलिए मैं इसे डिवाइस पर संग्रहीत पंजीकरण आईडी के खिलाफ देख सकता हूं।

यदि यह एक ही नहीं है, यह त्यागने और सेवा पंजीकरण क्रमांक उपयोग

नकारात्मक पंजीकरण भेज रहा है में नहीं रह गया है आईडी पहले सीमित संदेश आकार में कुछ स्थान में समा जाता है कि सूचित करें। लेकिन मेरे मामले में पूरी तरह से काम करता है क्योंकि मेरे मूल संदेश कुछ वर्णों से अधिक लंबा नहीं है।

+0

ग्रेट तकनीक! यह बहुत ही स्मार्ट लगता है – Matroska

0

हाँ, मैंने एक ही समस्या में भाग लिया है और मेरी राय में यह एंड्रॉइड सी 2 डीएम कार्यान्वयन में एक बड़ी निगरानी है। आईओएस इस बात को बेहतर तरीके से संभालता है कि एक ऐप केवल एक और एक डिवाइस टोकन (सी 2 डीएम पंजीकरण आईडी के समतुल्य) के लिए अधिसूचनाएं प्राप्त कर सकता है

मैं जिस कामकाज का उपयोग करता हूं वह पंजीकरण आईडी के अंतिम 10 वर्णों को भाग के रूप में भेजना है

if (!regId.endsWith(bundle.getString("regsuffix"))) return null; 
1

एक अन्य समाधान डिवाइस के लिए एक अद्वितीय पहचानकर्ता के साथ अपने सर्वर प्रदान करने के लिए हो सकता है: मेरी onMessage विधि में C2DM पेलोड के लिए और फिर मैं निम्नलिखित की जांच करते हैं। उस स्थिति में जब आप पुन: स्थापना के बाद पंजीकरण करने का प्रयास करते हैं तो आप उस यूयूआईडी के लिए पंजीकरण आईडी को अपडेट कर सकते हैं।

+0

+1 मेरे अनुप्रयोगों के आर्किटेक्चर में एक ही कार्यान्वयन कर रहा हूं। लेकिन अगर सी 2 डीएम सेवा लौटाती है कि पंजीकरण अमान्य है तो आप इसे फिर से हटा सकते हैं। –

4

यह केवल आपके आवेदन को पुनः स्थापित करने के बाद पहली पुश अधिसूचना के लिए होना चाहिए।

अनइंस्टॉल किए गए एप्लिकेशन का पता लगाने के लिए Google C2DM सेवा निष्क्रिय मोड में काम कर रही है।

अपने एप्लिकेशन को अनइंस्टॉल करने के बाद पहली पुश अधिसूचना (सी 2 डीएम से अनधिकृत किए बिना !!!) प्रतिक्रिया में कोई त्रुटि नहीं लौटाएगी। हालांकि, दूसरी पुश अधिसूचना एक "अमान्य पंजीकरण" या "पंजीकृत नहीं" त्रुटि कोड लौटाएगी जहां आप महसूस कर सकते हैं कि एप्लिकेशन अनइंस्टॉल किया गया था।

कारण यह है कि सी 2 डीएम सर्वर तत्काल प्रतिक्रिया कोड वापस करते हैं और केवल ग्राहक को धक्का देने की कोशिश करते हैं। जब ग्राहक प्रतिक्रिया देता है कि एक एप्लिकेशन अनइंस्टॉल किया गया था, तो इसे C2DM सर्वर से हटा दिया गया है।अगला पुश प्रयास तुरंत एक त्रुटि कोड वापस करेगा।

+0

लेकिन अगर उपयोगकर्ता अनइंस्टॉल करने और Reg_Id के लिए पंजीकरण के तुरंत बाद ऐप इंस्टॉल करता है तो क्या होता है। अगर डिवाइस को reg_id का उपयोग करके धक्का मिलता है जो अनइंस्टॉल करने से पहले मान्य था। क्या संदेश डिवाइस पर जाएगा या यह "अमान्य पंजीकरण" वापस करेगा। – Erik

+0

पंजीकरण आईडी प्रति डिवाइस, एप्लिकेशन और लॉग-इन Google उपयोगकर्ता अद्वितीय हैं। मुझे लगता है कि परिदृश्य में आपने वर्णन किया है, एप्लिकेशन को पिछले इंस्टॉलेशन के साथ एक ही पंजीकरण आईडी मिल जाएगी, इसलिए आपको ठीक होना चाहिए। – Zamel

0

दोनों @Zamel और @johan उत्तरों अच्छे हैं और उन्हें संयुक्त होने की आवश्यकता है। यदि आप दोनों समाधानों को गठबंधन करते हैं तो आप अपने सर्वर के डेटाबेस को कम कर देंगे।

तो सबसे अच्छा समाधान के लिए होगा: जब सर्वर से

  • अद्यतन धक्का टोकन धक्का टोकन भेजने जब मौजूदा उपकरण आईडी के लिए भेज दिया जाता है

    1. संदेश उपकरण आईडी

    2. अमान्य सर्वर के डेटाबेस में टोकन पुश करें, यदि पुश अधिसूचना सर्वर को
    पर "अमान्य पंजीकरण" या "पंजीकृत नहीं" त्रुटि कोड देता है

    जब पुश टोकन को "अमान्य पंजीकरण" या "पंजीकृत नहीं" के रूप में पहचाना जाता है तो आप इसे अमान्य कर सकते हैं (इसे शून्य के रूप में चिह्नित करें), डेटाबेस में पंक्ति को हटाएं या समाप्ति कार्यक्षमता को कार्यान्वित करें। यह आपकी आवश्यकताओं पर निर्भर करता है

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