如何在iPhone中取消本地通知

时间:2010-07-31 17:23:09

标签: iphone

我正在制作需要设置通知的应用程序,谢天谢地,我能够设置本地通知,但我不知道如何删除此应用程序设置的通知(我的aplicaton).Xcode确实提供了功能删除与removeAllNotifications但您无法删除应用程序设置的选定通知

3 个答案:

答案 0 :(得分:18)

您可以致电[[UIApplication sharedApplication] cancelLocalNotification:notification]取消通知。由于本地通知符合NSCoding协议,因此可以存储和检索它们以便以后取消。

答案 1 :(得分:10)

我知道这篇文章很老但希望这个解决方案可以帮助某人

NSArray *notificationArray = [[UIApplication sharedApplication] scheduledLocalNotifications];
    for(UILocalNotification *notification in notificationArray){
        if ([notification.alertBody isEqualToString:@"your alert body"]  && (notification.fireDate == your alert date time)) {
            // delete this notification
            [[UIApplication sharedApplication] cancelLocalNotification:notification] ;
        }
    }

我正在比较警报正文和日期时间,以确保我删除了正确的通知,因为有两个或更多通知可能具有相同的警报正文或时间。

答案 2 :(得分:1)

iOS 10及iOS 10以下的本地通知,包含Xcode 8 beta 2

pragma mark - 在日期之前计算

-(void) calculateBeforedays:(int)_day hours:(int)_hours minutes:(int) _minutes { //_fir:(int)_firecount

    //Get Predefined Future date
    NSString *dateString =  [NSString stringWithFormat:@"%@T%@:00.000Z",_eventdate,_eventtime];
    NSLog(@"dateString %@",dateString);

    //    NSLog(@"_firecount %d",_firecount);
    //    //Get Predefined Future date
    //    NSString *dateString =  [NSString stringWithFormat:@"2016-12-31T12:%d:00.000Z",_firecount];
    //    NSLog(@"dateString %@",dateString);

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSSZ"];
    NSDate *marrigeDate = [dateFormatter dateFromString:dateString];


    // Set reminder date before marrige date
    int setDay = _day;
    int setHours = _hours;
    int setMins = _minutes;
    float milliseconds =   (setDay * 24 * 60 * 60 ) + (setHours * 60 * 60 ) + (setMins * 60 );


    NSDate *someDateInUTC = [NSDate date];
    NSTimeInterval timeZoneSeconds = [[NSTimeZone localTimeZone] secondsFromGMT];
    NSDate *dateInLocalTimezone = [someDateInUTC dateByAddingTimeInterval:timeZoneSeconds];

    //Get Current date
    NSDate *currentDate = dateInLocalTimezone;
    NSTimeInterval marigeTimeInterval = [marrigeDate timeIntervalSinceDate:currentDate];

    //Get difference between time
    NSTimeInterval timeIntervalCountDown = marigeTimeInterval - milliseconds;

    //Set perticulater timer
    NSDate *timerDate = [NSDate dateWithTimeIntervalSinceNow:timeIntervalCountDown];
    [self triggerNotification:timerDate];

}

#pragma mark- Trigger Reminders
- (void)triggerNotification:(NSDate *) reminderDate {

    if([[[UIDevice currentDevice] systemVersion] floatValue] > 10.0f){
        // create actions
#if XCODE_VERSION_GREATER_THAN_OR_EQUAL_TO_8
        UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
        // create actions
        UNNotificationAction *acceptAction = [UNNotificationAction actionWithIdentifier:@"com.inviteapp.yes"
                                                                                  title:@"Accept"
                                                                                options:UNNotificationActionOptionForeground];
        UNNotificationAction *declineAction = [UNNotificationAction actionWithIdentifier:@"com.inviteapp.no"
                                                                                   title:@"Decline"
                                                                                 options:UNNotificationActionOptionDestructive];
        UNNotificationAction *snoozeAction = [UNNotificationAction actionWithIdentifier:@"com.inviteapp.snooze"
                                                                                  title:@"Snooze"
                                                                                options:UNNotificationActionOptionDestructive];
        NSArray *notificationActions = @[ acceptAction, declineAction, snoozeAction ];

        // create a category
        UNNotificationCategory *inviteCategory = [UNNotificationCategory categoryWithIdentifier:CYLInviteCategoryIdentifier actions:notificationActions intentIdentifiers:@[] options:UNNotificationCategoryOptionCustomDismissAction];

        NSSet *categories = [NSSet setWithObject:inviteCategory];

        // registration
        [center setNotificationCategories:categories];
#endif
    }
    else if([[[UIDevice currentDevice] systemVersion] floatValue] > 8.0f){
        // create actions
        UIMutableUserNotificationAction *acceptAction = [[UIMutableUserNotificationAction alloc] init];
        acceptAction.identifier = @"com.inviteapp.yes";
        acceptAction.title = @"Accept";
        acceptAction.activationMode = UIUserNotificationActivationModeBackground;
        acceptAction.destructive = NO;
        acceptAction.authenticationRequired = NO; //If YES requies passcode, but does not unlock the device

        UIMutableUserNotificationAction *declineAction = [[UIMutableUserNotificationAction alloc] init];
        declineAction.identifier = @"com.inviteapp.no";
        acceptAction.title = @"Decline";
        acceptAction.activationMode = UIUserNotificationActivationModeBackground;
        declineAction.destructive = YES;
        acceptAction.authenticationRequired = NO;

        UIMutableUserNotificationAction *snoozeAction = [[UIMutableUserNotificationAction alloc] init];
        snoozeAction.identifier = @"com.inviteapp.snooze";
        acceptAction.title = @"Snooze";
        snoozeAction.activationMode = UIUserNotificationActivationModeBackground;
        snoozeAction.destructive = YES;
        snoozeAction.authenticationRequired = NO;

        // create a category
        UIMutableUserNotificationCategory *inviteCategory = [[UIMutableUserNotificationCategory alloc] init];
        inviteCategory.identifier = CYLInviteCategoryIdentifier;
        NSArray *notificationActions = @[ acceptAction, declineAction, snoozeAction ];

        [inviteCategory setActions:notificationActions forContext:UIUserNotificationActionContextDefault];
        [inviteCategory setActions:notificationActions forContext:UIUserNotificationActionContextMinimal];

        // registration
        NSSet *categories = [NSSet setWithObject:inviteCategory];
        UIUserNotificationType types = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert;
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:types categories:categories];
        [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
    }

    /// 2. request authorization for localNotification
    [self registerNotificationSettingsCompletionHandler:^(BOOL granted, NSError * _Nullable error) {
        if (!error) {
            NSLog(@"request authorization succeeded!");
        }
    }];


    if([[[UIDevice currentDevice] systemVersion] floatValue] > 10.0f){
#if XCODE_VERSION_GREATER_THAN_OR_EQUAL_TO_8
        [self localNotificationForiOS10:reminderDate];
#endif
    } else {
        [self localNotificationBelowiOS10: reminderDate];
    }

}

- (void)registerNotificationSettingsCompletionHandler:(void (^)(BOOL granted, NSError *__nullable error))completionHandler; {

    /// 2. request authorization for localNotification
    if([[[UIDevice currentDevice] systemVersion] floatValue] > 10.0f){
#if XCODE_VERSION_GREATER_THAN_OR_EQUAL_TO_8
        UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
        [center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert)
                              completionHandler:completionHandler];
#endif
    } else if([[[UIDevice currentDevice] systemVersion] floatValue] > 8.0f){
        UIUserNotificationSettings *userNotificationSettings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeAlert | UIUserNotificationTypeSound | UIUserNotificationTypeBadge)
                                                                                                 categories:nil];
        UIApplication *application = [UIApplication sharedApplication];
        [application registerUserNotificationSettings:userNotificationSettings];
    }
}

用于设置多个通知: iOS 10,添加不同的 requestWithIdentifier

pragma mark- Locanotification超过iOS 10

-(void) localNotificationForiOS10:(NSDate *) _reminderDate{

    _eventReminderDate = _reminderDate;

    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
    [calendar setTimeZone:[NSTimeZone localTimeZone]];

    NSDateComponents *components = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitSecond|NSCalendarUnitTimeZone fromDate:_reminderDate];
    NSLog(@"NSDateComponents %@",components);


    UNMutableNotificationContent *objNotificationContent = [[UNMutableNotificationContent alloc] init];
    objNotificationContent.title = [NSString localizedUserNotificationStringForKey:_eventname arguments:nil];
    objNotificationContent.body = [NSString localizedUserNotificationStringForKey:@"You have event reminder"
                                                                        arguments:nil];
    objNotificationContent.sound = [UNNotificationSound defaultSound];

    /// 4. update application icon badge number
    objNotificationContent.badge = @([[UIApplication sharedApplication] applicationIconBadgeNumber] + 1);


    UNCalendarNotificationTrigger *trigger = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents:components repeats:NO];


    UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:@"eventdate"
                                                                          content:objNotificationContent trigger:trigger];


    /// 3. schedule localNotification
    UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
    [center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
        if (!error) {
            NSLog(@"Local Notification succeeded");
        }
        else {
            NSLog(@"Local Notification failed");
        }
    }];
}

要在iOS 10下设置多个通知,请添加不同的 userinfo

pragma mark- Locanotification低于iOS 10

-(void) localNotificationBelowiOS10:(NSDate *) _reminderDate{

    _eventReminderDate = _reminderDate;
    NSLog(@"dateInLocalTimezone %@",_eventReminderDate);

    /// 3. schedule localNotification
    UILocalNotification *localNotification = [[UILocalNotification alloc] init];
    localNotification.fireDate = _eventReminderDate ;
    localNotification.alertTitle = _eventname;
    localNotification.alertBody = @"You have Event Name";
    localNotification.timeZone = [NSTimeZone defaultTimeZone];
    localNotification.repeatInterval = 0;
    localNotification.applicationIconBadgeNumber = [[UIApplication sharedApplication] applicationIconBadgeNumber] + 1;


    NSDictionary *info  =   [NSDictionary dictionaryWithObject:_eventname forKey:_eventname];
    localNotification.userInfo =   info;
    NSLog(@"info ---- %@",info);
    NSLog(@"notification userInfo gets name : %@",[info objectForKey:_eventname]);


    [[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
}

pragma mark-删除Perticulater本地通知

-(IBAction)deleteReminder:(id)sender{

    UIButton *senderButton = (UIButton *)sender;
    _selectedRow = senderButton.tag;
    NSIndexPath *indexPath=[NSIndexPath indexPathForRow:senderButton.tag inSection:0]; // if section is 0
    ReminderCell * cell = (ReminderCell*)[_tableView cellForRowAtIndexPath:indexPath];


    _eventname = [[_eventArray objectAtIndex:indexPath.row] objectForKey:@"event_name"];
    _eventdate = [[_eventArray objectAtIndex:indexPath.row] objectForKey:@"event_date"];
    _eventtime = [[_eventArray objectAtIndex:indexPath.row] objectForKey:@"event_st"];



    if([[[UIDevice currentDevice] systemVersion] floatValue] > 10.0f){

#if XCODE_VERSION_GREATER_THAN_OR_EQUAL_TO_8
        UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];


        // remove all local notification:
        [center removePendingNotificationRequestsWithIdentifiers:@[_eventname]];

#endif
    } else {

        NSLog(@"Delete notification below ios 10");
        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 *ename=[NSString stringWithFormat:@"%@",[userInfoCurrent valueForKey:_eventname]];

            if ([ename isEqualToString:_eventname])
            {
                //Cancelling local notification
                [app cancelLocalNotification:oneEvent];

                break;
            }
        }
    }

}