2017-02-13 24 views
0

Я сделал 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 вызывается, а затем приложение просто продолжает работать на переднем плане. На экране не появляется уведомление. Он также не появляется в док-станции с перетаскиванием на циферблате. Что еще мне нужно сделать, чтобы оно появилось, либо на экране тогда и там, либо в выпадающем доке?

Вот наглядный пример того, что я ожидаю увидеть поверх приложения или флеш-верха с верхней частью экрана, при этом приложение работает под ним. Баннер может быть даже тоньше, чем показано здесь:

Simple watchOS Notification

+0

Вы запросили разрешение на отправку уведомления? Из руководства по программированию часов: прежде чем система сможет отправлять оповещения или воспроизводить звуки для уведомлений вашего приложения, приложение Watch или приложение iOS должны запросить авторизацию для взаимодействия с пользователем. Вы делаете это, вызывая метод requestAuthorizationWithOptions: completeHandler: для общего объекта UNUserNotificationCenter. – lostAtSeaJoshua

+0

Нет, я запросил разрешение на запуск и получил его при запуске. Мне просто нужно отправить фактическое предупреждение. Как баннер в верхней части экрана часового пояса, который появляется, затем исчезает. Нужно ли нам создавать это как WKInterfaceView (или что-то еще)? – Cindeselia

+0

Что мне непонятно, когда вызывается приглашение делегата willPresentNotification, что мы должны делать, чтобы действительно показывать уведомление? Мне не нужно яркое пользовательское поведение, например, изменение пользовательского интерфейса - мне просто нужен небольшой баннер, который показывает (некоторые дизайнеры называют его «блином» или «тостом») в верхней части экрана часового пояса, с иконкой приложения и единственная строка текста. «Цель достигнута!» или что-то еще. Например, это уведомление, которое я увижу в раскрывающемся меню на циферблате; Мне просто нужно это показать. Нужно ли мне это кодировать с нуля? Похоже, мы не получаем его бесплатно. – Cindeselia

ответ

0

Связанные вопрос, но для прошивкой: Displaying a stock iOS notification banner when your app is open and in the foreground?

Я пытался то же самое на часы и получить тот же (не отображенный уведомление). Одна нота, если она помогает другим, заключается в том, что мы должны запрашивать то же разрешение, которое мы возвращаем в обработчик завершения. Например, если мы хотим показать уведомления Alert, мы должны использовать два соответствующих значения, как показано ниже. Как отмечал ОП, мы должны назначить себя делегатом центра уведомлений.

(BTW, если у меня есть какие-либо ошибки здесь, пожалуйста, укажите их - мой еще не работает).

Следующий код представлен делегатом расширения watchkit.

- (void)applicationDidFinishLaunching { 
    // ... 
    // Register for, and request permission to send notifications 
    UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter]; 
    center.delegate = self; 
    [center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert) 
         completionHandler:^(BOOL granted, NSError * _Nullable error) { 
          // Enable or disable features based on authorization. 
          NSLog(@"Got auth response: %d", granted); 
         }]; 
} 

Вышеупомянутый успешно применяется только в том случае, если у меня есть разрешения на уведомления, установленные для «Зеркально iPhone». Если я отключу это, мой запрос разрешений не удастся. Другая проблема, но, пожалуйста, проверьте возвращаемое значение granted и убедитесь, что оно true.

// Foreground notification 
- (void)userNotificationCenter:(UNUserNotificationCenter *)center 
     willPresentNotification:(UNNotification *)notification 
      withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler { 
    // The method will be called on the delegate only if the 
    // application is in the foreground. 
    NSLog(@"Will present notification: %@", notification); 
    // The following doesn't present the notification, though. 
    completionHandler(UNNotificationPresentationOptionAlert); 
} 

userNotificationCenter:willPresentNotification:withCompletionHandler метод не дозвонился, но я не видит уведомление накладки, не существует один в списке уведомлений.

Смежные вопросы