前提環境
- Xcode 11.3.1
- Swift 5.1.3
- iOS 14.0 / 14.0.1
問題事象
サンプルコード:
let url = URL(string: "https://qiita.com")!
guard UIApplication.shared.canOpenURL(url) else {
return
}
UIApplication.shared.open(url, options: [:], completionHandler: nil)
- iOS 14.0 / 14.0.1でデフォルトブラウザをSafari以外(Chromeなど)に設定し上のコードを実行すると、ブラウザが起動しない。
- Xcode 11 (iOS 13 SDK) でビルドしてもiOS 14の端末では発生する。
- 14.0から発生しているが14.0.1で解消していないということは、すなわちiOSのバグではなく仕様変更?
<デフォルトブラウザをChromeに変更する手順>
- iOS 14の端末で、Chromeをインストールする。
- 設定>Chromeを選択する。
- ブラウザの一覧が表示されるので、Chromeを選択する
原因
iOS 14.0以降でデフォルトブラウザをSafari以外(Chromeなど)に設定すると、UIApplication.shared.canOpenURL()
がfalseを返却するため。
回避策
Info.plistのLSApplicationQueriesSchemesに"https"および"http"を設定すると回避できます。
関連事象
iOS 14においてはデフォルトメーラーについても変更できるようになりました。
"mailto"についても同様に、LSApplicationQueriesSchemesに追加しないと、デフォルトメーラーが変更されている場合にはUIApplication.shared.canOpenURL()
がfalseを返却します。
横展開調査
以上の事項は、文末の「参考リンク」の記事で得られた有益な情報です。
執筆者の方には深く感謝を申し上げたいです。
一方以下は、私が独自に追加調査をした結果になります。
電話アプリの"tel"および"telprompt"スキーム
"tel"はApple URL Schemesにてドキュメント化されているスキームです。
"telprompt"はドキュメント化されていないスキームです。
いずれも、LSApplicationQueriesSchemesに追加しなくても、iOS 14でも電話アプリが起動します。
ちなみに、「将来、電話アプリのデフォルトが変更できるようになったら?」という疑問があったので、LSApplicationQueriesSchemesに"tel"を追加してみたところ、追加してもちゃんと動作します(当たり前?)。
Walletアプリの"shoebox"スキーム
ドキュメント化されていないスキームです。
LSApplicationQueriesSchemesに追加しなくても、iOS 14でもWalletアプリが起動します。
設定アプリ
こちらのスキームは文字列ではなくUIApplication.openSettingsURLString
となりますが、(当然ながら)LSApplicationQueriesSchemesに追加しなくても、iOS 14でも設定アプリが起動します。
検証結果の整理
- iOS 14では、カスタムスキームに加えて、デフォルトを変更できるアプリのスキームもInfo.plistに定義しないとダメです。
- ドキュメント化されているスキーム、ドキュメント化されていないけど動くスキーム、いずれも、現時点でブラウザとメーラー以外は影響を受けていない模様です。
参考リンク
【iOS14】デフォルトブラウザを変更した時にcanOpenURLがfalseになる問題
iOS 14対応で気をつけるべきこと