В удаленных push-уведомлениях macOS не отображается баннер оповещения - PullRequest
0 голосов
/ 04 ноября 2018

Я пытаюсь включить Push-уведомления для моего приложения MacOS. Кажется, все работает. Я могу получить токен устройства. Отправьте уведомление без ошибок. За исключением того, что на моем Mac нет предупреждений.

Я добавил следующий код, чтобы узнать, получало ли оно мое приложение или нет.

func application(_ application: NSApplication, didReceiveRemoteNotification userInfo: [String : Any]) {
    print(userInfo)
}

И после отправки уведомления я вижу в консоли следующее:

["aps": {
    alert = "Alert - Hello World";
    sound = "ping.aiff";
}]

Похоже, что все в порядке с устройством, но предупреждение не отображается.

Я протестировал точно такую ​​же настройку на iOS, и она работает нормально и показывает предупреждение там. Так что я должен что-то упустить специально в macOS.

Я пытался исправить это следующим образом:

  1. Протестировано с закрытым и открытым приложением (тоже не работало)
  2. Гарантировано, что уведомления включены для приложения в Системных настройках

System Preferences Image

  1. Если я создаю локальное уведомление вручную в коде, оно отлично работает, и появляется баннер уведомления
  2. Я не могу проверить его на старых версиях macOS, потому что API push-уведомлений, который я использую, только что был выпущен в macOS Mojave
  3. Я также пытался создать другой тестовый проект, и такая же проблема произошла
  4. Я убедился, что функция «Не беспокоить» отключена, а также проверил уведомление в центре уведомлений, но оно там также не отображается.

Как мне заставить его показывать баннер и воспроизводить звук на macOS?

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Уточнение, это macOS, а NSApp - просто NSApplication.shared

На самом деле я должен изменить свой ответ, потому что у меня были некоторые противоречивые результаты, поэтому сейчас у меня есть

if #available(OSX 10.14, *) {
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { [weak self] (success, error) in
        if let error = error {
        // LOG
        } else {
            NSApp.registerForRemoteNotifications(matching: [.alert, .badge, .sound])
            UNUserNotificationCenter.current().setNotificationCategories(varWithMyCategories)
        }
    }
} else {
    NSApp.registerForRemoteNotifications(matching: [.alert, .badge, .sound])
}
0 голосов
/ 04 ноября 2018

В iOS работает следующий код:

UNUserNotificationCenter.current().requestAuthorization(options: options) { granted, _ in
    guard granted else { return }

    DispatchQueue.main.async {
        application.registerForRemoteNotifications()
    }
}

Для macOS я изменил этот код на:

UNUserNotificationCenter.current().requestAuthorization(options: options) { granted, _ in
    guard granted else { return }

    DispatchQueue.main.async {
        NSApplication.shared.registerForRemoteNotifications()
    }
}

Оказывается, строка NSApplication.shared.registerForRemoteNotifications() неверна. В macOS вы должны передать те же опции, которые вы указали в этом вызове.

Изменение этой строки на следующее сработало.

NSApplication.shared.registerForRemoteNotifications(matching: [.alert, .sound, .badge])

Что я нахожу странным, так это то, что в документации Apple говорится, что этот метод устарел, и вместо этого мы должны использовать registerForRemoteNotifications(). Это заставляет меня думать, что есть какой-то тип ошибки с registerForRemoteNotifications(), когда уведомления не отображаются правильно.

Еще одна вещь, которую стоит упомянуть. Потребовалось немного времени (пара минут) и несколько отправленных уведомлений, чтобы они действительно появились после внесения этого изменения. Не уверен, что это просто из-за медленного интернет-соединения или чего-то еще. Но теперь они появляются очень быстро после отправки.


Редактировать

Apple сообщила мне, что это исправлено в macOS 10.14.4. Я не смог обновить до лучших и протестировать его, хотя. Поэтому я не могу подтвердить на данный момент. Я обновлю это, когда у меня будет возможность протестировать MacOS 10.14.4.

...