Почему схема 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-адресов вашего приложения.

Другие вопросы по тегам