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

7

这是一个使用新的App协议和@main的SwiftUI macOS应用程序。

使用流程:

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

期望的行为:深度链接将发送到现有的、当前打开的应用实例中

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

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


2
在 macOS 上无法同时运行两个应用程序实例,除非您安装了多个应用程序副本(例如,在“应用程序”中安装一个,另一个在 Xcode 的构建目录中)。如果两个应用程序都在运行,请尝试右键单击每个应用程序并选择“在查看器中显示”,这将向您显示应用程序的位置。如果已安装第二个应用程序,请将其删除。 - Adam
1个回答

12

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

您需要在高阶视图上使用 .handlesExternalEvents(preferring:allowing:) 修饰符。调用 handlesExternalEvents 将覆盖默认行为,这就是在您的 macOS 应用程序中创建新窗口的原因。例如:

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

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

var body: some View {
    VStack {
        // your UI
    }
    .onOpenUrl{ url in
        // do something with the deep link url
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接