🍎

[Swift]canOpenURLがfalseの際の対処法

2022/04/28に公開

概要

外部ブラウザなど別アプリを起動する前に指定するURLが、
起動するためのアプリが端末内に存在しているかどうかを判定する、
canOpenURLメソッドでfalseが返ってきてしまい、
開く処理まで到達出来ない現象があったので、その際の対処法。

原因

canOpenURLの公式リファレンスを見ると、
importantとして以下の記載があった。
iOS9.0以降はplistのLSApplicationQueriesSchemes内で、
URLスキームを指定してあげる必要があります。

iOS9.0以降でアプリをリンクする場合、
アプリの Info.plist ファイルに LSApplicationQueriesSchemes キーを追加して、
このメソッドに渡すURLスキーマを宣言する必要があります。
このメソッドは、デバイスに登録されたアプリがインストールされていない場合でも、
未宣言のスキームに対しては常にfalseを返します。
iOS15以降にリンクされたアプリは、LSApplicationQueriesSchemesキーに最大50項目の制限があります。

https://developer.apple.com/documentation/uikit/uiapplication/1622952-canopenurl

対処法

上記原因の中で挙げたように、
Info.plistLSApplicationQueriesSchemesにスキームを追加すれば良いです。

ただそもそもcanOpenURLメソッドを使う理由は、
端末内に起動できないスキームがない事を判定したいはずです。
なのでよく使用される外部ブラウザ起動では端末の設定などで、
ブラウザを使用しないなど特殊な状態でない限り問題が無いように思います。

またその他よくある例として、
スキームでitms-appsを指定し直接AppStoreアプリを開くこともあります。
この場合もiPhoneでAppStoreアプリが無いというのはまず考えられないので、
この場合もcanOpenURLでの判定は不要かと。

まとめ

外部ブラウザやAppStoreアプリを起動する際にはcanOpenURL自体通す必要がなく、
その他連携アプリなどを起動したい場合は、
LSApplicationQueriesSchemesにスキームを追加すれば良いということが分かりました。

Discussion