किसी विशेष स्थानीय सूचना को हटाएँ


91

मैं स्थानीय सूचनाओं के आधार पर एक iPhone अलार्म ऐप विकसित कर रहा हूं।

अलार्म को हटाने पर, संबंधित स्थानीय सूचना को रद्द कर दिया जाना चाहिए। लेकिन मैं यह कैसे निर्धारित कर सकता हूं कि स्थानीय सूचनाओं के सरणी से किस वस्तु को रद्द किया जाए?

मुझे [[UIApplication sharedApplication] cancelLocalNotification:notification]विधि की जानकारी है लेकिन मैं इसे रद्द करने के लिए यह 'सूचना' कैसे प्राप्त कर सकता हूं?

जवाबों:


217

आप अपने स्थानीय अधिसूचना के userinfo में कुंजी के लिए एक अद्वितीय मूल्य बचा सकते हैं। सभी स्थानीय अधिसूचना प्राप्त करें, सरणी के माध्यम से लूप करें और विशेष अधिसूचना हटाएं।

कोड निम्नानुसार है,

Obj सी:

UIApplication *app = [UIApplication sharedApplication];
NSArray *eventArray = [app scheduledLocalNotifications];
for (int i=0; i<[eventArray count]; i++)
{
    UILocalNotification* oneEvent = [eventArray objectAtIndex:i];
    NSDictionary *userInfoCurrent = oneEvent.userInfo;
    NSString *uid=[NSString stringWithFormat:@"%@",[userInfoCurrent valueForKey:@"uid"]];
    if ([uid isEqualToString:uidtodelete])
    {
        //Cancelling local notification
        [app cancelLocalNotification:oneEvent];
        break;
    }
}

स्विफ्ट:

var app:UIApplication = UIApplication.sharedApplication()
for oneEvent in app.scheduledLocalNotifications {
    var notification = oneEvent as UILocalNotification
    let userInfoCurrent = notification.userInfo! as [String:AnyObject]
    let uid = userInfoCurrent["uid"]! as String
    if uid == uidtodelete {
        //Cancelling local notification
        app.cancelLocalNotification(notification)
        break;
    }
}

UserNotification:

यदि आप UserNotification (iOS 10+) का उपयोग करते हैं , तो बस इस चरणों का पालन करें:

  1. UserNotification सामग्री बनाते समय, एक अद्वितीय पहचानकर्ता जोड़ें

  2. RemovePendingNotificationRequests (withIdentifiers) का उपयोग करके विशिष्ट लंबित अधिसूचना निकालें

  3. RemoveDeliveredNotifications (withIdentifiers) का उपयोग करके विशिष्ट वितरित सूचना निकालें :)

अधिक जानकारी के लिए, UNUserNotificationCenter


@ KingofBliss, u कृपया मुझे "uidtodelete" पर देने के लिए कह सकते हैं। लेकिन मेरे मामले में यह अघोषित है।
ishhhh

@ ऐश इसके अन्याय को एक कड़े मूल्य के रूप में .. आपको इसे घोषित करना चाहिए और इसे यूआईडी के मूल्य के साथ हटाना होगा
KingofBliss

@ KingofBliss, uid हमेशा NSLog.dont में null दिखा रहा है konw कि इससे कैसे छुटकारा पाया जाए। कृपया मेरी मदद करें
ishhhh

@ishhh क्या आपने स्थानीय अधिसूचना बनाते समय यूजरइन शब्दकोश में यूआईडी के लिए कोई मूल्य संग्रहीत किया है? मुझे लगता है कि आप चूक गए हैं।
KingofBliss

@kingofBliss, "uid" यह आपके अपने वैरिएबल का एक नाम है, आप "नोटिफाइड" जैसे किसी भी महत्वपूर्ण नाम का उपयोग कर सकते हैं, और NSDictionaryइसे संबंधित इकाई की आईडी के मान के साथ स्टोर कर सकते हैं UILocalNotification। फिर अपने कस्टम डेटा के साथ शब्दकोश में notification.userInfo गुण सेट करें। अब जब आपको सूचनाएं मिलेंगी तो आप उन्हें उस कस्टम आईडी या किसी भी अन्य चीज़ से अलग कर सकते हैं जिसकी आपको आवश्यकता हो सकती है।
इग्नाइटेकोडर्स

23

दूसरा विकल्प:

सबसे पहले, जब आप स्थानीय अधिसूचना बनाते हैं, तो आप इसे भविष्य में उपयोग के लिए उपयोगकर्ता डिफॉल्ट में संग्रहीत कर सकते हैं, स्थानीय सूचना ऑब्जेक्ट को सीधे उपयोगकर्ता डिफॉल्ट में संग्रहीत नहीं किया जा सकता है, इस ऑब्जेक्ट को पहले NSData ऑब्जेक्ट में परिवर्तित करने की आवश्यकता है, और फिर NSDataइसे स्टोर किया जा सकता है User defaults। नीचे उस के लिए कोड है:

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:localNotif];
[[NSUserDefaults standardUserDefaults] setObject:data forKey:[NSString  stringWithFormat:@"%d",indexPath.row]];

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

NSData *data= [[NSUserDefaults standardUserDefaults] objectForKey:[NSString   stringWithFormat:@"%d",UniqueKey]];

UILocalNotification *localNotif = [NSKeyedUnarchiver unarchiveObjectWithData:data];
NSLog(@"Remove localnotification  are %@", localNotif);
[[UIApplication sharedApplication] cancelLocalNotification:localNotif];
[[NSUserDefaults standardUserDefaults] removeObjectForKey:[NSString stringWithFormat:@"%d",UniqueKey]];

उम्मीद है की यह मदद करेगा


धन्यवाद, मैंने इसे पहले तरीके से लागू किया है, लेकिन आपका उत्तर भी सही है। मैं इसे ध्यान में रखूंगा। क्या आप कृपया बताएं कि कौन सा अधिक कुशल है? मदद के लिए धन्यवाद :)
योगी

1
@ योगी: यदि आप पहले उत्तर को देखते हैं, तो आपको स्थानीय अधिसूचना को रद्द करने के लिए हर बार लूप चलाने की आवश्यकता है, लेकिन उपरोक्त उत्तर में, आपको लूप के लिए कोई भी चलाने की आवश्यकता नहीं होगी, आप सीधे स्थानीय अधिसूचना तक पहुँच सकते हैं और इसे रद्द कर सकते हैं स्थानीय अधिसूचना और इसे उपयोगकर्ता की चूक से हटा दें, मेरे उत्तर के अनुसार, यह अधिक कुशल तरीका है
iMOBDEV

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

@KingofBliss, उस स्थिति में हमें सभी सूचनाओं को रद्द करना होगा, है ना? इसलिए मुझे लगता है कि यह समाधान तेज है। :)
सूफियान

@ सूफ़ियन सभी अधिसूचना को रद्द करने के लिए बहुत तेज़ तरीका है [[UIApplication साझाApplication] रद्द करेंAllLocalNotifications]; ;)
किंगोफ्लिस

8

ये है जो मैं करता हूं।

अपनी सूचना बनाते समय ऐसा करें:

  // Create the notification

UILocalNotification *notification = [[UILocalNotification alloc]  init] ;



notification.fireDate = alertDate;
notification.timeZone = [NSTimeZone localTimeZone] ;
notification.alertAction = NSLocalizedString(@"Start", @"Start");
notification.alertBody = **notificationTitle**;
notification.repeatInterval= NSMinuteCalendarUnit;

notification.soundName=UILocalNotificationDefaultSoundName;
notification.applicationIconBadgeNumber = 1;

[[UIApplication sharedApplication] scheduleLocalNotification:notification] ;

जब इसे हटाने की कोशिश हो तो ऐसा करें:

 NSArray *arrayOfLocalNotifications = [[UIApplication sharedApplication] scheduledLocalNotifications] ;

for (UILocalNotification *localNotification in arrayOfLocalNotifications) {

    if ([localNotification.alertBody isEqualToString:savedTitle]) {
        NSLog(@"the notification this is canceld is %@", localNotification.alertBody);

        [[UIApplication sharedApplication] cancelLocalNotification:localNotification] ; // delete the notification from the system

    }

}

यह समाधान कई सूचनाओं के लिए काम करना चाहिए, और आपके किसी भी सरणियों या शब्दकोशों या उपयोगकर्ता चूक का प्रबंधन नहीं करना चाहिए। आपका बस उस डेटा का उपयोग करना है जिसे आपने सिस्टम नोटिफिकेशन डेटाबेस में पहले से सहेजा है।

आशा है कि यह भविष्य के डिजाइनरों और डेवलपर्स को मदद करता है।

हैप्पी कोडिंग लोग! : डी


अपना उत्तर साझा करने के लिए धन्यवाद, लेकिन यह तर्क कैसे काम करता है यदि आपकी सभी सूचनाएं एक ही निकाय की हैं या यदि उपयोगकर्ता से निकाय लिया जाना है। उस स्थिति में उपयोगकर्ता एक ही निकाय को कई सूचनाएँ दे सकता है।
योगी

@Yogi, सतर्कता की तरह, आप आवश्यक अधिसूचना प्राप्त करने के लिए जांच कर सकते हैं। एक सरल समाधान के लिए अभि को धन्यवाद। यू 1 के लिए 1
अज़िक अब्दुल्ला

1
@NAZIK: चर्चा में आपकी रुचि के लिए धन्यवाद। लेकिन फिर भी उपयोगकर्ता एक ही आग की तारीख पर दो सूचनाओं को शेड्यूल कर सकता है क्योंकि यह एक अलार्म एप्लीकेशन है। कम से कम यह एक परीक्षक के लिए एक परीक्षण का मामला हो सकता है और यह समाधान वहां विफल हो रहा है।
योगी

@ योगी, बुद्धिमान परीक्षण, हम क्यों नहीं जाँच सकते हैं अगर ([localNotification.alertBody isEqualToString: saveTitle] || [[localNotification.firedate == कुछ]], क्योंकि एक ही तिथि में दो सूचनाएं अलग-अलग अलर्ट होनी चाहिए
Azik Abdullah

किसी अधिसूचना की पहचान के लिए alertBodyया उसका दुरुपयोग न करें fireDate; का उपयोग userInfoयह कर, @KingOfBliss विवरण द्वारा जवाब के रूप में के लिए क्षेत्र ...
SEVERIN

8

निर्धारण और स्विफ्ट में निष्कासन:

    static func scheduleNotification(notificationTitle:String, objectId:String) {

    var localNotification = UILocalNotification()
    localNotification.fireDate = NSDate(timeIntervalSinceNow: 24*60*60)
    localNotification.alertBody = notificationTitle
    localNotification.timeZone = NSTimeZone.defaultTimeZone()
    localNotification.applicationIconBadgeNumber = 1
    //play a sound
    localNotification.soundName = UILocalNotificationDefaultSoundName;
    localNotification.alertAction = "View"
    var infoDict :  Dictionary<String,String!> = ["objectId" : objectId]
    localNotification.userInfo = infoDict;

    UIApplication.sharedApplication().scheduleLocalNotification(localNotification)
}
    static func removeNotification(objectId:String) {
    var app:UIApplication = UIApplication.sharedApplication()

    for event in app.scheduledLocalNotifications {
        var notification = event as! UILocalNotification
        var userInfo:Dictionary<String,String!> = notification.userInfo as! Dictionary<String,String!>
        var infoDict :  Dictionary = notification.userInfo as! Dictionary<String,String!>
        var notifcationObjectId : String = infoDict["objectId"]!

        if notifcationObjectId == objectId {
            app.cancelLocalNotification(notification)
        }
    }



}

1
किसी अधिसूचना की पहचान के लिए alertBodyया उसका दुरुपयोग न करें fireDate; का उपयोग userInfoयह कर, @KingOfBliss विवरण द्वारा जवाब के रूप में के लिए क्षेत्र ...
SEVERIN

हां अलर्टबॉडी नोटिफिकेशन को पहचानने के लिए अच्छा विकल्प नहीं है। मैंने इसे
यूजरइन्फो में

6

iMOBDEV का समाधान एक विशिष्ट अधिसूचना (जैसे अलार्म को हटाने के बाद) को हटाने के लिए पूरी तरह से काम करता है, लेकिन यह विशेष रूप से उपयोगी है जब आपको किसी भी अधिसूचना को पहले से निकाल दिया गया है और अभी भी अधिसूचना केंद्र पर है।

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

  • एक स्थानीय अधिसूचना बनाने पर, उपयोग करें NSKeyedArchiver के रूप में यह स्टोर करने के लिए DataमेंUserDefaults । आप सूचना के उपयोगकर्ता नाम शब्दकोश में सहेज रहे हैं के बराबर एक कुंजी बना सकते हैं। यदि यह एक कोर डेटा ऑब्जेक्ट के साथ जुड़ा हुआ है, तो आप इसकी अनूठी ऑब्जेक्ट संपत्ति का उपयोग कर सकते हैं।
  • इससे पुनः प्राप्त करें NSKeyedUnarchiver । अब आप इसे रद्द करने के लिए सक्षम कर सकते हैं रद्द करने का उपयोग कर विधि।
  • पर कुंजी अद्यतन करें UserDefaultsतदनुसार ।

यहाँ उस समाधान का एक स्विफ्ट 3.1 संस्करण है (iOS 10 से नीचे के लक्ष्य के लिए):

दुकान

// localNotification is the UILocalNotification you've just set up
UIApplication.shared.scheduleLocalNotification(localNotification)
let notificationData = NSKeyedArchiver.archivedData(withRootObject: localNotification)
UserDefaults.standard.set(notificationData, forKey: "someKeyChosenByYou")

पुनः प्राप्त करें और हटाएं

let userDefaults = UserDefaults.standard
if let existingNotificationData = userDefaults.object(forKey: "someKeyChosenByYou") as? Data,
    let existingNotification = NSKeyedUnarchiver.unarchiveObject(with: existingNotificationData) as? UILocalNotification {

    // Cancel notification if scheduled, delete it from notification center if already delivered    
    UIApplication.shared.cancelLocalNotification(existingNotification)

    // Clean up
    userDefaults.removeObject(forKey: "someKeyChosenByYou")
}

मेरे लिए काम किया। अन्य सभी सुझाव नहीं हैं, क्योंकि सरणी खाली है।
मक्सिम नियाज़ेव

IOS 10 के लिए कोई विचार?
दानपे

1
@Danpe: यहां "" वितरित सूचनाएँ प्रबंधित करना "'अनुभाग देखें: डेवलपर
apple.com/reference/usernotifications/…

मेरे लिए मामूली मॉड के साथ स्विफ्ट 3 के साथ काम किया, जिसे एक्सकोड ने संभाला।
बिशियो

@ बिशियो: सिर के लिए धन्यवाद। मैंने इसका सिंटैक्स अपडेट किया है।
रायजेन

4

जरूरत पड़ने पर स्विफ्ट संस्करण:

func cancelLocalNotification(UNIQUE_ID: String){

        var notifyCancel = UILocalNotification()
        var notifyArray = UIApplication.sharedApplication().scheduledLocalNotifications

        for notifyCancel in notifyArray as! [UILocalNotification]{

            let info: [String: String] = notifyCancel.userInfo as! [String: String]

            if info[uniqueId] == uniqueId{

                UIApplication.sharedApplication().cancelLocalNotification(notifyCancel)
            }else{

                println("No Local Notification Found!")
            }
        }
    }

4

स्विफ्ट 4 समाधान:

UNUserNotificationCenter.current().getPendingNotificationRequests { (requests) in
  for request in requests {
    if request.identifier == "identifier" {
      UNUserNotificationCenter.current().removePendingNotificationRequests(withIdentifiers: ["identifier"])
    }
  }
}   

2

जब आप अधिसूचना को शेड्यूल कर रहे हों तो आप श्रेणी पहचानकर्ता के साथ एक स्ट्रिंग रख सकते हैं

        localNotification.category = NotificationHelper.categoryIdentifier

और इसके लिए खोज करें और ज़रूरत पड़ने पर रद्द करें

let  app = UIApplication.sharedApplication()

    for notification in app.scheduledLocalNotifications! {
        if let cat = notification.category{
            if cat==NotificationHelper.categoryIdentifier {
                app.cancelLocalNotification(notification)
                break
            }

        }
    }

1

UILocalNotification ऑब्जेक्ट जो आप पास करते हैं, cancelLocalNotification:वह मिलान गुणों के साथ किसी भी मौजूदा UILocalNotification ऑब्जेक्ट से मेल खाएगा।

इसलिए:

UILocalNotification *notification = [[UILocalNotification alloc] init];
notification.alertBody = @"foo";
[[UIApplication sharedApplication] presentLocalNotificationNow:notification];

एक स्थानीय अधिसूचना प्रस्तुत करेगा जिसे बाद में रद्द किया जा सकता है:

UILocalNotification *notification = [[UILocalNotification alloc] init];
notification.alertBody = @"foo";
[[UIApplication sharedApplication] cancelLocalNotification:notification];

1
धन्यवाद। मुझे लगता है कि आप एक नई अधिसूचना बना रहे हैं और फिर उसे रद्द कर रहे हैं। मेरे पूर्व निर्धारित अधिसूचना पर इसका कोई प्रभाव नहीं पड़ेगा और यह अभी भी निकाल दिया जाएगा।
योगी

क्या कोई ऐसी संपत्ति है जो सतर्कता को छोड़कर संपत्ति का मिलान कर सकती है?
शमसीद्दीन

1

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

  static func DeleteNotificationByUUID(uidToDelete: String) -> Bool {
    let app:UIApplication = UIApplication.sharedApplication()
    // loop on all the current schedualed notifications
    for schedualedNotif in app.scheduledLocalNotifications! {
      let notification = schedualedNotif as UILocalNotification
      let urrentUi = notification.userInfo! as! [String:AnyObject]
      let currentUid = urrentUi["uid"]! as! String
      if currentUid == uidToDelete {
        app.cancelLocalNotification(notification)
        return true
      }
    }
    return false
  }

@ KingofBliss के उत्तर से प्रेरित


1

स्विफ्ट 3-शैली:

final private func cancelLocalNotificationsIfIOS9(){


//UIApplication.shared.cancelAllLocalNotifications()
let app = UIApplication.shared
guard let notifs = app.scheduledLocalNotifications else{
    return
}

for oneEvent in notifs {
    let notification = oneEvent as UILocalNotification
    if let userInfoCurrent = notification.userInfo as? [String:AnyObject], let uid = userInfoCurrent["uid"] as? String{
        if uid == uidtodelete {
            //Cancelling local notification
            app.cancelLocalNotification(notification)
            break;
        }
    }
}

}

iOS 10 उपयोग के लिए:

    let center = UNUserNotificationCenter.current()
    center.removePendingNotificationRequests(withIdentifiers: [uidtodelete])

0

बार-बार याद दिलाने के लिए (उदाहरण के लिए आप चाहते हैं कि आपका अलार्म सूर्य, शनि और बुध पर 4 बजे आग लगा दे, तो आपको 3 अलार्म बनाने होंगे और NSWeekCalendarUnit पर दोहराना सेट करना होगा)।

केवल रिमाइंडर बनाने के लिए:

UILocalNotification *aNotification = [[UILocalNotification alloc] init];
                aNotification.timeZone = [NSTimeZone defaultTimeZone];
                aNotification.alertBody = _reminderTitle.text;
                aNotification.alertAction = @"Show me!";
                aNotification.soundName = UILocalNotificationDefaultSoundName;
                aNotification.applicationIconBadgeNumber += 1;

                NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
                NSDateComponents *componentsForFireDate = [calendar components:(NSYearCalendarUnit | NSWeekCalendarUnit|  NSHourCalendarUnit | NSMinuteCalendarUnit| NSSecondCalendarUnit | NSWeekdayCalendarUnit) fromDate: _reminderDate];

                [componentsForFireDate setHour: [componentsForFireDate hour]] ; //for fixing 8PM hour
                [componentsForFireDate setMinute:[componentsForFireDate minute]];

                [componentsForFireDate setSecond:0] ;
                NSDate *fireDateOfNotification = [calendar dateFromComponents: componentsForFireDate];
                aNotification.fireDate = fireDateOfNotification;
                NSDictionary *infoDict = [NSDictionary dictionaryWithObject:_reminderTitle.text forKey:kRemindMeNotificationDataKey];
                aNotification.userInfo = infoDict;

                [[UIApplication sharedApplication] scheduleLocalNotification:aNotification];

बार-बार याद दिलाने के लिए:

for (int i = 0 ; i <reminderDaysArr.count; i++)
                {

                    UILocalNotification *aNotification = [[UILocalNotification alloc] init];
                    aNotification.timeZone = [NSTimeZone defaultTimeZone];
                    aNotification.alertBody = _reminderTitle.text;
                    aNotification.alertAction = @"Show me!";
                    aNotification.soundName = UILocalNotificationDefaultSoundName;
                    aNotification.applicationIconBadgeNumber += 1;

                    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
                    NSDateComponents *componentsForFireDate = [calendar components:(NSYearCalendarUnit | NSWeekCalendarUnit|  NSHourCalendarUnit | NSMinuteCalendarUnit| NSSecondCalendarUnit | NSWeekdayCalendarUnit) fromDate: _reminderDate];


                    [componentsForFireDate setWeekday: [[reminderDaysArr objectAtIndex:i]integerValue]];

                    [componentsForFireDate setHour: [componentsForFireDate hour]] ; // Setup Your Own Time.
                    [componentsForFireDate setMinute:[componentsForFireDate minute]];

                    [componentsForFireDate setSecond:0] ;
                    NSDate *fireDateOfNotification = [calendar dateFromComponents: componentsForFireDate];
                    aNotification.fireDate = fireDateOfNotification;
                    aNotification.repeatInterval = NSWeekCalendarUnit;
                    NSDictionary *infoDict = [NSDictionary dictionaryWithObject:_reminderTitle.text forKey:kRemindMeNotificationDataKey];
                    aNotification.userInfo = infoDict;

                    [[UIApplication sharedApplication] scheduleLocalNotification:aNotification];
                }
            }

फ़िल्टर करने के लिए आप इसे प्रदर्शित करने के लिए सरणी।

-(void)filterNotficationsArray:(NSMutableArray*) notificationArray{

    _dataArray = [[NSMutableArray alloc]initWithArray:[[UIApplication sharedApplication] scheduledLocalNotifications]];
    NSMutableArray *uniqueArray = [NSMutableArray array];
    NSMutableSet *names = [NSMutableSet set];

    for (int i = 0 ; i<_dataArray.count; i++) {
        UILocalNotification *localNotification = [_dataArray objectAtIndex:i];
        NSString * infoDict = [localNotification.userInfo objectForKey:@"kRemindMeNotificationDataKey"];

        if (![names containsObject:infoDict]) {
            [uniqueArray addObject:localNotification];
            [names addObject:infoDict];
        }
    }
    _dataArray = uniqueArray;
}

रिमाइंडर हटाने के लिए भी यह केवल एक बार या दोहराया गया था:

- (void) removereminder:(UILocalNotification*)notification
{
    _dataArray = [[NSMutableArray alloc]initWithArray:[[UIApplication sharedApplication]scheduledLocalNotifications]];

    NSString * idToDelete = [notification.userInfo objectForKey:@"kRemindMeNotificationDataKey"];
    for (int i = 0 ; i<_dataArray.count; i++)
    {
        UILocalNotification *currentLocalNotification = [_dataArray objectAtIndex:i];
        NSString * notificationId = [currentLocalNotification.userInfo objectForKey:@"kRemindMeNotificationDataKey"];

        if ([notificationId isEqualToString:idToDelete])
            [[UIApplication sharedApplication]cancelLocalNotification:currentLocalNotification];
    }

    _dataArray = [[NSMutableArray alloc]initWithArray:[[UIApplication sharedApplication]scheduledLocalNotifications]];
    [self filterNotficationsArray:_dataArray];
    [_remindersTV reloadData];

}

0

मैंने KingofBliss के उत्तर पर थोड़ा विस्तार किया, इसे थोड़ा और Swift2 की तरह लिखा, कुछ अनावश्यक कोड हटाए, और कुछ क्रैश गार्ड में जोड़े।

अधिसूचना शुरू करते समय, आपको यह सुनिश्चित करने की आवश्यकता है कि आप अधिसूचना के यूआईडी (या कोई कस्टम संपत्ति वास्तव में) सेट करें userInfo:

notification.userInfo = ["uid": uniqueid]

फिर, इसे हटाते समय, आप यह कर सकते हैं:

guard
    let app: UIApplication = UIApplication.sharedApplication(),
    let notifications = app.scheduledLocalNotifications else { return }
for notification in notifications {
    if
        let userInfo = notification.userInfo,
        let uid: String = userInfo["uid"] as? String where uid == uidtodelete {
            app.cancelLocalNotification(notification)
            print("Deleted local notification for '\(uidtodelete)'")
    }
}

1
सुरक्षा के लिए आप गार्ड-स्टेटमेंट गार्ड ऐप का उपयोग कर सकते हैं = UIApplication.sadedApplication () {{असत्य को वापस करें} app.scheduledLocalNotifications में शेड्यूल किए गए नोट के लिए {...} फिर आपको इसे लूप के लिए अनट्रैप करने के लिए मजबूर करने की आवश्यकता नहीं है
troligtvis
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.