2010-07-31 25 views
6

Estoy haciendo la aplicación que tiene que configurar la notificación, afortunadamente no pude establecer la notificación local, pero no sé cómo eliminar la notificación que establece esta aplicación (mi aplicaton) .El xcode proporciona la funcionalidad de eliminar con removeAllNotifications pero no puede eliminar las notificaciones seleccionadas establecidas por la aplicacióncómo cancelar una notificación local en iphone

+0

Usted puede encontrar su respuesta aquí: http://stackoverflow.com/questions/3158264/cancel-uilocalnotification/ 3334028 – hiepnd

Respuesta

18

Puede llamar al [[UIApplication sharedApplication] cancelLocalNotification:notification] para cancelar una notificación. Dado que las notificaciones locales se ajustan al protocolo NSCoding, se pueden almacenar y recuperar para su posterior cancelación.

+0

thansk para sus entradas, pero lo que debo añadir pase en la notificación de Del modo [UIApplicationsharedApplication] cancelLocalNotification: Notificación] gracias de nuevo – mrugen

+1

Bueno, usted tiene que crear el objeto de notificación en algún momento de programar, así que usar ese objeto ! Una vez que haya creado el objeto de notificación, puede guardarlo en el disco utilizando el protocolo NSCoding y cargarlo nuevamente más tarde (es decir, el próximo lanzamiento de la aplicación) para cancelarlo más tarde. –

10

Sé que este post es antiguo, pero espero que esta solución ayuda a alguien

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

estoy comparando el cuerpo y la fecha de tiempo de alerta sólo para asegurarse de que estoy borrando la notificación correcta, ya que hay ocasiones en que dos o más notificaciones pueden tener el mismo cuerpo o hora de alerta.

+0

Muy buen consejo, gracias @NSDumb – Yossi

+0

Debe usar 'isEqualToDate:' en lugar de '=='. –

0

Notificación local en IOS 10 y A continuación IOS 10 con Xcode 8 beta 2

marca

pragma - Cálculo antes de la fecha

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

para configurar múltiples notificaciones: IOS 10, añadir diferentes requestWithIdentifier

pragma mark- Locanotification más que 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"); 
     } 
    }]; 
} 

para configurar múltiples notificaciones por debajo de IOS 10, añadir diferentes userinfo

pragma marca- Locanotification menos de 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 marca- Eliminar Perticulater Notificación local

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

} 
Cuestiones relacionadas