SNOOZE LOG

iOS中心のプログラミング関連技術メモ

【iOS】Universal Links と Custom URL Scheme についてのメモ

はじめに

「Custom URL Scheme (たぶんiOS4〜)」と「Universal Links (iOS9〜)」について。どちらも関連するアクションにより「アプリの起動」もしくは「ディープリンク(アプリを起動した上に特定の画面ヘ直接遷移すること)」に使用される技術です。
今秋はiOS11リリースが控えており、そろそろiOS8のサポートを打ち切ってiOS9以降のAPIの使用、切替へ本腰を入れる頃かと思い調査してみました。
参考になったURLと、ポイントと思った部分を箇条書きで抽出してみました。

Custom URL Scheme (たぶんiOS4〜)

<概要・実装手順>
[iOS] ディープリンク(Custom URL Scheme)でアプリを起動する | Developers.IO

ディープリンクを実装する時におすすめなライブラリ>
GitHub - joeldev/JLRoutes: URL routing library for iOS with a simple block-based API

Appleの公式ドキュメント>
About Apple URL Schemes

<iOS9以降での注意点、問題の解決法>
iOS9でカスタムURLスキームの遷移に失敗するときの注意点 - Qiita
iOS9のSafariにてiframe内でストアへリダイレクトさせると白画面で止まる問題 - 人間になりたい類人猿

・「Web ページからのアプリ遷移(後述の独自ディープリンクに応用可能)」「アプリ間の遷移」「異なる端末間の遷移」に使用可能。
・例えば、Web ページ等に URL Scheme を使ったリンクを設置しておき、タップされると iOSAndroid が対応するアプリを起動するなど。
・URL Scheme は myapp:// のような形式でアプリごとに設定。
・myapp:// が他のアプリと重複すると呼び出すアプリが不定となることがある。
・myapp://events/123/ のようにして, (引数として)追加の情報を URL に付加することができる。
ディープリンクに応用する場合、引数に対応してどのアプリ内のどのコンテンツに遷移するか、などが後述するUniversal Linksと違ってWebサイトのURL構成と違ってくるので、定義・独自に実装する。
Androidも同じCustom URL Scheme形式でアプリ起動などが実装できるので、サーバー側は両OSで同じような実装で対応が出来そうなところはメリット。

・以下のような挙動をさせたい場合は、WebページのJavaScript等で制御する必要がある模様。
  ∟アプリがインストール済み:アプリに自動遷移(iOS9以降は標準アプリ以外への遷移は「アプリで開く」確認ダイアログが表示される仕様)
  ∟アプリが未インストール: 通常通りWebページが開く
参考: カスタムURLスキームでアプリを起動させ、アプリが無ければストアに遷移させる - Qiita
JavaScriptは、URLスキーマ起動を試みて、500ms待ってもダメだったらストアに遷移するというような実装内容)

Universal Links (iOS9〜)

<概要>
URLスキーム・独自ディープリンク実装に代わる、Universal Links(iOS 9で導入)でより良いUXを実現 - Qiita

<実装手順>
Universal Linksを試してみました。関連づけファイル(apple-app-site-association)はS3に置きました。 | Developers.IO

Apple の公式ドキュメント>
App Searchプログラミングガイド:ユニバーサルリンクへの対応

・「ディープリンク」がAPIとして公式にサポートされた。
・アプリ起動の起因を、Web URL形式1つに統一できる。
iPhoneSafariで特定のHTTPのリンクをタップされた時(サーバー側にUniversal Linkの設定があれば)アプリが起動される。
・デフォルトで以下の挙動となる
  ∟アプリがインストール済み: アプリにシームレスに遷移(プッシュ遷移)
  ∟アプリが未インストール: 通常通りWebページが開く
・(設定が重複するようながことがなく)呼び出すアプリが不定となるようなことがない。
・使用方法:apple-app-site-associationというファイルをWebサイトに配置。アプリ側は設定と、遷移をハンドリングするコードを書く。
・問題点
  ∟iOS専用(カスタムURLスキーム形式はAndroidで使用可能)
  ∟iOS 9でしか使えない(現在もうこのデメリットはなくなりつつある)
  ∟WebサイトがSSL対応している必要がある(ATS対応で済ませていることと思う)

<ハマりどころ>
Universal Links の実装と嵌まりどころなど: シーサー渋谷ではたらく技術担当のブログ(SSGブログ)
・同ドメインのページ間をUniversal Links遷移しようとした場合にうまく機能しない場合がある。
・SFSafariViewController から Universal Links で呼び出すとステータスバーに[戻る]が出てこない。
・SFSafariViewController では Universal Links が必ず有効になりアプリに遷移してしまうのでWEBブラウズし続けられない。

まとめ

ディープリンクする時は、Custom URL Schemeでは確認ダイアログが出てしまうのでUniversal Linksの方がUXは良くなる。
・Custom URL SchemeAndroidにもあるが、Universal Linksのような仕組みはAndroidにはなくiOSのみっぽい。
adjustのようなライブラリを使用すると同じように管理出来るのかも)
というところが現状は大きいかなと思いました。カスタムURLスキームはアプリ間での遷移呼び出しでも使用されるので、 あくまでUniversal Linksはディープリンクに特化したAPIなのだな、と改めて思いました。


その他参考URL

URLスキームはダイアログが出るからUniversal Linksを試してみた - zono blog
iOS・Android のディープリンク技術のまとめ (2017年2月更新) – ymyzk’s blog
Custom URL Schemeの処理をシンプルに書く - Qiita
【iOS9】Universal Links を試す | MUSHIKAGO APPS MEMO