Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有'app'协议深度链接的SwiftUI macOS应用程序打开新的应用程序实例_Macos_Swiftui_Deep Linking - Fatal编程技术网

具有'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(:)
预期行为: 深度链接被发送到现有的、当前打开的应用程序实例

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

注意:实际上没有任何代码可添加,因为问题只取决于向应用程序添加URL方案并让网页转到它。

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
    }
}