【SwiftUI】入力されたURLの有効性を識別する方法!
この記事からわかること
- SwiftUIで入力されたURLの有効性をチェックする方法
- ColorSchemeとは?
- URLを入力値として扱う際の注意点
- NSURLクラスの使い方
- 日本語を含んだURLの場合のエラー対処法
- addingPercentEncodingメソッドの使い方
- URL構造体を使ったチェック方法
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
SwiftでユーザーからURLを入力値として受け入れる際の有効性をチェックする方法をまとめていきます。
URLの有効性をチェックする方法
Swift UIを用いてURLの入力欄を設けてユーザーの入力した値をリンクとして生成するにはいくつか注意点があります。
注意点
- URL型へのキャスト
- 入力された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であるかどうかを識別することはできません。
func validationUrl (_ urlStr: String) -> Bool {
guard let url = URL(string: urlStr) else {
return false
}
return true
}
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。
私がSwift UI学習に使用した参考書