在 SwiftUI 中,我们被赋予了onOpenURL(执行:)功能。但是,在 macOS 中,我们可以在 Finder 中选择多个文件,然后单击“打开方式”。如果我使用带有以下代码的应用程序打开这些文件:
@main
struct testURLMacApp: App {
var body: some Scene {
WindowGroup {
ContentView()
.onOpenURL { url in
print("RECEIVED \(url)")
}
}
}
}
看来此功能对于多个文件无法正常工作。有时似乎会调用一次执行闭包,或者有时如果幸运的话最多可以连续调用 2-3 次。有时它似乎会做一些奇怪的事情,例如打开重复的应用程序窗口。
有没有人找到解决方法,或者在 SwiftUI 应用程序的单个窗口中处理打开多个文件的正确方法?
编辑:这实际上是为了让现有的 iOS 应用程序在 Apple Silicon Mac 上运行。所以AppKit不可用。
如上所述(见下文),它注册外部事件的处理程序,但仅首先使用它来创建新场景(可能是由于限制,可能是错误,可能是故意的,谁知道......)
所以如果我们有.onOpenURL
注册的处理程序捕获一个 URL 并为其创建新场景,其他的则保持未处理并在AppDelegate
(见下文)。如果我们删除.onOpenURL
彻底地,所有从 Finder 打开的 URL 都转移到 AppDelegate。
使用 Xcode 13.4 / macOS 12.4 进行测试
in App
@NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
var body: some Scene {
WindowGroup {
ContentView()
}
// needed because WindowGroup scene seems have default
// handler for external events, so opens new scene even
// if no onOpenURL or userActivity callbacks are present
.handlesExternalEvents(matching: []) // << here !!
}
并委托
class AppDelegate: NSObject, NSApplicationDelegate {
func application(_ application: NSApplication, open urls: [URL]) {
print("Unhandled: \(urls)") // << here !!
}
}
完整的测试模块在这里
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)