这是一个使用新的App
协议和@main
的SwiftUI macOS应用程序。
使用流程:
- 用户启动应用程序并单击打开特定网页的按钮
- 网页最终重定向到应用程序的URL方案,打开应用程序并调用
onOpenURL(_:)
期望的行为:深度链接将发送到现有的、当前打开的应用实例中
实际行为:新的应用程序实例被启动,导致两个应用程序实例处于活动状态
注意:由于问题仅取决于向应用程序添加URL方案并使网页转到它,因此实际上不需要添加任何代码。
这是一个使用新的App
协议和@main
的SwiftUI macOS应用程序。
使用流程:
onOpenURL(_:)
期望的行为:深度链接将发送到现有的、当前打开的应用实例中
实际行为:新的应用程序实例被启动,导致两个应用程序实例处于活动状态
注意:由于问题仅取决于向应用程序添加URL方案并使网页转到它,因此实际上不需要添加任何代码。
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
}
}