Локальные уведомления не срабатывают в ios10

Я использую UNUserNotificationCenter для ios 10. Для тестирования я устанавливаю локальное уведомление на 10 секунд от текущего времени.

Это то, что я пробовал,

- (void)viewDidLoad {
    [super viewDidLoad];
     UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
     [center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert)
                          completionHandler:^(BOOL granted, NSError * _Nullable error) {
                              if (!error) {
                                  NSLog(@"request succeeded!");
                                  [self set10Notifs];
                              }
                          }];    
}

-(void) set10Notifs
{
    if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"10.0")) {
    #if XCODE_VERSION_GREATER_THAN_OR_EQUAL_TO_8
     NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];

    [calendar setTimeZone:[NSTimeZone localTimeZone]];        

    NSDateComponents *components = [calendar components:NSCalendarUnitTimeZone fromDate:[[NSDate date] dateByAddingTimeInterval:10]];

    UNMutableNotificationContent *objNotificationContent = [[UNMutableNotificationContent alloc] init];
    objNotificationContent.title = [NSString localizedUserNotificationStringForKey:@"Prayer!" arguments:nil];
    objNotificationContent.body = [NSString localizedUserNotificationStringForKey:@"Time now"
                                                                        arguments:nil];
    objNotificationContent.sound = [UNNotificationSound defaultSound];

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


    UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:@"Prayer"
                                                                          content:objNotificationContent trigger:trigger];
    UNUserNotificationCenter *userCenter = [UNUserNotificationCenter currentNotificationCenter];
    [userCenter addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
        if (!error) {
            NSLog(@"Local Notification succeeded");
        }
        else {
            NSLog(@"Local Notification failed");
        }
    }];
#endif
    }
}

Я вижу журнал «Локальное уведомление выполнено успешно». Но локальное уведомление не срабатывает на устройстве.

В Appdelegate я добавил

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  // Override point for customization after application launch.
    UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
    center.delegate = self;
    return YES;
}
- (void)userNotificationCenter:(UNUserNotificationCenter *)center
   willPresentNotification:(UNNotification *)notification
     withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler {
    NSLog(@"Notification is triggered");
     completionHandler(UNNotificationPresentationOptionBadge);
} 

-(void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler{
    NSLog(@"User Info : %@",response.notification.request.content.userInfo);
    completionHandler();
}

Что я сделал не так? Почему уведомления приложения не срабатывают?


person Nazik    schedule 19.10.2016    source источник
comment
stackoverflow.com /вопросы/37807302/   -  person Sanju    schedule 19.10.2016
comment
проверьте время вашего устройства и время запуска -- stackoverflow.com/questions/39941778/   -  person Sanju    schedule 19.10.2016
comment
Вы включили push-уведомления из настроек Xcode?   -  person Stefan    schedule 19.10.2016
comment
@Sanjuju, что я должен проверить со временем устройства? Я дал 10 секунд, добавляяInterval к ​​Nsdate....   -  person Nazik    schedule 19.10.2016
comment
@Stefan, нужно ли включать Push-уведомления? Я использую только локальные уведомления   -  person Nazik    schedule 19.10.2016
comment
Вы установили время огня на 10 секунд в будущем. Вы переводите приложение в фоновый режим в течение 10 секунд после запланированного уведомления? В противном случае уведомление не будет всплывать на экране, оно будет передано вашему делегату приложения (где вам придется обрабатывать его самостоятельно). Поставьте точку останова в вашем делегате приложения на application:didReceiveLocalNotification: для проверки.   -  person norders    schedule 19.10.2016
comment
@norders, я добавил методы делегата в файл Appdelegate. и я также помещаю свое приложение в фоновый режим до 10 секунд, а также выхожу из приложения. уведомление не сработало. Даже я пробовал 20 секунд...   -  person Nazik    schedule 19.10.2016
comment
Для NSDateComponents попробуйте: NSDateComponents *components = [компоненты календаря: NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit|NSHourCalendarUnit|NSMinuteCalendarUnit|NSSecondCalendarUnit|NSTimeZoneCalendarUnit fromDate:[[NSDate date] dateByAddingTimeInterval:10]];   -  person Jamshed Alam    schedule 19.10.2016
comment
@JamshedAlam, да, это работает ... Спасибо. Вы можете опубликовать это как ответ, чтобы я принял...   -  person Nazik    schedule 19.10.2016
comment
Добро пожаловать. @НАЗИК   -  person Jamshed Alam    schedule 19.10.2016


Ответы (2)


Установите NSDateComponents, например:

NSDateComponents *components = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitSecond|NSCalendarUnitTimeZone fromDate:[[NSDate date] dateByAddingTimeInterval:10]];
person Jamshed Alam    schedule 19.10.2016
comment
Невозможно установить несколько уведомлений.... - person Nazik; 24.10.2016
comment
Похоже, вам нужно создать компоненты даты из функции dateComponents(_ components: Set<Calendar.Component>, from date: Date) календаря. Инициализация компонентов даты из любой другой функции dateComponents... календаря, по-видимому, не запланировала уведомление. (Свифт 3) - person LOP_Luke; 30.01.2017
comment
@NAZIK, как вы заставили работать несколько уведомлений? я застрял в том же вопросе. Пожалуйста, посмотрите: stackoverflow.com/questions/44132879/ - person Jamshed Alam; 04.06.2017
comment
Спасибо приятель. Искал везде, и только это решение сработало. - person Quaggie; 16.01.2018
comment
OMG @LOP_Luke, я потратил целую вечность, пытаясь понять, почему мои в остальном идеально выглядящие уведомления не были запланированы, и этот ответ и ваш комментарий решили эту проблему! Я использовал неправильную функцию dateComponents. Кто знал, что есть такое. Спасибо. - person Rob Glassey; 25.08.2018

Или используйте триггер времени вместо триггера календаря

person Jerry    schedule 29.10.2016