HowTo —— 使用 onOpenURL 处理 Universal Links

发表于

为您每周带来有关 Swift 和 SwiftUI 的精选资讯!

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

基本用法

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

示例代码

首先在项目中设置 URL

URL

Swift
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 做出各自需要的调整。

每周一晚,与全球开发者同步,掌握 Swift & SwiftUI 最新动向
可随时退订,干净无 spam