iOS एप्लिकेशन: सूचनाएं कैसे साफ़ करें?


109

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

मैं उन पोस्टों पर आया, जहां लोग setApplicationIconBadgeNumberसूचनाओं को खाली करने के लिए शून्य-मान पर कॉल कर रहे हैं । यह मुझे बहुत अजीब लगता है, इसलिए मेरा मानना ​​है कि शायद एक और समाधान मौजूद है?

EDIT1:

मुझे सूचनाएं साफ़ करने में कुछ समस्याएं हो रही हैं। कृपया मेरा कोड यहाँ देखें:

- (void) clearNotifications {
    [[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];
    [[UIApplication sharedApplication] cancelAllLocalNotifications];
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    if (launchOptions != nil)
    {
        NSDictionary* dictionary = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
        if (dictionary != nil)
        {
            NSLog(@"Launched from push notification: %@", dictionary);

            [self clearNotifications];
        }
    }

    return YES;
}

- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo
{    
    NSLog(@"Received notification: %@", userInfo);
    [self clearNotifications];
}

मैं Xcode के माध्यम से ऐप चला रहा हूं। जब ऐप को छोटा किया जाता है और मैं अधिसूचना केंद्र में अधिसूचना का उपयोग करके ऐप को शुरू करता हूं, तो मैं लॉग में देख सकता हूं, didReceiveRemoteNotificationजिसे कॉल किया जाता है और ब्रेकपॉइंट का उपयोग करके मैं देख सकता हूं, कि clearNotificationsभाग गया है। लेकिन फिर भी अधिसूचना अधिसूचना केंद्र में लटका हुआ है। क्यों?

जवाबों:


157

सबसे अधिक संभावना है क्योंकि अधिसूचना केंद्र एक अपेक्षाकृत नई सुविधा है, Apple जरूरी नहीं कि सूचनाओं को साफ़ करने के लिए एक पूरे नए प्रतिमान को धक्का देना चाहता हो। इसके बजाय, वे बहु-उद्देश्यित थे[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0]; कहा कि सूचनाओं को स्पष्ट करने के लिए गया है। यह थोड़ा अजीब लग सकता है, और Apple भविष्य में ऐसा करने के लिए अधिक सहज तरीका प्रदान कर सकता है, लेकिन कुछ समय के लिए यह आधिकारिक तरीका है।

स्वयं, मैं इस स्निपेट का उपयोग करता हूं:

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];
[[UIApplication sharedApplication] cancelAllLocalNotifications];

जो अधिसूचना केंद्र से ऐप के सभी सूचनाओं को साफ़ करने में कभी विफल नहीं होता है।


CancelAllLocalNotifications डेप्रेक्टेड है - डेवलपर ।apple.com/documentation/uikit/uiapplication/… आपको let center = UNUserNotificationCenter.current() center.removeAllDeliveredNotifications() // To remove all delivered notifications stackoverflow.com/a/40397907/1155650
रोहित विपिन मैथ्यूज

119

बस pcperini के जवाब पर विस्तार करने के लिए। जैसा कि उन्होंने उल्लेख किया है कि आपको अपनी application:didFinishLaunchingWithOptions:विधि में निम्नलिखित कोड जोड़ने होंगे ;

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];
[[UIApplication sharedApplication] cancelAllLocalNotifications];

आप इसके अलावा वेतन वृद्धि करने की जरूरत है तो अपने में बिल्ला घटती application:didReceiveRemoteNotification:विधि यदि आप संदेश केंद्र से संदेश एक सूचना संदेश केंद्र दबाने से है जब कोई उपयोगकर्ता में प्रवेश करती है आप अनुप्रयोग स्पष्ट करने के लिए कोशिश कर रहे हैं तो भी साफ़ हो जाएंगे, यानी;

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 1];
[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];
[[UIApplication sharedApplication] cancelAllLocalNotifications];

मुझे लगता है कि रद्द करें। सभी सूचनाओं की आवश्यकता नहीं है। मेरे लिए उस पंक्ति के बिना काम किया गया है
मुरली

@ मुरली स्थानीय सूचनाओं का उपयोग करते हुए आप पर निर्भर करेगा या नहीं ...?
अलेजांद्रो इवान

1
अद्यतन :: "CancelAllLocalNotifications 'को पदावनत किया गया है: पहले iOS 10.0 में पदावनत किया गया है" इसलिए यदि आपका ऐप संस्करण iOS10.0 से अधिक है, तो आपको इस UNUserNotificationCenter * केंद्र = (UNUserNotificationCenter currentNotificationCenter] का उपयोग करना चाहिए; [केंद्र removeAllDeliveredNotifications]; [केंद्र निष्कासन
उपयोगकर्ता 18474728

21

यह भी हो सकता है कि ApplicationDidBecomeActive में क्लीयरनोटाइज़ेशन के लिए कॉल जोड़ें, ताकि एप्लिकेशन बैकग्राउंड में होने के कारण वापस आ जाए और नोटिफिकेशन भी क्लियर हो जाए।

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    [self clearNotifications];
}

15

IOS 10 के लिए अपडेट (स्विफ्ट 3)

IOS 10 ऐप्स में सभी स्थानीय सूचनाएं साफ़ करने के लिए, आपको निम्न कोड का उपयोग करना चाहिए:

import UserNotifications

...

if #available(iOS 10.0, *) {
    let center = UNUserNotificationCenter.current()
    center.removeAllPendingNotificationRequests() // To remove all pending notifications which are not delivered yet but scheduled.
    center.removeAllDeliveredNotifications() // To remove all delivered notifications
} else {
    UIApplication.shared.cancelAllLocalNotifications()
}

यह कोड iOS 10.x और iOS के सभी पूर्ववर्ती संस्करणों के लिए स्थानीय सूचनाओं की समाशोधन को संभालता है। आपको import UserNotificationsiOS 10.x कोड के लिए की आवश्यकता होगी ।


9

यदि आपके पास अनुसूचित स्थानीय सूचनाएं लंबित हैं और आप cancelAllLocalNotificationsअधिसूचना केंद्र में पुराने लोगों को खाली करने के लिए उपयोग नहीं करना चाहते हैं, तो आप निम्न कार्य भी कर सकते हैं:

[UIApplication sharedApplication].scheduledLocalNotifications = [UIApplication sharedApplication].scheduledLocalNotifications;

ऐसा प्रतीत होता है कि यदि आप scheduledLocalNotificationsइसे सेट करते हैं, तो यह अधिसूचना केंद्र में पुराने लोगों को साफ़ करता है, और इसे स्वयं पर सेट करके, आप लंबित स्थानीय सूचनाओं को बनाए रखते हैं।


1
यह iOS 9 पर मेरे लिए एक आकर्षण की तरह काम करता है। मैं अपनी सभी सूचनाएं रद्द नहीं करना चाहता था क्योंकि वे समय (दैनिक या साप्ताहिक) में दोहराते हैं। और इस तरह मैंने उन्हें हटाए बिना सभी सामान को साफ कर दिया।
सुपरपुकियो

1
सबसे अच्छा समाधान मैंने अब तक देखा है। किसी को पता है कि क्या यह iOS 8 पर काम करता है?
duncanc4

@ duncanc4 पिछली बार जब मैंने iOS 8 पर इसका परीक्षण किया था तो यह काम कर रहा था।
ओसप्र

ऐप के भीतर आप इसे कहां से कॉल करेंगे?
एलेक्स ज़ावाटोन

एलेक्स, आपको इसे कॉल करना चाहिए जब भी आपको अधिसूचना केंद्र में सूचनाओं को खाली करने की आवश्यकता हो। मैं इसे अपने AppDelegate applicationDidBecomeActive:और application:didReceiveLocalNotification:विधियों दोनों में कहता हूं ।
ऑस्प्रे

3

स्विफ्ट में मैं अपने AppDelegate के अंदर निम्नलिखित कोड का उपयोग कर रहा हूं:

func applicationDidBecomeActive(application: UIApplication) {
    application.applicationIconBadgeNumber = 0
    application.cancelAllLocalNotifications()
}

3

यदि आप यहाँ आ रहे हैं तो विपरीत सोचें (जैसा कि मैं था), यह पोस्ट आपके लिए हो सकती है।

मैं यह नहीं पता लगा सका कि जब मैंने बैज को मंजूरी दी थी तो मेरी सूचनाएं क्यों साफ हो रही थीं ... मैं मैन्युअल रूप से बैज को बढ़ाता हूं और फिर उपयोगकर्ता द्वारा ऐप में प्रवेश करने पर इसे खाली करना चाहता हूं। हालांकि, अधिसूचना केंद्र को खाली करने का कोई कारण नहीं है; वे अभी भी उन सूचनाओं को देखना या उन पर कार्य करना चाहते हैं।

नकारात्मक 1 चाल करता है, सौभाग्य से:

[UIApplication sharedApplication].applicationIconBadgeNumber = -1;

1
क्या यह आपके लिए iOS9 में काम करता है? मैंने 0 या -1 पर बैज लगाने के साथ कोई अंतर नहीं देखा। यह अभी भी मेरे मामले में सभी दूरस्थ सूचनाओं को साफ करता है।
अलेक्सई वीपी

हां, मैंने वास्तव में अपने ऐप के साथ फिर से नोटिस करना शुरू किया; मुझे नहीं पता कि क्या बदला।
ताहोवेलेवेरिन

मैं तब से
हार मान

1

शायद मामले में अनुसूचित अलार्म और अस्पष्ट ऐप आइकन बैज हैं।

NSArray *scheduledLocalNotifications = [application scheduledLocalNotifications];
NSInteger applicationIconBadgeNumber = [application applicationIconBadgeNumber];

[application cancelAllLocalNotifications];
[application setApplicationIconBadgeNumber:0];

for (UILocalNotification* scheduledLocalNotification in scheduledLocalNotifications) {
    [application scheduleLocalNotification:scheduledLocalNotification];
}
[application setApplicationIconBadgeNumber:applicationIconBadgeNumber];

0

जब आपके पास भविष्य में बार-बार सूचनाएं आती हैं, तो आप उन सूचनाओं को रद्द नहीं करना चाहते हैं, आप आइटम को अधिसूचना केंद्र में साफ कर सकते हैं:

func clearNotificationCenter() {
    UIApplication.sharedApplication().applicationIconBadgeNumber = 1
    UIApplication.sharedApplication().applicationIconBadgeNumber = 0
}

जब आपका ऐप स्थानीय अधिसूचना प्राप्त करने के तुरंत बाद नीचे की ओर कॉल करके अग्रभूमि में खुला हो, तो आप अधिसूचना को साफ़ नहीं कर सकते, अन्यथा आपको सैकड़ों सूचनाएं मिलेंगी। हो सकता है क्योंकि एक ही अधिसूचना फिर से लागू होती है, और अब आग लगने का समय है, इसलिए आप आग लगाते हैं, फिर से आग लगाते हैं, आवेदन करते हैं ....:

[UIApplication sharedApplication].scheduledLocalNotifications = [UIApplication sharedApplication].scheduledLocalNotifications;

0

जब आप अपने ऐप से लॉगआउट करते हैं, उस समय आपको अपने लॉगआउट बटन क्लिक विधि पर कोड की एक निचली पंक्ति का उपयोग करना होगा।

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];

[[UIApplication sharedApplication] cancelAllLocalNotifications];

और यह पूरी तरह से मेरे ऐप में काम करता है।


0

आपको अपने AppDelegate applicationDidBecomeActiveपद्धति में नीचे कोड जोड़ना होगा ।

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];

-1

यहीं से मिला । यह iOS 9 के लिए काम करता है

UIApplication *app = [UIApplication sharedApplication];
NSArray *eventArray = [app scheduledLocalNotifications];
for (int i=0; i<[eventArray count]; i++)
{
    UILocalNotification* oneEvent = [eventArray objectAtIndex:i];
    //Cancelling local notification
    [app cancelLocalNotification:oneEvent];
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.