Я сделал ExtensionDelegate своим UNUserNotificationCenterDelegate и правильно назначил его. У меня есть 3 watchOS приложение добавить запрос на уведомление, которое вызываетwatchOS 3 - Что я должен делать в userNotificationCenter: willPresentNotification: withCompletionHandler: на самом деле показывать уведомление?
userNotificationCenter:willPresentNotification:withCompletionHandler:
я реализовал метод следующим образом:
- (void) userNotificationCenter:(UNUserNotificationCenter*)center
willPresentNotification:(UNNotification*)notification
withCompletionHandler:(void(^)(UNNotificationPresentationOptions))completionHandler
{
NSLog(@"ExtensionDelegate: willPresent!");
completionHandler(UNNotificationPresentationOptionAlert);
}
Проблема заключается в том, что ничего не происходит. Я отлаживаю Xcode 8.2 на устройстве, работающем на watchOS 3.1, и хотя этот метод делегата запускается, и я могу попасть в точку останова, предупреждение не отображается. Мое содержание выглядит следующим образом:
UNMutableNotificationContent* content = [[UNMutableNotificationContent alloc] init];
content.title = notificationType;
content.subtitle = [NSString stringWithFormat:@"Subtitle: %@", notificationType];
content.body = alertTitle;
content.badge = @1;
content.sound = [UNNotificationSound defaultSound];
content.launchImageName = @"LaunchImage";
content.userInfo = @{
@"notificationType" : notificationType,
@"count" : @(count)
};
content.attachments = @[];
content.categoryIdentifier = notificationType;
где NotificationType является NSString я установил при запуске моего приложения следующим образом:
// Register custom notification types
UNNotificationCategory* cat1 = [UNNotificationCategory categoryWithIdentifier:@"Category1"
actions:@[dismissAction]
intentIdentifiers:@[]
options:UNNotificationCategoryOptionNone];
UNNotificationCategory* cat2 = [UNNotificationCategory categoryWithIdentifier:@"Category2"
actions:@[dismissAction, yesAction]
intentIdentifiers:@[]
options:UNNotificationCategoryOptionNone];
NSSet* categorySet = [NSSet setWithArray:@[cat1, cat2]];
[center setNotificationCategories:categorySet];
К сожалению, когда запрос на уведомление делается, willPresentNotification приходит и уходит, то completionHandler вызывается, а затем приложение просто продолжает работать на переднем плане. На экране не появляется уведомление. Он также не появляется в док-станции с перетаскиванием на циферблате. Что еще мне нужно сделать, чтобы оно появилось, либо на экране тогда и там, либо в выпадающем доке?
Вот наглядный пример того, что я ожидаю увидеть поверх приложения или флеш-верха с верхней частью экрана, при этом приложение работает под ним. Баннер может быть даже тоньше, чем показано здесь:
Вы запросили разрешение на отправку уведомления? Из руководства по программированию часов: прежде чем система сможет отправлять оповещения или воспроизводить звуки для уведомлений вашего приложения, приложение Watch или приложение iOS должны запросить авторизацию для взаимодействия с пользователем. Вы делаете это, вызывая метод requestAuthorizationWithOptions: completeHandler: для общего объекта UNUserNotificationCenter. – lostAtSeaJoshua
Нет, я запросил разрешение на запуск и получил его при запуске. Мне просто нужно отправить фактическое предупреждение. Как баннер в верхней части экрана часового пояса, который появляется, затем исчезает. Нужно ли нам создавать это как WKInterfaceView (или что-то еще)? – Cindeselia
Что мне непонятно, когда вызывается приглашение делегата willPresentNotification, что мы должны делать, чтобы действительно показывать уведомление? Мне не нужно яркое пользовательское поведение, например, изменение пользовательского интерфейса - мне просто нужен небольшой баннер, который показывает (некоторые дизайнеры называют его «блином» или «тостом») в верхней части экрана часового пояса, с иконкой приложения и единственная строка текста. «Цель достигнута!» или что-то еще. Например, это уведомление, которое я увижу в раскрывающемся меню на циферблате; Мне просто нужно это показать. Нужно ли мне это кодировать с нуля? Похоже, мы не получаем его бесплатно. – Cindeselia