2014-11-22 11 views
5

से कैनोनिकल आईडी कैसे प्राप्त करें मैं अपने डिवाइस के लिए एक अद्वितीय आईडी प्राप्त करने की कोशिश कर रहा हूं ताकि मैं अपने सर्वर से पुश नोटिफिकेशन प्राप्त कर सकूं।जीसीएम

सभी turorials के रूप में कहते हैं: मैं जीएमसी का उपयोग कर रजिस्टर:

GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(context); 
    String regid = gcm.register(PROJECT_NUMBER); // <---- duplicated if uninstalled/ reinstalled 
    SendRegIdToServer(regId); 

अब, मैं Regid अपने सर्वर भेजने के लिए और डिवाइस पर सहेजे गए।

समस्या तब आती है जब मैं अनइंस्टॉल और पुनर्स्थापित करता हूं, क्योंकि स्थानीय संग्रहण खो जाता है, मैं जीसीएम से फिर से पंजीकरण करने के लिए कहता हूं और मुझे एक नई पंजीकरण आईडी मिलती है। इस वजह से, मेरे सर्वर में एक ही डिवाइस के डुप्लिकेट हैं।

मैंने देखा कि प्रश्नों के एसओ बटलॉट जीसीएम रेगेस्ट्रार पर हैं, जो अब बहिष्कृत है। लोग कहते हैं कि कैननिकल आईडी का उपयोग करें, जो अद्वितीय है। लेकिन मैं इसे कैसे प्राप्त करूं?

मैं gcm.register का उपयोग कर रहा हूं और उस आईडी का उपयोग कर रहा हूं, जो स्पष्ट रूप से सर्वर पर डुप्लिकेट कर रहा है।

किसी भी मदद की सराहना करें।

उत्तर

9

कैननिकल आईडी प्रतिक्रिया में वापस आती है जब आप अपने सर्वर से Google के जीसीएम सर्वर पर संदेश भेजते हैं।

https://developer.android.com/google/gcm/http.html#response

Interpreting a success response

When a JSON request is successful (HTTP status code 200), the response body contains a JSON object with the following fields:

Field Description multicast_id Unique ID (number) identifying the multicast message. success Number of messages that were processed without an error. failure Number of messages that could not be processed. canonical_ids Number of results that contain a canonical registration ID. See Advanced Topics for more discussion of this topic. results Array of objects representing the status of the messages processed. The objects are listed in the same order as the request (i.e., for each registration ID in the request, its result is listed in the same index in the response) and they can have these fields: message_id: String representing the message when it was successfully processed. registration_id: If set, means that GCM processed the message but it has another canonical registration ID for that device, so sender should replace the IDs on future requests (otherwise they might be rejected). This field is never set if there is an error in the request. error: String describing an error that occurred while processing the message for that recipient. The possible values are the same as documented in the above table, plus "Unavailable" (meaning GCM servers were busy and could not process the message for that particular recipient, so it could be retried). If the value of failure and canonical_ids is 0, it's not necessary to parse the remainder of the response.

अद्यतन

नीचे विहित आईडी पर कुछ और जानकारी है। असल में, अगर किसी भी तरह से डिवाइस reg आईडी सिंक हो जाती है, तो Google क्या सोचता है, उसके बाद जब आपका सर्वर आउट-ऑफ-सिंक आईडी के साथ अनुरोध भेजता है, तो जीसीएम सर्वर में इसकी प्रतिक्रिया शामिल होगी, सही आईडी होना चाहिए भविष्य में प्रयोग किया जाता है।

इसके बारे में सोचें, जिस तरह से यह काम करता है; जीसीएम के साथ पंजीकृत डिवाइस जब आपके सर्वर को reg आईडी संग्रहित किया जाना चाहिए था। आपका सर्वर उस आईडी के साथ जीसीएम का अनुरोध भेजता है, जीसीएम उस आईडी का उपयोग आपके डिवाइस को संदेश भेजने के लिए करता है। जीसीएम सर्वर के बारे में बताए बिना आपके डिवाइस पर reg आईडी नहीं कर सकता है। यदि आपका सर्वर गलत गलती आईडी भेजता रहता है। इसके बजाए, जीसीएम सर्वर को बताता है कि यह किसी विशेष डिवाइस के लिए उपयोग की जाने वाली reg id खराब है, तो आपका सर्वर डिवाइस को एक संग्रहीत reg आईडी को अपडेट करने के लिए एक संदेश भेज सकता है, और फिर डिवाइस बदल सकता है आरईजी आईडी में। नीचे दी गई जानकारी का तात्पर्य है कि कुछ समय सीमा भी है क्योंकि संदेशों को भेजने के लिए "खराब" आईडी का उपयोग अभी भी किया जा सकता है। मुझे लगता है कि इस धारणा है कि यह काफी लंबा होना चाहिए अपने सर्वर उपकरण आईडी

विहित आईडी

सर्वर साइड पर ("बुरा" आईडी का उपयोग कर एक gcm संदेश के माध्यम से) बदलने के लिए जब तक, है आवेदन अच्छी तरह से व्यवहार कर रहा है, सब कुछ सामान्य रूप से काम करना चाहिए। हालांकि, यदि एप्लिकेशन में कोई बग एक ही डिवाइस के लिए एकाधिक रजिस्ट्रेशन ट्रिगर करता है, तो राज्य को सुलझाना मुश्किल हो सकता है और आप डुप्लिकेट संदेशों के साथ समाप्त हो सकते हैं।

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

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

+0

मैं सोच रहा हूं कि मुझे अपने एंड्रॉइड डिवाइस के कॉल से जीसीएम तक कैननिकल आईडी मिलनी चाहिए। क्या यह सच नहीं है? – techtinkerer

+0

विस्तृत स्पष्टीकरण के लिए धन्यवाद। मैं क्लाइंट ऐप पर काम कर रहा हूं जबकि कोई और सर्वर-साइड कर रहा है। आपके द्वारा वर्णित सभी कुछ ऐसा लगता है जो हमारे सर्वर देव को करना चाहिए। विशेष रूप से, एक ग्राहक परिप्रेक्ष्य से, क्या ग्राहक कुछ भी कर सकता है, रजिस्टर करने और उस आईडी को सहेजने और डुप्लिकेट आईडी से बचने के लिए इसे बैकएंड पर भेज सकता है? – techtinkerer

+0

मैं अधिसूचनाओं के लिए Azure अधिसूचना हब का उपयोग कर रहा हूं, तो क्या ऐसा कुछ होगा जो माइक्रोसॉफ्ट को ठीक करने की ज़रूरत है? मैं सिर्फ अपने पोर्टल से सूचनाएं भेज रहा हूं, मैं पीएनएसहैंडल को सहेजने या अधिसूचनाएं भेजने में शामिल नहीं हूं –

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