Почему схема URL-адресов / onOpenURL в SwiftUI всегда открывает новое окно?
Я конвертирую старое приложение macOS в SwiftUI, и у меня возникла проблема с новым SwiftUI WindowGroup.
Старое приложение представляет собой приложение с одним окном (в основном это прославленный таймер), и схема URL-адреса (appname://15) может использоваться для изменения таймера.
Я попытался воссоздать старую функциональность схемы URL-адресов с помощью метода onOpenURL, но всякий раз, когда срабатывает схема URL-адресов, приложение открывает новое окно, и я не могу понять, как это предотвратить.
var body: some Scene {
WindowGroup {
ContentView()
.onOpenURL(perform: { url in
print("\(url)") // This is just debug code
})
}.commands {
CommandGroup(replacing: .newItem, addition: { })
}
}
Я не возражаю, если новая версия приложения позволяет использовать несколько таймеров, но схема URL-адресов определенно не предназначена для открытия новых окон каждый раз, когда она используется.
Как мне запретить onOpenURL запускать новые окна? Я конвертирую приложение специально для изучения SwiftUI, но если это невозможно сделать в SwiftUI, я готов смешать и сопоставить некоторый код AppKit.
1 ответ
В статье «Открыть окно / сцену в SwiftUI 2.0 на macOS» показано, как открывать окна. Я взял его по частям и добрался до того места, где оно просто открывало мое окно вместо другого.
var body: some Scene {
WindowGroup {
ContentView()
.handlesExternalEvents(preferring: Set(arrayLiteral: "{path of URL?}"), allowing: Set(arrayLiteral: "*")) // activate existing window if exists
.onOpenURL(perform: { url in
print("\(url)") // This is just debug code
})
}.commands {
CommandGroup(replacing: .newItem, addition: { })
}
.handlesExternalEvents(matching: Set(arrayLiteral: "{same path of URL?}")) // create new window if doesn't exist
}
Я не понимаю, что за
preferring
и
matching
порции делаю. Я думаю, они являются частью пути после схемы URL-адресов вашего приложения.