2010-07-31 63 views
6

我正在使需要設置通知的應用程序,謝天謝地,我不能設置本地通知,但我不知道如何刪除此應用程序設置的通知(我的xcode確實提供了使用removeAllNotifications刪除功能,但不能刪除應用程序設置的選定通知。如何取消本地通知iphone

+0

你可能會在這裏找到你的答案: http://stackoverflow.com/questions/3158264/cancel-uilocalnotification/ 3334028 – hiepnd 2010-07-31 17:50:08

回答

18

您可以撥打[[UIApplication sharedApplication] cancelLocalNotification:notification]來取消通知。由於本地通知符合NSCoding協議,因此可以存儲和檢索它們以供稍後取消。

+0

thansk您的輸入,但我應該在通知中mehtod加通什麼 [UIApplicationsharedApplication] cancelLocalNotification:通知] 再次感謝 – mrugen 2010-08-13 12:10:55

+1

那麼,你必須在某個時候創建​​通知對象安排,所以使用該對象!創建通知對象後,可以使用NSCoding協議將其保存到磁盤,稍後再次加載(即下次啓動應用程序)以供稍後取消。 – 2010-08-14 13:24:02

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

我比較警覺體和日期時間只是爲了確保既然有機會,我正在刪除右報告,其中兩個或更多通知可以具有相同的警報主體或時間。

+0

非常好的提示,謝謝@NSDumb – Yossi 2014-11-23 09:41:44

+0

你應該使用'isEqualToDate:'而不是'=='。 – 2016-08-08 16:03:37

0

在iOS的10及以下的iOS 10本地通知和Xcode 8 Beta 2的

編譯馬克 - 計算日期

-(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多個通知,添加不同的用戶信息

編譯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]; 
} 

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

}