具有“App”协议深度链接的 SwiftUI macOS 应用程序打开新的应用程序实例

Ric*_*son 7 macos deep-linking swiftui

这是使用新协议App@main.

使用流程:

  • 用户启动应用程序并单击打开特定网页的按钮
  • 网页最终重定向到应用程序的 URL 方案,打开应用程序并调用onOpenURL(_:)

预期行为:深层链接被发送到现有的当前打开的应用程序实例

实际行为:启动一个新的应用程序实例,导致该应用程序的两个实例处于活动状态

注意:实际上不需要添加任何代码,因为问题仅取决于向应用程序添加 URL 方案并让网页访问它。

d.q*_*d.q 12

onOpenURL(_:)实际上并不是启动新的应用程序实例,而是在现有实例中创建一个新窗口。文档表明这只发生在 macOS 上(因为 iOS 仅支持单个窗口)。

您需要.handlesExternalEvents(preferring:allowing:)在更高阶视图上使用修改器。调用handlesExternalEvents将覆盖默认行为,即在 macOS 上的应用程序中创建新窗口的行为。就像是:

@main
struct myApp: App {    
    var body: some Scene {
        WindowGroup {
            ContentView()
            .handlesExternalEvents(preferring: ["myscheme"], allowing: ["myscheme"])
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在子视图中(例如ContentView()):

var body: some View {
    VStack {
        // your UI
    }
    .onOpenUrl{ url in
        // do something with the deep link url
    }
}
Run Code Online (Sandbox Code Playgroud)