HowTo —— 使用 onOpenURL 处理 Universal Links

SwiftUI2.0 由于可以采用新的代码架构(Life Cycle SwiftUI App)来组织 app, 因此提供了 onOpenURL 来处理 Univeresal Links。不同于在 AppDelegate 或 SceneDelegate 中的解决方案,onOpenURL 作为一个 view modifier,你可以在任意 View 上注册你的 app 的 URL 处理机制。关于如何为自己的 app 创建 URL Scheme,请参阅 苹果的官方文档

健康笔记是我开发的一个iOS app,主要服务于有长期健康管理需求的人士。可为全家不同成员创建各自的笔记,允许使用者自定义数据类型以记录各种健康数据。

推广

基本用法

VStack{
   Text("Hello World")
}
.onOpenURL{ url in
    //做点啥
}

示例代码

首先在项目中设置 URL

URL
import SwiftUI

struct ContentView: View {
    @State var tabSelection:TabSelection = .news
    @State var show = false
    var body: some View {
        TabView(selection:$tabSelection){
            Text("News")
                .tabItem {Image(systemName: "newspaper")}
                .tag(TabSelection.news)
            Text("Music")
                .tabItem {Image(systemName: "music.quarternote.3")}
                .tag(TabSelection.music)
            Text("Settings")
                .tabItem {Image(systemName: "dial.max")}
                .tag(TabSelection.settings)
        }
        .sheet(isPresented: $show) {
            Text("URL 调用参数错误")
        }
        .onOpenURL { url in
            let selection = url.host
            switch selection{
            case "news":
                tabSelection = .news
            case "music":
                tabSelection = .music
            case "settings":
                tabSelection = .settings
            default:
                show = true
            }
        }
    }
}

enum TabSelection:Hashable{
    case news,music,settings
}

macOS 目前暂不支持,应该会在正式版本提供。

特别注意

  • onOpenURL 只有在项目采用 Swift App 的方式管理 Life Cycle 才会响应
  • 在代码中可以添加多个 onOpenURL,注册在不同的 View 上,当采用 URL 访问时,每个闭包都会响应。这样可以针对不同的 View 做出各自需要的调整。
本博客所有文章除特别声明外,均采用CC 4.0许可协议。转载请注明出处和作者。

关注微信公共号肘子的Swift记事本或在推特上关注@fatbobman,永远不会错过新内容! 您的支持和鼓励将为我的博客写作增添更多的动力! 如果您或身边的朋友有健康数据管理的需求,请使用我开发的app【健康笔记】,正是因为它我才创建了这个博客。

关注