はじめに
SwiftUI
で開発していると、ついUIKit
の癖でUIApplication.shared.open(url)
と書いてしまいがちですが、実はSwiftUI
には SwiftUI
流のやり方があったのです。
基本形
@Environment(\.openURL) private var openURL
let url = URL(string: "https://www.yahoo.co.jp")!
openURL(url)
dismiss
と同じ感覚ですね。
openURLの結果を知りたい
@Environment(\.openURL) private var openURL
let url = URL(string: "https://www.yahoo.co.jp")!
openURL(url) { accepted in
if !accepted {
print("could not open url = \(url)")
}
}
クロージャを追加すると結果が分かります。
Markdown中のリンクを開く
Text("Visit [Yahoo](https://www.yahoo.co.jp) for details.")
リンクの開き方を差し替えたい
Text("Visit [Yahoo](https://www.yahoo.co.jp) for details.")
.environment(\.openURL, .init { url in
your_URL_Processor(url) // ここで独自のURL処理ができる.
return .handled
})
最後のreturn .handled
って何?
openURLAction.Result
です。
以下のバリエーションがあります。
-
return .handled
URLは自前で処理したので、OSは何もしない。 -
return .systemAction
URLを開く処理をOSに依頼する。
何も指定しなければurl
をそのまま開く。
のようにカスタマイズしたURLを渡すこともできる。
let customizedURL = URL(string: "https://www.youtube.com")!
return .systemAction(customizedURL)
-
return .discarded
エラー発生など、URLを開く処理を破棄する。(何もしない)
MarkdownをAttributedStringに変換してから使う
// 改行するためには行末にスペース2個、そして改行。 または空行を入れる。
let markdown = """
Visit for details.
[Yahoo](https://www.yahoo.co.jp).
[Google](https://www.google.co.jp).
"""
let attributedString = try! AttributedString(markdown: markdown)
Text(attributedString)
まとめ
SwiftUI
でURLを開くなら、openURL
でスマートに!
開発環境
Xcode 16.4