【SwiftUI】入力されたURLの有効性を識別する方法!

この記事からわかること

  • SwiftUI入力されたURL有効性チェックする方法
  • ColorSchemeとは?
  • URLを入力値として扱う際の注意点
  • NSURLクラスの使い方
  • 日本語を含んだURLの場合のエラー対処法
  • addingPercentEncodingメソッドの使い方
  • URL構造体を使ったチェック方法

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

SwiftでユーザーからURLを入力値として受け入れる際の有効性をチェックする方法をまとめていきます。

URLの有効性をチェックする方法

Swift UIを用いてURLの入力欄を設けてユーザーの入力した値をリンクとして生成するにはいくつか注意点があります。

注意点

入力ボックスはTextFieldなどを使用しで実装すると思いますがバインディングする変数はString型である必要があります。その後にリンクを生成したり、URLの有効性をチェックするにはURL型へのキャスト(型変換)を行わないとエラーになるので注意してください。今回はTextFieldなどの実装コードは省略します。

有効性を識別するために専用のメソッドを定義します。今回はvalidationUrlメソッドとしておきました。引数でチェック対処のURL文字列を受け取り、有効性によって真偽値を戻り値とてして返すようにしています。

func validationUrl (urlString: String) -> Bool {
    if let nsurl = NSURL(string: urlString) {
        return UIApplication.shared.canOpenURL(nsurl as URL)
    }
    return false
}

これで有効性をチェックするメソッドは完成です。どのようなコード構造になっているか整理していきます。

NSURLクラス

NSURLクラスはWebページのURLやファイルのパスを管理、操作するためのクラスです。

対象URLを保持したNSURLオブジェクトを生成するにはNSURL(string: URL文字列) 形式のイニシャライザを使用します。これでString型からURL型(NSURL型)へとキャストしておきます。

let nsurl = NSURL(string: urlString)

UIApplication.shared.canOpenURL(nsurl as URL)

URLの有効性を実際にチェックしているのはUIApplicationクラスのcanOpenURLメソッドです。このメソッドの引数にURL型のURLを渡すと有効であればtrueを無効であればfalseを返します。

UIApplication.shared.canOpenURL

UIApplicationクラスの使用方法については下記記事を参照してください。

日本語を含むURLに対応する

入力されたURLに日本語が含まれている場合、上記の方法では正しく動作しないことがあります。これはNSURL型へキャストする際に日本語を変換できず格納値がnilになってしまうからのようです。

これを解決するにはString ProtocolのもつaddingPercentEncodingメソッドを使用します。このメソッドを使って日本語をエスケープされた「%」表記に変換することでエラーを解消することができます。

おすすめ記事:【Swift】Unicodeエスケープ文字/パーセント文字を文字列に変換する方法!removingPercentEncoding

func validationUrl (_ urlStr: String) -> Bool {
    guard let encurl = urlStr.addingPercentEncoding(withAllowedCharacters: NSCharacterSet.urlQueryAllowed) else {
        return false
    }
    if let url = NSURL(string: encurl) {
        return UIApplication.shared.canOpenURL(url as URL)
    }
    return false
}

URLへのリンクボタンの生成方法については下記記事を参考にしてください。

URL構造体でチェックする

公式リファレンス:URL構造体

URL構造体を使用することでURLに無効な文字列が含まれているかどうかをチェックすることが可能です。しかしこの場合はあくまで有効なURL文字列であることをチェックできるだけなので、正常にアクセスできるURLであるかどうかを識別することはできません

func validationUrl (_ urlStr: String) -> Bool {
  guard let url = URL(string: urlStr) else {
    return false
  }
  return true
}

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

私がSwift UI学習に使用した参考書

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index