WatchOS 动态通知不适用于 Xcode 11.1 及更高版本 - 未调用 didReceive

Posted

技术标签:

【中文标题】WatchOS 动态通知不适用于 Xcode 11.1 及更高版本 - 未调用 didReceive【英文标题】:WatchOS dynamic notifications not working on Xcode 11.1 and later - didReceive not called 【发布时间】:2019-11-18 18:47:47 【问题描述】:

我正在尝试从https://developer.apple.com/tutorials/swiftui/creating-a-watchos-app 获取 Apple Watch SwiftUI 通知教程。它适用于 Xcode 11.0,但在从 11.1 到 beta 11.3 的任何更新版本上都失败了。

收到通知时,NotificationController 中的didReceive 不会被触发。这是 NotificationController.swift 文件的代码:

import WatchKit
import SwiftUI
import UserNotifications

class NotificationController: WKUserNotificationHostingController<NotificationView> 
    var landmark: Landmark?
    var title: String?
    var message: String?

    let landmarkIndexKey = "landmarkIndex"

    override var body: NotificationView 
        NotificationView(title: title,
            message: message,
            landmark: landmark)
    

    override func willActivate() 
        // This method is called when watch view controller is about to be visible to user
        super.willActivate()
    

    override func didDeactivate() 
        // This method is called when watch view controller is no longer visible
        super.didDeactivate()
    

    override func didReceive(_ notification: UNNotification) 
        let userData = UserData()

        let notificationData =
            notification.request.content.userInfo as? [String: Any]

        let aps = notificationData?["aps"] as? [String: Any]
        let alert = aps?["alert"] as? [String: Any]

        title = alert?["title"] as? String
        message = alert?["body"] as? String

        if let index = notificationData?[landmarkIndexKey] as? Int 
            landmark = userData.landmarks[index]
        
    

另外,这里是 PushNotificationPayload.apns 的内容:


    "aps": 
        "alert": 
            "title": "Silver Salmon Creek",
            "body": "You are within 5 miles of Silver Salmon Creek."
        ,
        "category": "LandmarkNear",
        "thread-id": "5280"
    ,

    "landmarkIndex": 1

还有其他人有这个问题吗?

【问题讨论】:

我已经缩小了问题的范围。 watchOS 6.0 模拟器可以与 NotificationController 上的 didReceive 函数正常工作。在 watchOS 6.1 模拟器上运行相同的代码时,不会调用 didReceive 并且不会执行用于呈现动态通知的任何代码。对于遇到相同通知问题的其他人,我建议在 watchOS 6.0 模拟器上运行,直到此问题得到解决。 只是模拟器的问题吗?我也在设备上看到了这个……watchOS 6.0 很好,watchOS 6.1 不行。 6.1 的设备和模拟器都存在问题。它在 6.0 上的设备和模拟器上都可以正常工作。 感谢您的确认。令人遗憾的是,Apple 发布的 watchOS 6.1 的 SwiftUI 通知完全损坏。遗憾的是,唯一的解决方案似乎是使用 WatchKit 进行通知(或者假设它在 6.2 中得到修复,将部署目标设置为 6.2,但谁愿意这样做……) 【参考方案1】:

动态通知现已在 WatchOS beta 6.1.1 中运行

【讨论】:

【参考方案2】:

我在使用 Xcode 11.3 时遇到了同样的问题。它在我的代码中失败了,但在 Apple 完成的项目中却没有。仔细查看教程代码中的有效载荷(部分):

    "alert": 
        "body": "You are within 5 miles of Silver Salmon Creek."
        "title": "Silver Salmon Creek",
    ,

完成项目中的payload是:

    "alert": 
        "title": "Silver Salmon Creek",
        "body": "You are within 5 miles of Silver Salmon Creek."
    ,

他们颠倒了两条线。但是仔细观察,您会在他们的教程代码中看到“body”行末尾缺少逗号。这会导致 JSON 解析失败(静默)并且不会生成警报。加上逗号,它就可以正常工作了。

【讨论】:

以上是关于WatchOS 动态通知不适用于 Xcode 11.1 及更高版本 - 未调用 didReceive的主要内容,如果未能解决你的问题,请参考以下文章

FCM 自定义声音通知不适用于 IOS Xcode

parse.com 推送通知框架不适用于 ionic 框架 Xcode 项目?

NSUserDefaults 不适用于 Watch OS2 的 Xcode beta

推送通知不适用于 iPhone 所有设备 (Xcode8) 版本

推送通知不适用于 testflight 和 xcode 8 beta

WatchOS 3 (XCode 8b6) 上的后台通知