URL Scheme/onOpenURL总是打开一个新窗口(使用SwiftUI开发Mac应用)

URL Scheme/onOpenURL总是打开一个新窗口(使用SwiftUI开发Mac应用)

💡 原文中文,约1100字,阅读约需3分钟。
📝

内容提要

文章讨论了在macOS的SwiftUI中使用onOpenURL时,如何避免每次点击都打开新窗口。通过设置preferring和allowing参数,可以激活现有窗口或创建新窗口。解释了这两个参数的含义,以帮助开发者理解事件处理。

🔎

延伸解读

理解 preferring 与 allowing 的匹配逻辑

preferring 和 allowing 参数都是字符串集,用于检查视图的 targetContentIdentifier 是否包含这些字符串。preferring 决定视图是否更倾向于处理外部事件,allowing 则允许视图处理事件。空集永远不会匹配,而“*”总是匹配。正确设置这两个参数,可以控制窗口是激活现有实例还是创建新窗口。

避免重复打开新窗口的实践要点

在 WindowGroup 中,为 ContentView 添加 handlesExternalEvents(preferring:allowing:) 修饰符,并传入与 URL 路径相关的字符串。同时,在 Scene 上使用 handlesExternalEvents(matching:) 并传入相同的路径字符串。这样,当收到 onOpenURL 事件时,系统会优先激活已存在的匹配窗口,而不是新建窗口。

targetContentIdentifier 的作用与设置

targetContentIdentifier 是视图的标识符,用于外部事件匹配。在示例中,ContentView 的 targetContentIdentifier 需要与 preferring 和 allowing 中的字符串对应。如果未显式设置,系统可能使用默认值,导致匹配失败。开发者应确保这些标识符一致,以便正确路由事件。

❓

Q&A

如何在SwiftUI中使用onOpenURL避免每次点击都打开新窗口?

可以通过设置preferring和allowing参数来激活现有窗口或创建新窗口。

preferring和allowing参数在onOpenURL中有什么作用?

preferring参数用于检查视图的targetContentIdentifier,以确定视图是否倾向于处理外部事件;allowing参数则用于检查视图是否允许处理事件。

在使用onOpenURL时,空集和'*'的匹配规则是什么?

空集永远不会匹配,而'*'总是匹配。

如何在macOS的SwiftUI中处理外部事件?

可以使用handlesExternalEvents方法结合preferring和allowing参数来处理外部事件。

使用onOpenURL时,如何确保只打开一个窗口?

通过设置handlesExternalEvents的preferring参数来检查现有窗口,并使用allowing参数来允许处理事件。

在SwiftUI中,如何调试onOpenURL的URL?

可以在onOpenURL的perform闭包中打印url,以进行调试。

🏷️

标签

➡️

继续阅读