在使用小组件之类的元素经常涉及到onOpenURL,但是每次点击都会打开一个新窗口,就会特别烦。

解决方法

文章 “[在macOS 上的 SwiftUI 2.0 中打开窗口/场景 “介绍了如何打开窗口。我摘录了其中的部分内容,使它能简单地打开我的窗口,而不是另一个窗口。

1
2
3
4
5
6
7
8
9
10
11
12
var body: some Scene {
WindowGroup {
ContentView()
.handlesExternalEvents(preferring: ["{path of URL?}"], allowing: ["*"]) // activate existing window if exists
.onOpenURL(perform: { url in
print("\(url)") // This is just debug code
})
}.commands {
CommandGroup(replacing: .newItem, addition: { })
}
.handlesExternalEvents(matching: ["{same path of URL?}"]) // create new window if doesn't exist
}

对于那些希望(尝试)更好地理解 preferring allowing 参数的人。引用苹果文档的意思:

preferring 参数是一个字符串集,用来检查它们是否包含在这个视图的 targetContentIdentifier 中(在这个案例中是 ContentView),以确定这个视图是否更倾向于处理外部事件(在此案例中为 openURL)而非其他视图。

allowing 参数是一个字符串集,用来检查它们是否包含在这个视图的 targetContentIdentifier 中,允许视图处理事件。

空集永远不会匹配。”*” 总是匹配。

参考文章

在macOS 上的 SwiftUI 2.0 中打开窗口/场景

Why does URL Scheme/onOpenURL in SwiftUI always open a new window?

Apple Documentation on handlesExternalEvents(preferring:allowing:)