6
  • हम कार्यान्वित कर रहे हैं पुश अधिसूचना प्रणाली का उपयोग करते हुए Azure अधिसूचना हब का उपयोग कर।डुप्लिकेट पुश अधिसूचना आईओएस & Android के लिए Azure पुश अधिसूचना

  • ऐप लॉन्च के दौरान हर बार ऐप रजिस्टर करता है। उपकरण appname_userid द्वारा पहचाने गए टैग के साथ पुश अधिसूचना के लिए पंजीकृत हैं। उदाहरण के लिए Android_1122 जहां 1122 एक अद्वितीय उपयोगकर्ता आईडी है। एक आईफोन डिवाइस में वही iPhone_1122 होगा। उपयोगकर्ता के पास एकाधिक डिवाइस हो सकते हैं, जहां एक ही टैग वाले सभी डिवाइसों पर एक पुश संदेश वितरित किया जाएगा।

  • हालांकि एक मुद्दा है कि हम कुछ उपयोगकर्ताओं के लिए डुप्लिकेट पुश अधिसूचनाओं का सामना कर रहे हैं। प्रत्येक बार जब उपयोगकर्ता & अनइंस्टॉल करता है तो ऐप को दोबारा इंस्टॉल करता है, एक नया टोकन वापस कर दिया जाता है। इसलिए, उस दिए गए टैग के लिए, एकाधिक रजिस्ट्रेशन किए जाते हैं जिससे डुप्लिकेट धक्का उसी डिवाइस पर पहुंचाया जाता है।

  • भी नीचे दिए गए समान लिंक के माध्यम से चला गया है। लेकिन, पूरी तरह से स्पष्ट नहीं है कि पंजीकरण पंजीकरण आईडी रीस्ट एपीआई का उपयोग करके वास्तव में क्या मतलब है जो वास्तव में पंजीकरण के बिना पंजीकरण आईडी देता है। azure notification hubs - app uninstall

  • कृपया उसी डिवाइस के लिए डुप्लिकेट पंजीकरण से बचने के लिए कुछ तरीका प्रदान करें।

नीचे वह कोड है जिसका हम पंजीकरण करने के लिए उपयोग कर रहे हैं।

iOS उपकरणों

NSString *mobileServicesURL = @"Endpoint=sb://mobilepushnotificationhub.servicebus.windows.net/;SharedAccessKeyName=DefaultListenSharedAccessSignature;SharedAccessKey=XXXXXXXXXXXXXXXXX="; 

SBNotificationHub *hub = [[SBNotificationHub alloc] initWithConnectionString:mobileServicesURL notificationHubPath:@"notificationhubname"]; 

[hub registerNativeWithDeviceToken:token tags:[NSSet setWithObjects:[NSString stringWithFormat:@"iphoneapp_%@", [self getUserID]], nil] completion:^(NSError* error) { 
    completion(error); 
}]; 

Android उपकरणों

private void gcmPush() { 
    NotificationsManager.handleNotifications(this, SENDER_ID, MyHandler.class); 

    gcm = GoogleCloudMessaging.getInstance(this); 

    String connectionString = "Endpoint=sb://mobilepushnotificationhub.servicebus.windows.net/;SharedAccessKeyName=DefaultListenSharedAccessSignature;SharedAccessKey=XXXXXXXXXXXXXXXXXXXXXXXXXXXX="; 

    hub = new NotificationHub("notificationhubname", connectionString, this); 

    registerWithNotificationHubs(); 

    // completed Code 
} 

// Added Method 
@SuppressWarnings("unchecked") 
private void registerWithNotificationHubs() { 
    new AsyncTask() { 
     @Override 
     protected Object doInBackground(Object... params) { 
      try { 
       String regid = gcm.register(SENDER_ID); 

       Log.e("regid RECEIVED ", regid); 
       hub.register(regid, "androidapp_" + WhatsOnIndiaConstant.USERId); 

       WhatsOnIndiaConstant.notificationHub = hub; 
       WhatsOnIndiaConstant.gcmHub = gcm; 

      } catch (Exception ee) { 
       Log.e("Exception ", ee.getMessage().toString()); 
       return ee; 
      } 
      return null; 
     } 
    }.execute(null, null, null); 
} 

उत्तर

3

हर बार जब कोई उपयोगकर्ता स्थापना रद्द करें & फिर से स्थापित करता है अनुप्रयोग, नया टोकन है लौट आए। इसलिए, उस दिए गए टैग के लिए, एकाधिक पंजीकरण किए जाते हैं जिससे एक ही डिवाइस पर डुप्लिकेट धक्का दिया जाता है।

जहां तक ​​मैं समझ गया, वहाँ केवल एक ही Apple Push Notification Service के लिए एक समय में डिवाइस टोकन काम कर रहा है (यह भी here देखें) है, तो आप आईओएस के तहत एक उपकरण के लिए कई वैध डिवाइस टोकन के साथ एक समस्या है नहीं होगा, लेकिन आपके पास एक डिवाइस टोकन के लिए एकाधिक Azure Notification Hub पंजीकरण हो सकते हैं। इससे बचने के लिए आप अगर वहाँ पहले से ही कर रहे हैं ठोस डिवाइस के लिए पंजीकरण टोकन की जाँच करने के लिए है और यदि हां, तो पुन: उपयोग और उन्हें साफ:

ASP.NET WebAPI-Backend example:

// POST api/register 
// This creates a registration id 
public async Task<string> Post(string handle = null) 
{ 
    // make sure there are no existing registrations for this push handle (used for iOS and Android) 
    string newRegistrationId = null; 

    if (handle != null) 
    { 
     var registrations = await hub.GetRegistrationsByChannelAsync(handle, 100); 

     foreach (RegistrationDescription registration in registrations) 
     { 
      if (newRegistrationId == null) 
      { 
       newRegistrationId = registration.RegistrationId; 
      } 
      else 
      { 
       await hub.DeleteRegistrationAsync(registration); 
      } 
     } 
    } 

    if (newRegistrationId == null) newRegistrationId = await hub.CreateRegistrationIdAsync(); 

    return newRegistrationId; 
} 

Google Cloud Messaging साथ

, तो यह आपको लगता है कई काम कर रहे जीसीएम पंजीकरण आईडी हो सकते हैं, इसलिए आपको इसका ख्याल रखना होगा।

एप्लिकेशन में एक बग एक ही डिवाइस के लिए कई पंजीकरण ट्रिगर करता है तो यह मुश्किल राज्य सामंजस्य करने के लिए हो सकता है और आप डुप्लिकेट संदेश के साथ खत्म हो सकता है: GCM कुछ "Canonical IDs" कहलाता है।

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

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

+0

बिल्कुल सही - आपने मेरा दिन बनाया। पता नहीं था कि जीसीएम कई काम करने वाले डिवाइस टोकन का उपयोग करता है! अब मेरी धक्का सेवाएं काम करती हैं! – Freddy

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