anz blog

UniversalLinks対応のアプリがあるならそれで開きたいし、なければSafariViewControllerで開きたい

2019-06-27 #Swift #UniversalLinks

ざっくりまとめ。

  • UniversalLinks対応のアプリがある場合はアプリで、ない場合はSafariViewControllerで開きたい
  • universalLinksOnlyオプションを指定して開く
  • 失敗したらSafariViewControllerで開く

です。

環境

  • Xcode v10.2.1
  • Swift 5.0

やりたいこと

なにか URL を開く時にUniversalLinks対応しているアプリがはいっていればそのアプリで開きたいし、
対応アプリが入っていない場合は SFSafariViewController で開きたい。

たとえば、あるツイートの URL を開こうとした時に、
Twitter アプリが入っているユーザであればWebとして開くより、そのアプリで開いたほうがいいじゃないですか?

対応

先に実現できるコードを。

func openURL(_ url: URL) {
    UIApplication.shard.open(url, options: [.universalLinksOnly: true]) { isOpened in
        guard !isOpened else {
            return
        }
        let vc = SFSafariViewController(url: url)
        present(vc, animated: true, completion: nil)
    }
}

これで実現できます。
UIApplication.OpenExternalURLOptionsKey.universalLinksOnly の指定がポイントですね。
名前の通り UniversalLinks でいけるばあいだけ開くというオプションです。
で、対応していない場合は completion で結果が false で返ってくるので、その場合は SafariViewController で開いているというわけです。

SFSafariViewController ではだめなの?

対応できるアプリが入っていたとしてもそのまま開いてしまう(アプリでは開かない)んですよね。

UIApplication.shared.open() だけではだめなの?

このケースだと、アプリが入ってるユーザはもちろんそのアプリで開きますが、
入っていないユーザだと、モバイルサファリの方で開くのです。(自分のアプリから離脱しちゃう)
ユーザがその後アプリに戻ってこようとおもったら、画面左上の小さい矢印をタップするしかないのです。
昨今縦長の端末が増えてきてるし、手間ですよね・・。
(ジェスチャ操作でアプリリストだしてそこから戻るってのもありますが手間感は変わらない)