ลบการแจ้งเตือนในเครื่อง


92

ฉันกำลังพัฒนาแอพเตือนภัย iPhone โดยอาศัยการแจ้งเตือนในพื้นที่

ในการลบการเตือนการแจ้งเตือนในพื้นที่ที่เกี่ยวข้องควรถูกยกเลิก แต่ฉันจะทราบได้อย่างไรว่าออบเจ็กต์ใดจากอาร์เรย์ของการแจ้งเตือนในเครื่องที่จะถูกยกเลิก

ฉันรู้[[UIApplication sharedApplication] cancelLocalNotification:notification]วิธีการ แต่ฉันจะรับ 'การแจ้งเตือน' นี้เพื่อยกเลิกได้อย่างไร?

คำตอบ:


217

คุณสามารถบันทึกค่าเฉพาะสำหรับคีย์ใน userinfo ของการแจ้งเตือนในพื้นที่ของคุณ รับการแจ้งเตือนในพื้นที่ทั้งหมดวนรอบอาร์เรย์และลบการแจ้งเตือนเฉพาะ

รหัสดังนี้

OBJ-C:

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;
    }
}

SWIFT:

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 (iOS 10+) เพียงทำตามขั้นตอนนี้:

  1. เมื่อสร้างเนื้อหา UserNotification ให้เพิ่มตัวระบุเฉพาะ

  2. ลบการแจ้งเตือนที่รอดำเนินการโดยใช้removePendingNotificationRequests (withIdentifiers :)

  3. ลบการแจ้งเตือนที่ส่งเฉพาะโดยใช้removeDeliveryNotifications (withIdentifiers :)

สำหรับข้อมูลเพิ่มเติมUNUserNotificationCenter


@ kingofBliss คุณช่วยบอกให้ฉันไปที่ "uidtodelete" ได้ไหมเพราะมันไม่ได้ประกาศในกรณีของฉัน
ishhhh

@ishhh มันเป็นเพียงค่า strig .. คุณควรประกาศและเริ่มต้นด้วยค่า uid ที่จะลบ
KingofBliss

@ kingofBliss uid มักจะแสดง null ใน NSLog.dont konw วิธีกำจัดสิ่งนี้โปรดช่วยฉันด้วย
ishhhh

@ishhh คุณเก็บค่า uid ไว้ในพจนานุกรม userinfo เมื่อสร้างการแจ้งเตือนในเครื่องหรือไม่? ฉันคิดว่าคุณพลาดไปแล้ว
KingofBliss

@kingofBliss "uid" เป็นชื่อตัวแปรของคุณเองคุณสามารถใช้ชื่อที่มีนัยสำคัญเช่น "รหัสการแจ้งเตือน" และเก็บไว้ในNSDictionaryค่าของรหัสของเอนทิตีที่เกี่ยวข้องกับUILocalNotification. จากนั้นตั้งค่าคุณสมบัติ notification.userInfo เป็นพจนานุกรมด้วยข้อมูลที่คุณกำหนดเอง ตอนนี้เมื่อคุณได้รับการแจ้งเตือนคุณสามารถแยกความแตกต่างด้วยรหัสที่กำหนดเองนั้นหรืออะไรก็ได้ที่คุณต้องการ
IgniteCoders

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

@JigneshBrahmkhatri วิธีของคุณได้ผล แต่จะล้มเหลวเมื่อผู้ใช้ถอนการติดตั้งแอปและติดตั้งใหม่
KingofBliss

@KingofBliss ในกรณีนี้เราต้องยกเลิกการแจ้งเตือนทั้งหมดใช่ไหม? ดังนั้นฉันเดาว่าโซลูชันนี้เร็วกว่า :)
Sufian

@ ซูเฟียนหากต้องการยกเลิกการแจ้งเตือนทั้งหมดมีวิธีที่เร็วกว่ามาก [[UIApplication sharedApplication] CancelAllLocalNotifications]; ;)
KingofBliss

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 เช่น alertbody คุณสามารถตรวจสอบ notification.firedate เพื่อรับการแจ้งเตือนที่จำเป็น ขอบคุณ abhi สำหรับวิธีแก้ปัญหาง่ายๆ upvote 1 for u
Nazik

1
@NAZIK: ขอบคุณสำหรับความสนใจในการสนทนา แต่ผู้ใช้ยังสามารถกำหนดเวลาการแจ้งเตือนสองรายการในวันที่เกิดเพลิงไหม้เดียวกันได้เนื่องจากเป็นแอปพลิเคชันเตือน อย่างน้อยก็อาจเป็นกรณีทดสอบสำหรับผู้ทดสอบและโซลูชันนี้ดูเหมือนจะล้มเหลวที่นั่น
Yogi

@ โยคีการทดสอบอย่างชาญฉลาดทำไมเราตรวจสอบไม่ได้ว่า ([localNotification.alertBody isEqualToString: savedTitle] || [localNotification.firedate == something]) เนื่องจากการแจ้งเตือนสองรายการที่มีวันที่เดียวกันควรมี alertBody ต่างกัน
Nazik

ห้ามใช้ในทางที่ผิด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

ใช่ alertBody ไม่ใช่ตัวเลือกที่ดีสำหรับการระบุการแจ้งเตือน ฉันเปลี่ยนเป็น userInfo
Roman Barzyczak

6

โซลูชันของ iMOBDEV ทำงานได้อย่างสมบูรณ์แบบเพื่อลบการแจ้งเตือนเฉพาะ (เช่นหลังจากลบการเตือนภัย) แต่จะมีประโยชน์อย่างยิ่งเมื่อคุณต้องเลือกลบการแจ้งเตือนใด ๆ ที่เริ่มทำงานแล้วและยังอยู่ในศูนย์การแจ้งเตือน

สถานการณ์ที่เป็นไปได้คือ: การแจ้งเตือนไฟเตือน แต่ผู้ใช้เปิดแอปโดยไม่ต้องแตะที่การแจ้งเตือนนั้นและกำหนดเวลาปลุกอีกครั้ง หากคุณต้องการตรวจสอบให้แน่ใจว่ามีการแจ้งเตือนเพียงรายการเดียวเท่านั้นที่สามารถอยู่ในศูนย์การแจ้งเตือนสำหรับรายการ / การเตือนภัยที่กำหนดเป็นแนวทางที่ดี นอกจากนี้ยังช่วยให้คุณไม่ต้องล้างการแจ้งเตือนทั้งหมดทุกครั้งที่เปิดแอปซึ่งจะเข้ากับแอปได้ดีขึ้น

  • เมื่อสร้างการแจ้งเตือนในเครื่องให้ใช้NSKeyedArchiverเพื่อจัดเก็บการแจ้งเตือนDataในUserDefaultsเครื่อง คุณสามารถสร้างคีย์เท่ากับสิ่งที่คุณบันทึกไว้ในพจนานุกรม userInfo ของการแจ้งเตือน หากเชื่อมโยงกับออบเจ็กต์ Core Data คุณสามารถใช้คุณสมบัติ objectID ที่ไม่ซ้ำกันได้
  • ดึงข้อมูลด้วยNSKeyedUnarchiver. ตอนนี้คุณสามารถลบได้โดยใช้เมธอด CancelLocalNotification
  • อัปเดตคีย์UserDefaultsตามนั้น

นี่คือเวอร์ชัน Swift 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")
}

ทำงานให้ฉัน คำแนะนำอื่น ๆ ทั้งหมดไม่ใช่เพราะอาร์เรย์ว่างเปล่า
Maksim Kniazev

มีความคิดสำหรับ iOS 10 หรือไม่?
Danpe

1
@ Danpe: ดูส่วน "การจัดการการแจ้งเตือนที่ส่งมอบ" ได้ที่นี่: developer.apple.com/reference/usernotifications/…
Rygen

ทำงานให้ฉันด้วย swift 3 พร้อมกับ mods เล็กน้อยซึ่ง Xcode จัดการ
beshio

@beshio: ขอบคุณสำหรับหัว ฉันได้อัปเดตไวยากรณ์แล้ว
Rygen

5

โซลูชัน Swift 4:

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

4

Swift Version หากต้องการ:

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!")
            }
        }
    }

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
            }

        }
    }

2

รวดเร็ว 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])

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
ขอบคุณ. ฉันคิดว่าคุณกำลังสร้างการแจ้งเตือนใหม่แล้วจึงยกเลิก จะไม่มีผลใด ๆ กับการแจ้งเตือนที่กำหนดไว้ก่อนหน้านี้ของฉันและจะยังคงถูกเริ่ม
โยคี

มีคุณสมบัติใดบ้างที่สามารถจับคู่คุณสมบัติได้ยกเว้น alertBody?
Shamsiddin

1

ฉันใช้ฟังก์ชันนี้ใน Swift 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


0

สำหรับการเตือนซ้ำ (ตัวอย่างเช่นคุณต้องการให้สัญญาณเตือนดังในวันอาทิตย์วันเสาร์และวันพุธเวลา 16.00 น. จากนั้นคุณต้องทำการปลุก 3 ครั้งและตั้งค่า repeatInterval เป็น 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 มากขึ้นเล็กน้อยลบโค้ดที่ไม่จำเป็นออกและเพิ่มในตัวป้องกันความผิดพลาด

ในการเริ่มต้นเมื่อสร้างการแจ้งเตือนคุณต้องแน่ใจว่าคุณได้ตั้งค่า uid (หรือคุณสมบัติที่กำหนดเองจริงๆ) ของการแจ้งเตือน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
เพื่อความปลอดภัยคุณสามารถใช้ guard-statement guard let app = UIApplication.sharedApplication () else {return false} สำหรับการกำหนดตารางเวลาใน app.scheduledLocalNotifications {... } จากนั้นคุณไม่จำเป็นต้องบังคับให้แกะออกใน for-loop
troligtvis
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.