😎

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

2021/06/03に公開1

調べたこと

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

Discussion

naoto1008naoto1008

記事拝見させていただきました。
最近webアプリを作成しており、あるサイトを踏むと自動的に他のアプリ(例えば写真)が開くような挙動を実現したいです。
その際はどのようなものを使用するのが適しているかご存知でしたら教えていただきたいです!