轻按即可从 SwiftUI 小部件执行深层链接

Posted

技术标签:

【中文标题】轻按即可从 SwiftUI 小部件执行深层链接【英文标题】:Perform a deeplink from SwiftUI widget on tap 【发布时间】:2021-01-21 14:26:58 【问题描述】:

我有一个带有两个文本的简单小部件(中等大小),我想要的是能够执行深层链接以将用户引导到我的应用程序的特定部分,但我似乎找不到一种方法。

我写的视图(很简单):

HStack 
    Text("FIRST ITEM")    
    Spacer()
    Text("SECOND ITEM")

我已经尝试过替换

Text("SECOND ITEM")

Link("SECOND ITEM destination: URL(string: myDeeplinkUrl)!)

但它也不起作用。

【问题讨论】:

【参考方案1】:
    Widget 视图中,您需要创建一个Link 并设置其destination url:
struct SimpleWidgetEntryView: View 
    var entry: SimpleProvider.Entry

    var body: some View 
        Link(destination: URL(string: "widget://link1")!) 
            Text("Link 1")
        
    

请注意,Link 仅适用于 mediumlarge 小部件。如果你使用 small Widget,你需要使用:

.widgetURL(URL(string: "widget://link0")!)
    在您的 App 视图中使用onOpenURL接收网址:
@main
struct WidgetTestApp: App 
    var body: some Scene 
        WindowGroup 
            Text("Test")
                .onOpenURL  url in
                    print("Received deep link: \(url)")
                
        
    

还可以通过覆盖在SceneDelegate 中接收深层链接:

func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>)

您可以在此线程中找到有关如何使用此功能的更多说明:

Detect app launch from WidgetKit widget extension

这是一个GitHub repository,其中包含不同的 Widget 示例,包括 DeepLink Widget。

【讨论】:

.widgetUrl 的链接是如何指定的?如何为应用程序中的特定位置定义此 url?如果我错了,请纠正我,但我认为 url 的第一部分显示了应用程序信息部分中指定的 URL 方案,但我无法弄清楚 url 的第二部分到底是什么? @Krits 小部件中的每个 url 都将在应用程序中打开。因此,scheme 可以成为区分小部件 url 和其他 url 的一种方式(例如,从用户通知中)。其他路径组件可以指定一个动作/位置——这取决于你。您只需要在特定视图中使用 onOpenURL(url:) 并检查特定 URL 是否到达。 所以如上面问题中提到的,“widget://link0”。 link0 和 link1 到底是什么?以及我们如何在这个 url 中指定动作和/或位置? @Krits 这只是描述操作的自定义文本。在onOpenURL(url:) 中,您只需检查到达的网址(如果是链接0 或链接1...)并执行一些操作(显示警报,激活导航链接...)。 嗨,您能否指定我应该在我的应用程序中确切放置 onOpenUrl(url:) 的位置,因为我使用 Storyboard 创建了我的应用程序。【参考方案2】:

另外,您可以使用AppDelegate(如果您不使用SceneDelegate):

.widgetURL(URL(string: "urlsceheme://foobarmessage"))

// OR

Link(destination: URL(string: "urlsceheme://foobarmessage")!) 
    Text("Foo")

AppDelegate内设置此代码

func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool 
   let message = url.host?.removingPercentEncoding // foobarmessage
   return true

【讨论】:

使用上面的代码,我在 AppDelegate 中没有收到任何消息,有任何交叉检查设置的建议吗?

以上是关于轻按即可从 SwiftUI 小部件执行深层链接的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI使用`.timer`更改`Text`的输出格式

SwiftUI 小部件无法刷新

Qt 的鼠标事件

SwiftUI 工作表中未触发深层链接 onChange

如何将 uiviewcontroller 数据传递给 swiftui 小部件类

Kendo UI MVC 从 MultiSelect 小部件将 Grid 绑定到 DataSource