Могу ли я использовать UILocalNotifications и UNUserNotifications?

У меня есть приложение для iOS, которое включает в себя пользовательские "тревоги" - отправленные пользователю, когда приложение не на переднем плане. Я использую UNUserNotifications и все работает хорошо в тестировании iOS 10 и iOS 11.

Я также хотел бы связаться с пользователями, которые все еще используют iOS 8 и iOS 9.

Чтобы отправлять уведомления пользователям iOS 8, нужно ли включать альтернативные методы, использующие UILocalNotifications? Или iOS 8 будет правильно отвечать UNUserNotificatons?

Если мне нужно включить и то, и другое, я могу использовать некоторые if, чтобы использовать правильный, основанный на ОС. Просто кажется странным, что я должен включить устаревшую технику.

2 ответа

UNUserNotifications iOS 10 и выше, поэтому не будут работать на iOS 8 и iOS 9. В этом случае вы должны проверить, является ли UNUserNotifications существует или иным образом прибегают к более старым методам, например:

if (NSClassFromString(@"UNUserNotificationCenter")) {
    UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
    UNAuthorizationOptions options = (UNAuthorizationOptionBadge | UNAuthorizationOptionAlert | UNAuthorizationOptionSound);

    [center requestAuthorizationWithOptions: options
                          completionHandler: ^(BOOL granted, NSError * _Nullable error) {
                              if (granted) {
                                  NSLog(@"Granted notifications!");
                              }
                          }];
}
else {
    UIUserNotificationType userNotificationTypes = (UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIUserNotificationTypeSound);
    UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes: userNotificationTypes categories: nil];
    [[UIApplication sharedApplication] registerUserNotificationSettings: settings];
}

Инфраструктура UserNotifications была добавлена ​​в iOS с iOS 10, поэтому для любой версии до этого вам нужно будет использовать более старую версию UILocalNotification, Вы правы в том, что UILocalNotification устарела в iOS 10 в пользу UserNotifications.framework, но до iOS 10 символы из инфраструктуры UserNotifications недоступны, поэтому другого пути нет. Вы можете использовать простую проверку версии iOS, чтобы определить, когда использовать любой из этих методов:

if(@available(iOS 10, *)){
    //UserNotifications method
}
else{
    //UILocalNotification method
}
Другие вопросы по тегам