2010-07-31 11 views
6

Sto facendo l'applicazione che ha bisogno di impostare la notifica, per fortuna sono riuscito a impostare la notifica locale ma non so come cancellare la notifica che è impostata da questa applicazione (my aplicaton). Xcode fornisce funzionalità di eliminazione con removeAllNotifications ma non è possibile rimuovere le notifiche selezionate impostate dall'applicazionecome cancellare una notifica locale in iphone

+0

È potrebbe trovare la tua risposta qui: http://stackoverflow.com/questions/3158264/cancel-uilocalnotification/ 3334028 – hiepnd

risposta

18

È possibile chiamare [[UIApplication sharedApplication] cancelLocalNotification:notification] per annullare una notifica. Poiché le notifiche locali sono conformi al protocollo NSCoding, possono essere memorizzate e recuperate per una successiva cancellazione.

+0

thansk per il loro inserimento, ma cosa devo aggiungere passaggio nell'area di notifica nella mehtod [UIApplicationsharedApplication] cancelLocalNotification: notifica] grazie ancora – mrugen

+1

Beh, è ​​necessario creare l'oggetto di notifica ad un certo punto per programmare, in modo utilizzare quell'oggetto ! Una volta creato l'oggetto di notifica, è possibile salvarlo su disco utilizzando il protocollo NSCoding e caricarlo di nuovo in un secondo momento (ovvero il prossimo avvio dell'app) per l'annullamento successivo. –

10

So che questo post è vecchio, ma spero che questa soluzione aiuta qualcuno

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

mi sto paragonando il corpo e la data ora di allarme solo per assicurarsi che sto cancellando la notifica di destra dal momento che ci sono possibilità in cui due o più notifiche possono avere lo stesso corpo o tempo di avviso.

+0

Un ottimo consiglio, grazie @NSDumb – Yossi

+0

Dovresti usare 'isEqualToDate:' invece di '=='. –

0

notifica locale in iOS 10 e sotto iOS 10 con Xcode 8 beta 2

pragma mark - Calcolare prima della data

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

per impostare notifiche multiple: iOS 10, aggiungere diversi requestWithIdentifier

mark pragma- Locanotification più di 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"); 
     } 
    }]; 
} 

per l'impostazione più notifiche di sotto iOS 10, aggiungere diversi userinfo

pragma mark Locanotification meno di 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 Delete Perticulater notifica locale

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

} 
Problemi correlati