在点击时从SwiftUI小部件执行深度链接

时间:2020-10-06 16:49:52

标签: ios swift swiftui widget widgetkit

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

我写的视图(非常简单):

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

我已经尝试替换

Text("SECOND ITEM")

使用

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

但它也不起作用。

2 个答案:

答案 0 :(得分:6)

  1. 小工具视图中,您需要创建一个Link并设置其destination网址:
struct SimpleWidgetEntryView: View {
    var entry: SimpleProvider.Entry

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

请注意,Link仅适用于 medium large 小部件。如果使用 small 小部件,则需要使用:

.widgetURL(URL(string: "widget://link0")!)
  1. 在您的应用视图中,使用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>)

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


这是一个GitHub repository,带有不同的Widget示例,包括DeepLink Widget。

答案 1 :(得分:5)

此外,您可以使用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
}
相关问题