एंड्रॉइड डिवाइस पर जीसीएम संदेशों के लिए पंजीकरण/पंजीकरण रद्द करते समय मैंने कुछ अजीब व्यवहार देखा है। ग्राहक डिवाइस के नजरिए से निम्नलिखित उपयोग के मामले का निरीक्षण करें:जीसीएम संदेशों के लिए पंजीकरण और पुन: पंजीकरण दो regId वैध होने का कारण बनता है। क्या यह इरादा है?
- GCM के लिए रजिस्टर - आईडी एक सौंपा
- अपंजीकृत
- रजिस्टर GCM के लिए - आईडी बी सौंपा
यदि, चरण 2 के बाद, सर्वर आईडी ए पर एक संदेश भेजने का प्रयास करता है, तो उसे NotRegistered
त्रुटि,प्राप्त होगाऔर उम्मीद है।
लेकिन अब अजीब हिस्सा: चरण 3 के बाद, दोनों आईडी एक और बी मान्य आईडी कर रहे हैं! दोनों आईडी डिवाइस पर इरादे रिसीवर को ट्रिगर करेंगे, जिसके परिणामस्वरूप ऐप में दो संदेश होंगे।
क्या यह व्यवहार निष्पादित है या क्या मैं कुछ गलत कर रहा हूं?
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
unregister(getApplicationContext());
register(getApplicationContext());
}
/** Registers this device for GCM messages */
public static void register(Context context) {
GCMRegistrar.checkDevice(context);
GCMRegistrar.checkManifest(context);
String regId = GCMRegistrar.getRegistrationId(context);
if (regId.equals("")) {
GCMRegistrar.register(context, SENDER_ID);
} else {
storeRegId(regId); // Also notifies back-end
}
}
public void unregister(Context context) {
GCMRegistrar.unregister(context);
}
नोट 1:
यह रजिस्टर और अपंजीकृत करने मेरी कोड, पहली गतिविधि मेरे ऐप्स पर शुरू करने पर onCreate()
से शुरू हो रहा है अपंजीकृत मैं केवल शामिल किया है() - डीबगिंग के लिए फोन प्रयोजनों। मेरा ऐप आमतौर पर "जीवन के लिए" के लिए पंजीकृत रहता है (मैं निलंबित और समाप्त होने पर जीसीएम संदेश भी प्राप्त करना चाहता हूं), लेकिन मैं अभी भी इस व्यवहार का कारण जानना चाहता हूं क्योंकि मुझे यकीन नहीं है कि अनियंत्रण एकमात्र मामला है जहां आईडी पुन: उत्पन्न होते हैं। क्या होगा यदि उपयोगकर्ता ऐप को अनइंस्टॉल और पुनर्स्थापित करता है? मुझे बुलेट प्रूफ सिस्टम चाहिए - मेरे उपयोगकर्ताओं को कभी भी एक ही जीसीएम संदेश दो बार प्राप्त नहीं होगा।
नोट 2: सिवाय इसके कि मैं वास्तव में getApplicationContext()
के साथ पंजीयन कर रहा हूँ के रूप में इस सवाल का जवाब पता चलता है समस्या, सुंदर similar to this है।
ऐसा लगता है कि ऐसा व्यवहार नहीं होना चाहिए, लेकिन आपके परीक्षण शो होने पर ऐसा होता है। शायद अगर आप प्रतिक्रिया की जांच करते हैं तो जब आप regid ए (अपने वेब पेज से) के साथ संदेश भेजते हैं तो यह क्या हो रहा है पर कुछ प्रकाश डाल सकता है, उदाहरण के लिए यदि एक canonical_id वापस आ गया है। वास्तव में आपको डिवाइस/ऐप संयोजन की पहचान करने के लिए अपनी प्राथमिक कुंजी के लिए कुछ अन्य विशेषता का उपयोग करना चाहिए और अपने डेटाबेस में या LUT केवल उन regIds को रखें जो ठीक प्रतिक्रिया देता है – NickT
क्या आप कुछ पंजीकरण सर्वर पर अपनी पंजीकरण आईडी भेज रहे हैं? –
@nickt ऐसा लगता है कि canonicalId (getCanonicalRegistrationId) यहां कुंजी है - मुझे इसके बारे में पता नहीं था। कॉल में से एक कॉल यहां शून्य लौटाता है जबकि अन्य आईडी आईडी लौटाता है। मैं दोबारा जांच करूँगा और – Nilzor