[Swift]canOpenURLがfalseの際の対処法
概要
外部ブラウザなど別アプリを起動する前に指定するURLが、
起動するためのアプリが端末内に存在しているかどうかを判定する、
canOpenURL
メソッドでfalseが返ってきてしまい、
開く処理まで到達出来ない現象があったので、その際の対処法。
原因
canOpenURL
の公式リファレンスを見ると、
importantとして以下の記載があった。
iOS9.0以降はplistのLSApplicationQueriesSchemes内で、
URLスキームを指定してあげる必要があります。
iOS9.0以降でアプリをリンクする場合、
アプリの Info.plist ファイルに LSApplicationQueriesSchemes キーを追加して、
このメソッドに渡すURLスキーマを宣言する必要があります。
このメソッドは、デバイスに登録されたアプリがインストールされていない場合でも、
未宣言のスキームに対しては常にfalseを返します。
iOS15以降にリンクされたアプリは、LSApplicationQueriesSchemesキーに最大50項目の制限があります。
対処法
上記原因の中で挙げたように、
Info.plist
のLSApplicationQueriesSchemes
にスキームを追加すれば良いです。
ただそもそもcanOpenURL
メソッドを使う理由は、
端末内に起動できないスキームがない事を判定したいはずです。
なのでよく使用される外部ブラウザ起動では端末の設定などで、
ブラウザを使用しないなど特殊な状態でない限り問題が無いように思います。
またその他よくある例として、
スキームでitms-apps
を指定し直接AppStoreアプリを開くこともあります。
この場合もiPhoneでAppStoreアプリが無いというのはまず考えられないので、
この場合もcanOpenURL
での判定は不要かと。
まとめ
外部ブラウザやAppStoreアプリを起動する際にはcanOpenURL
自体通す必要がなく、
その他連携アプリなどを起動したい場合は、
LSApplicationQueriesSchemes
にスキームを追加すれば良いということが分かりました。
Discussion