从 SwiftUI 小部件点击执行深层链接

Ano*_*ude 11 widget ios swift widgetkit swiftui

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

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

HStack {
    Text("FIRST ITEM")    
    Spacer()
    Text("SECOND ITEM")
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试更换

Text("SECOND ITEM")
Run Code Online (Sandbox Code Playgroud)

Link("SECOND ITEM destination: URL(string: myDeeplinkUrl)!)
Run Code Online (Sandbox Code Playgroud)

但它也不起作用。

paw*_*222 22

  1. Widget视图中,您需要创建一个Link并设置其destinationurl:
struct SimpleWidgetEntryView: View {
    var entry: SimpleProvider.Entry

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

请注意,仅Link适用于中型大型Widget。如果你使用一个部件,你需要使用:

.widgetURL(URL(string: "widget://link0")!)
Run Code Online (Sandbox Code Playgroud)
  1. 在您的应用程序视图中使用onOpenURL以下方式接收网址:
@main
struct WidgetTestApp: App {
    var body: some Scene {
        WindowGroup {
            Text("Test")
                .onOpenURL { url in
                    print("Received deep link: \(url)")
                }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

也可以SceneDelegate通过覆盖来接收深层链接:

func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>)
Run Code Online (Sandbox Code Playgroud)

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


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


And*_*rew 10

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

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

// OR

Link(destination: URL(string: "urlsceheme://foobarmessage")!) {
    Text("Foo")
}
Run Code Online (Sandbox Code Playgroud)

将此代码设置在 AppDelegate

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