在 SwiftUI 里,openURL 是一个用于打开外部链接(URL)的环境动作(Environment Action)。它可以在 App 内部轻松地打开网页、邮件、电话、App Scheme 等各种 URL,而不需要直接使用 UIKit 的 UIApplication.shared.open()。。
openURL 是通过环境对象 OpenURLAction 实现的:
@Environment(\.openURL) var openURL
使用方法:
@Environment(\.openURL) var openURL
Button("打开我的网站") {
openURL(URL(string: "https://www.fangjunyu.com")!)
}
可以在Safari中打开网页。
支持类型
只要是系统能识别的 URL Scheme 都可以:
网页:https://apple.com,在 Safari 打开网页;
电话:tel:123456789,打开拨号界面;
邮件:mailto:test@example.com,打开邮件应用并填写收件人;
App Scheme:twitter://user?screen_name=apple,打开指定的 App(若安装)。
1、打开电话
if let phoneURL = URL(string: "tel://1234567890") {
openURL(phoneURL)
}
2、打开短信
if let smsURL = URL(string: "sms:1234567890") {
openURL(smsURL)
}
3、打开邮件
if let mailURL = URL(string: "mailto:fangjunyu.com@gmail.com") {
openURL(mailURL)
}
4、打开地图位置
if let mapURL = URL(string: "maps://?q=Rizhao") {
openURL(mapURL)
}
.environment(\.openURL) 自定义行为
可以拦截 openURL 的默认行为,比如让链接在 App 内部 WebView 打开,而不是跳转 Safari:
.environment(\.openURL, OpenURLAction { url in
// 自定义逻辑,比如用 WebView 展示
print("准备打开 \(url)")
return .handled
})
OpenURLAction.Result 有三种返回值:
.handled:自行处理了这个 URL。
.discarded:忽略掉,不处理。
.systemAction:交回系统默认处理。
注意事项
1、确保传递给 openURL 的 URL 是有效的,避免崩溃。
2、某些 URL Scheme(例如 tel: 和 sms:)可能在模拟器上无效,但会在真机上正常运行。
3、对于复杂的深度链接,建议解析 URL 并根据参数进行操作。
总结
openURL是SwiftUI推荐的方式:
@Environment(\.openURL) var openURL
openURL(URL(string: "https://www.apple.com")!)
系统自动在 Safari 打开。
在UIKit中,可以使用UIApplication.shared.open打开网页:
if let url = URL(string: "https://www.apple.com") {
UIApplication.shared.open(url)
}
相比openURL更底层,但是没有办法通过 Environment 拦截或自定义。
也可选择封装openURL的Link方法。
相关文章
1、SwiftUI超链接Link:https://fangjunyu.com/2024/12/31/swift%e5%ba%94%e7%94%a8%e5%86%85%e5%88%9b%e5%bb%ba%e8%b6%85%e9%93%be%e6%8e%a5%e7%9a%84link%e6%96%b9%e6%b3%95/
