具有'app'协议深度链接的SwiftUI macOS应用程序打开新的应用程序实例
这是在使用新的具有'app'协议深度链接的SwiftUI macOS应用程序打开新的应用程序实例,macos,swiftui,deep-linking,Macos,Swiftui,Deep Linking,这是在使用新的app协议和@main的SwiftUI macOS应用程序中实现的 使用流程: 用户启动应用程序并单击打开特定网页的按钮 网页最终重定向到应用程序的URL方案,打开应用程序并调用onOpenURL(:) 预期行为: 深度链接被发送到现有的、当前打开的应用程序实例 实际行为: 启动一个新的应用程序实例,导致该应用程序的两个实例处于活动状态 注意:实际上没有任何代码可添加,因为问题只取决于向应用程序添加URL方案并让网页转到它。onOpenURL(:)实际上不是启动新的应用程序实例
app
协议和@main
的SwiftUI macOS应用程序中实现的
使用流程:
- 用户启动应用程序并单击打开特定网页的按钮
- 网页最终重定向到应用程序的URL方案,打开应用程序并调用
onOpenURL(:)
onOpenURL(:)
实际上不是启动新的应用程序实例,而是在现有实例中创建新窗口。文档建议这只发生在macOS上(因为iOS只支持一个窗口)
您需要在高阶视图上使用.handlesExternalEvents(首选:allowing:)
修饰符。调用handlesExternalEvents
将覆盖默认行为,即在macOS上的应用程序中创建新窗口的行为。比如:
@main
struct myApp: App {
var body: some Scene {
WindowGroup {
ContentView()
.handlesExternalEvents(preferring: ["myscheme"], allowing: ["myscheme"])
}
}
}
然后在子视图(例如ContentView()
)中:
在macOS上不可能运行两个应用程序实例,除非您安装了应用程序的多个副本(例如,一个在应用程序中,另一个在Xcode的构建目录中)。如果两个应用程序都在运行,请尝试右键单击每个应用程序,然后选择“在finder中显示”,这将显示应用程序的位置。如果安装了第二个应用程序,请将其删除。
var body: some View {
VStack {
// your UI
}
.onOpenUrl{ url in
// do something with the deep link url
}
}