[iOS14]他アプリを開く機能の挙動

1 min read読了の目安(約1500字

調べたこと

UIApplicationで他アプリを開く機能について、通常ですとInfo.plistに他アプリのスキームを書く必要があることが公式ドキュメントには書いてあります。
しかし、現時点(2021/06)ではInfo.plistにスキームを書かなくても開けるようです。ドキュメントをみる限り非推奨なので、今後のアップデートで使えなくなる可能性はあります。

環境

  • iOS14.5-14.6
  • Xcode12.5

公式ドキュメントの方法

使用するメソッドは下記の2つです。

//URLを開けるかどうか
func canOpenURL(_ url: URL) -> Bool
//URLを開く
func open(_ url: URL, 
  options: [UIApplication.OpenExternalURLOptionsKey : Any] = [:], 
completionHandler completion: ((Bool) -> Void)? = nil)

1.URLが開けるかどうかを確認する

canOpenURLを使うことで、URLが開けるかどうかを判定できます。
httpsmailなどは設定していなくても開けます。しかし、例えはline://などはInfo.plistに記載しないとエラーとなります。Info.plistLSApplicationQueriesSchemesに配列としてlineを入れれば、LINEアプリを開くことができます。

2.URLを開く

1のcanOpenURLの判定がYES/trueであれば、open(_ url: URL)を使えると、ドキュメントには書いてあります。

現状の仕様

現状ですと、canOpenURLのみLSApplicationQueriesSchemesの中を見て判定しているようです。
LSApplicationQueriesSchemesに記載していなくても、open(_ url: URL)で開けてしまいます。
おそらく、この辺りの仕様は今後変更になるはずです。

その上で、現在できる実装方法は下記になります。

func openAnotherApp(url: URL) {
  UIApplication.shared.open(url, options: [:]) { result in
    if !result { //アプリが開けなかった場合
      /*メッセージを表示*/
    }
  }
}

参考

canOpenURL

https://developer.apple.com/documentation/uikit/uiapplication/1622952-canopenurl
openURL
https://developer.apple.com/documentation/uikit/uiapplication/1648685-openurl
https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/LaunchServicesKeys.html#//apple_ref/doc/plist/info/LSApplicationQueriesSchemes