删除特定的本地通知

如何解决删除特定的本地通知

| 我正在开发基于本地通知的iPhone警报应用程序。 删除警报时,相关的本地通知应被取消。但是,如何确定要从本地通知数组中取消的对象呢? 我知道
[[UIApplication sharedApplication] cancellocalnotification:notification]
方法,但是如何获取此'notification \'来取消呢?     

解决方法

        您可以在本地通知的用户信息中保存密钥的唯一值。 获取所有本地通知,遍历数组并删除特定通知。 代码如下, 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;
    }
}
迅速:
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+),请按照以下步骤操作: 创建UserNotification内容时,添加唯一标识符 使用removePendingNotificationRequests(withIdentifiers :)删除特定的待处理通知 使用removeDeliveredNotifications(withIdentifiers :)删除特定的已交付通知 有关更多信息,请访问UNUserNotificationCenter     ,        其他选择: 首先,创建本地通知时,可以将其存储在用户默认值中以备将来使用,不能将本地通知对象直接存储在用户默认值中,需要先将该对象转换为NSData对象,然后才能存储“ 3”
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]];
希望这可以帮助     ,        这是我的工作。 创建通知时,请执行以下操作:
  // 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

    }

}
此解决方案应适用于多个通知,并且您不管理任何数组或字典或用户默认设置。您只需使用已经保存到系统通知数据库中的数据即可。 希望这对将来的设计师和开发人员有所帮助。 编码专家们,大家好! :D     ,        快速调度和removeNotification:
    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)
        }
    }



}
    ,        iMOBDEV的解决方案可以完美地删除特定的通知(例如,删除警报后),但是当您需要有选择地删除任何已触发但仍在通知中心的通知时,它特别有用。 可能的情况是:触发警报通知,但是用户打开应用程序时没有点击该通知并再次安排该警报。 如果要确保给定项目/警报的通知中心只能显示一个通知,这是一个很好的方法。它还使您不必每次打开应用程序时都清除所有通知,以更好地适应该应用程序。 创建本地通知后,请使用
NSKeyedArchiver
将其存储为
Data
中的
Data
。您可以创建一个与您在通知的userInfo词典中保存的密钥相同的密钥。如果它与Core Data对象关联,则可以使用其唯一的objectID属性。 用
NSKeyedUnarchiver
检索。现在,您可以使用cancelLocalNotification方法将其删除。 相应地更新ѭ12上的键。 这是该解决方案的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\")
}
    ,        Swift版本,如果需要:
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!\")
            }
        }
    }
    ,        Swift 4解决方案:
UNUserNotificationCenter.current().getPendingNotificationRequests { (requests) in
  for request in requests {
    if request.identifier == \"identifier\" {
      UNUserNotificationCenter.current().removePendingNotificationRequests(withIdentifiers: [\"identifier\"])
    }
  }
}   
    ,        传递给“ 19”的UILocalNotification对象将匹配具有匹配属性的任何现有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];
    ,        我在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's Answer     ,        安排通知时,您可以保留带有类别标识符的字符串,如下所示
        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
            }

        }
    }
    ,        对于重复提醒(例如,您希望您的警报在下午4点在Sun,Sat和Wed处触发,那么您必须发出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];

}
    ,我稍微扩展了KingofBliss的答案,使它更加类似于Swift2,删除了一些不必要的代码,并添加了一些崩溃防护。 首先,在创建通知时,您需要确保设置通知的
userInfo
的uid(或任何自定义属性):
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)\'\")
    }
}
    ,        迅捷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])
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?