macOS远程推送通知未显示警报横幅

时间:2018-11-03 22:37:23

标签: swift macos push-notification apple-push-notifications

我正在尝试为我的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刚刚在macOS Mojave中发布了
  3. 我也试图创建另一个测试项目,并且发生了相同的问题
  4. 我已确保“请勿打扰”功能已关闭,并且还在通知中心检查了该通知,但是该通知中心也未显示。

如何在MacOS上显示横幅并播放声音?

2 个答案:

答案 0 :(得分:2)

在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's documentation中,该方法已被弃用,而我们应该使用registerForRemoteNotifications()。这让我认为registerForRemoteNotifications()存在某种类型的错误,导致通知无法正确显示。

还有一件事要提。确实花了一些时间(几分钟),并发送了一些通知,它们在进行更改后才真正出现。不知道这是由于互联网连接速度慢还是什么原因引起的。但是现在它们在发送后很快就会出现。


修改

Apple已通知我,此问题已在macOS 10.14.4中修复。我还无法升级到最佳状态并进行测试。因此,我目前无法确认。有机会在macOS 10.14.4上进行测试时,我将对此进行更新。

答案 1 :(得分:-1)

澄清,这是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])
}