如何使用 SwiftUI 接收应用程序的通知



过去,我记得找到了一个代码,可以监听macOS内部流传的任何通知。我不确定那是Swift,Objective-C还是其他什么。

有什么东西可以在 Swift 上使用吗?

我已经尝试过委托

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

但它没有收到任何东西。

有什么办法可以做到这一点吗?

如果 SwiftUI 中没有对您的特定通知的直接支持,您仍然可以使用 AppDelegate。

拥有应用程序代表后,您可以捕获通知。

然后,有几种方法可以将通知传播到 SwiftUI 视图。例如,您可以使用与通知值一起设置的自定义环境值。但是,这将要求您使用HostingViewController显式创建视图 - 即您不再声明SwiftUI应用程序(又名struct MyApp: App {...}),这使您的闪亮应用程序不那么优雅。

或者,您可以使用单独的模型对象来跟踪通知值及其各自的更改:

创建一个类(此处:MyObservedState,为其命名),该类符合其发布值对应于通知ObservableObject。在应用委托方法中更改该值。接下来,将该可观察对象实例用作视图中的@EnvironmentObject

下面是一个草图 - 不是一个完整的工作示例 - 如何完成它。

@main
struct MyApp: App {
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
var body: some Scene {
WindowGroup {
MainView()
}
}
}
class AppDelegate: NSObject, UIApplicationDelegate {
// add your delegate methods
...
}

创建我们称之为MyObservedState的模型类,该类符合ObservableObject,其发布值对应于您的通知值。提示:您可以使用具有关联值的枚举。

(未显示)

接下来,在祖先视图中,确保将对象MyObservedState注入到 SwiftUI 环境中:

struct MainView: View {
var body: some View {
MyView()
.environmentObject(MyObservedState.shared)
}
}

接下来,在任何视图中引用MyObservedState环境对象,并对其更改做出反应,如下所示:

struct MyView: View {
@EnvironmentObject private var myState: MyObservedState
var body: some View {
NavigationView {
ContentView()
}
.onChange(of: myState.publishedValue) { newValue in
doSomething(newValue)
}
}
}

注意:有一些问题和警告取决于您实际尝试解决问题的方式。 ;)

警告(其中之一):

环境值不会传播到 PresentationHostingController,也可能不会传播到任何其他 HostingController。因此,您必须显式注入环境值和对象,例如对于 SwiftUI"工作表",您首先从父级获取环境值,然后根据应用于模态视图的environmentenvironmentObject修饰符注入它。

最新更新