👋

[SwiftUI]AttributedStringのアクション(Safariで開く)を別のアクションにURL Schemeで置き換える

2022/08/29に公開

やりたいこと

テキスト内にあるURLメンション(@user)ハッシュタグ(#swift)をタップした際に、それぞれアクションを設定したい

UIKitではActiveLabelがあるので、そちらが便利です。
SwiftUIで使おうとしましたが、描画がなぜか崩れてしまい解決方法が分からなかった為、諦めました。

https://ja.stackoverflow.com/questions/88885/activelabeluikitをswiftuiで使いたい

attributedText

AttributedStringのアクション

各要素に装飾(色、フォント、サイズ)を付けてURLを付けれるのがAttributedStringなのですが、そのURLは全てSafariで開かれてしまいカスタムアクションは指定できません。

解決方法(URL Schemeでアクションを設定する)

AttributedStringでURLは開けるので、アプリ側のURL Schemeを設定して事前に設定しておいたURLが返ってきたら、そのURL Schemeごとにアクションを割り当てるという手法で解決していきたいと思います。

例) testApp-hashtag:// testApp-mention://
これでもいいtestApp://?mode=hashtag, testApp://?mode=mention

実装の概要

正規表現でURL, Hashtag, Mentionなどを探して見つけた文字列の範囲に文字色とlink(URL)を設定して、SwiftUI.Textで表示

onOpenURLでURLでアプリが開かれた時のアクションを検知して、URLごと(testApp-hashtag:// testApp-mention://)にアクションを判断して実行する

実装してみた

AttributedTextという名前でSPMとして作ってみました。

https://github.com/zunda-pixel/AttributedText

もっと良い方法

Text内の要素をタップするしてアクションを起こすためだけにURL Schemeを設定するのは、微妙な気しかしないので、もっといい方法があれば教えて欲しいです!

Discussion