ガイドとサンプルコード

デベロッパ

App Searchプログラミングガイド

このページの内容

ユニバーサルリンクへの対応

ユニバーサルリンクに対応すると、iOS 9ユーザがウェブサイトのリンクをタップしたとき、Safariを経由せず、インストール済みアプリケーションに直接遷移させることが可能になります。もし未インストールの場合はSafariが起動し、ウェブサイトが開きます。

ユニバーサルリンクには、カスタムURLスキームと違い、次のような長所があります。

  • 固有性。カスタムURLスキームとは違い、ユニバーサルリンクは他のアプリケーションから同一のものを指定することはできません。標準的なHTTPやHTTPSのウェブサイトへのリンクを使うためです。

  • 安全性。iOSは、ユーザがアプリケーションをインストールした際、ウェブサーバ上にアップロードされたファイルをチェックして、このアプリケーションが当該URLを開いても問題ないことを確認します。このファイルを作成し、ウェブサイトにアップロードできるのはアプリケーション開発者だけなので、ウェブサイトとアプリケーションとの関連づけは安全なものになります。

  • 柔軟性。アプリケーションが未インストールであっても、ユニバーサルリンクは問題なく動作します。リンクをタップするとSafariが起動し、コンテンツが現れますが、これはユーザが期待した通りの挙動です。

  • 簡潔性。単一のURLがウェブサイトとアプリケーションの両方において有効になるため、記述が簡潔になります。

  • 非公開性。他のアプリケーションが、インストール済みか否か確認せずに特定のアプリケーションに対して通信できます。

ユニバーサルリンクは容易に対応が可能です。次の3段階でおこないます。

  • apple-app-site-associationファイルを作成し、アプリケーションが扱うURLを、JSONデータの形で記述します。

  • apple-app-site-associationファイルを、HTTPSで接続するウェブサーバ上にアップロードします。サーバのルートまたは.well-knownサブディレクトリに配置できます。

  • アプリケーションがユニバーサルリンクを扱えるよう準備します。

デバイス上でユニバーサルリンクをテストできます。

関連づけファイルを作成、アップロードする

ウェブサイトとアプリケーションとを安全に接続するためには、両者間に信頼関係を確立する必要があります。これは2つの部分から成ります。

アプリケーションとウェブサイトが証明書を共有する手順については、『Shared Web Credentials Reference』を参照してください。

apple-app-site-associationファイルは、ドメインごとに内容を変えて用意する必要があります。たとえばapple.comdeveloper.apple.comには、それぞれ独立にapple-app-site-associationファイルを用意します。この2つのドメインは、提供するコンテンツが異なるためです。一方、apple.comwww.apple.comは、同じコンテンツを提供するので、関連づけファイルも同じで構いません。ただし、両方にこのファイルを置く必要があります。iOS 9.3.1以降で動作するアプリケーションの場合、圧縮されていないapple-app-site-associationファイルのサイズは、署名済みファイルであるかどうかにかかわらず128KBを超えないことが要件になります。

apple-app-site-associationファイルでは、ユニバーサルリンクとして処理するウェブサイトおよびユニバーサルリンクとして処理しないウェブサイトからのパスを指定します。リストに記述するパスは、ごく少数にとどめてください。多数のパスと一致するように記述するには、ワイルドカードによるパターンマッチングを利用します。リスト6-1に、ユニバーサルリンクとして処理しない3つのパスを指定したapple-app-site-associationファイルの例を示します。

リスト6-1apple-app-site-associationファイルの記述例
  1. {
  2. "applinks": {
  3. "App": [],
  4. "details": [
  5. {
  6. "appID": "9JA89QQLNQ.com.apple.wwdc",
  7. "paths": [ "/wwdc/news/", "/videos/wwdc/2015/*"]
  8. },
  9. {
  10. "appID": "ABCD1234.com.apple.wwdc",
  11. "paths": [ "*" ]
  12. }
  13. ]
  14. }
  15. }

apple-app-site-associationファイルには「apps」キーが必須です。その値は、リスト6-1のように、空の配列でなければなりません。detailsキーの値は辞書の配列で、ウェブサイトがサポートするアプリケーションごとに辞書を用意します。システムは辞書が配列中に現れる順序に従ってアプリケーションを照合します。その結果、ウェブサイトのパスによって、処理を引き受けるアプリケーションが決まります。

アプリケーションごとに用意する辞書には、appIDキーとpathsキーが必要です。appIDキーの値はチームIDまたはApp IDの接頭辞であり、このプレフィックスの後ろにバンドルIDが付加されます(appIDの値は、アプリケーションのビルド後、アプリケーションのエンタイトルメントに含まれている“application-identifier”キーに関連づけられているものと同じ値です)。pathsキーの値は、ウェブサイト中のどのパスを当該アプリケーションが処理し、どのパスを当該アプリケーションには関連づけないかを表す文字列の配列です。ユニバーサルリンクとして処理しない領域を指定するには、パス文字列の先頭に“NOT ”を付加します(Tの後ろには空白文字を入力)。たとえば、リスト6-1に示したapple-app-site-associationファイルの場合は、paths配列を以下のように書き換えることで、ウェブサイトの/videos/wwdc/2010/*領域がユニバーサルリンクとして処理されないように設定できます。

  1. "paths": [ "/wwdc/news/", "NOT /videos/wwdc/2010/*", "/videos/wwdc/201?/*"]

paths配列に含まれている個々のパスは、記述されている順に評価され、肯定または否定の検索文字列に一致するものが見つかった時点で評価が中止されます。したがって、優先度の高いパスを低いパスよりも先に記述する必要があります。なお、照合するのはURL中の「パス」部分だけで、クエリ文字列、フラグメント識別子など、その他の部分は無視します。

apple-app-site-associationファイルには、ウェブサイトのパスをさまざまな方法で記述できます。その例をいくつか示します。

  • *を使って、ウェブサイト全体を指定する。

  • 具体的なURL(たとえば/wwdc/news/)を記述して、リンクを個別に指定する。

  • 具体的なURLに*を付加して(たとえば/videos/wwdc/2015/*)、ウェブサイトの特定のセクションを指定する。

    任意の部分文字列に合致する「*」のほか、任意の1文字に合致する「?」も指定できます。この2つのワイルドカードをひとつのパスの中で用い、「/foo/*/bar/201?/mypage」のように記述することも可能です。

作成したapple-app-site-associationファイルを、HTTPSウェブサーバのルートまたは.well-knownサブディレクトリにアップロードしてください。リダイレクトを起こすことなく、https://<domain>/apple-app-site-associationまたはhttps://<domain>/.well-known/apple-app-site-associationというHTTPSのURLでアクセスできるようにする必要があります。続いて、アプリケーションがユニバーサルリンクを扱えるようにします。

アプリケーションがユニバーサルリンクを扱えるようにする

ユニバーサルリンクには2つの技術が使われています。ひとつは、ウェブブラウザとネイティブアプリケーションとの間で、Handoffが受け渡しをするために使っているのと同じ機構です(「Web Browser–to–Native App Handoff」を参照)。もうひとつは共有ウェブ証明書です(『Shared Web Credentials Reference』を参照)。ユーザがユニバーサルリンクをタップすると、iOSはアプリケーションを起動し、NSUserActivityオブジェクトを送信します。アプリケーションはこれを調べて、どのような形でアプリケーションが起動されたかを判断します。

アプリケーションがユニバーサルリンクを扱えるようにするためには、次の作業が必要です。

  • アプリケーションのサポート対象であるドメインをエンタイトルメントに加える。

  • アプリケーションデリゲートを修正して、NSUserActivityオブジェクトを受け取ったとき適切に応答できるようにする。

com.apple.developer.associated-domainsエンタイトルメントに、アプリケーションがユニバーサルリンクとして扱うドメインの一覧を記述します。Xcode上で、「Capabilities」タブの「Associated Domains」セクションを開き、該当する各ドメインのエントリを追加してください。applinks:を接頭辞として付加し、たとえばapplinks:www.mywebsite.comとします。この一覧に記述するドメインの数は、20〜30以下に抑えてください。

関連するドメインのすべてのサブドメインをパターンマッチングの対象にするには、個々のドメイン名の先頭に*.を接頭辞として付けることで、ワイルドカードを指定します(ピリオド必須)。ドメイン名のパターンマッチングの基準になるのは、applinksエントリに含まれている最長の部分文字列です。たとえば、applinks:*.mywebsite.comapplinks:*.users.mywebsite.comというエントリを指定した場合、emily.users.mywebsite.comドメインについては、長いほうの*.users.mywebsite.comエントリとのパターンマッチングが実行されます。*.mywebsite.comというエントリの場合、アスタリスクの後ろにピリオドがあるため、mywebsite.comに一致しているとは見なされないことに注意してください。*.mywebsite.commywebsite.comのどちらについてもパターンマッチングを有効にするには、applinksエントリをそれぞれ別に記述する必要があります。

該当するドメインを指定した後、HandoffにUIApplicationDelegateメソッドを採用して(特にapplication:continueUserActivity:restorationHandler:)、アプリケーションでリンクを受信して適切に処理できるようにします。

ユーザがユニバーサルリンクをタップし、iOSがアプリケーションを起動すると、アプリケーションにはNSUserActivityオブジェクトが渡されますが、そのactivityTypeプロパティの値はNSUserActivityTypeBrowsingWebとなっています。また、webpageURLプロパティには、ユーザがアクセスしようとしたURLが設定されています。このURLはスキームがHTTPまたはHTTPSなので、NSURLComponentsのAPIを使って構成要素に分割し、操作できます。

処理の対象であるユニバーサルリンクをユーザがタップすると、iOSは、ユーザによる最近の選択内容も調査して、アプリケーションまたはウェブサイトを開くかどうかを特定します。たとえば、ユニバーサルリンクをタップしてアプリケーションを開いたユーザは、その後、Safariのステータスバーにあるブレッドクラムボタンをタップしてウェブサイトを開くことを選択できます。ユーザがこのように選択した後は、ユーザがウェブページのスマートアプリケーションバナーにある「開く」をタップしてアプリケーションを開くことを選択するまで、Safariでウェブサイトが開かれます。

重要なのは、アプリケーション内でユニバーサルリンクを開こうとしてopenURL:メソッドを呼び出すと、URLで表されるアプリケーションにリダイレクトするのではなく、Safari上にリンク先が開くことです。この状況では、メソッドを呼び出したのが対応するアプリケーションそのものであり、したがってユニバーサルリンクとして扱うべきではない、とiOSが認識したからです。

NSUserActivityオブジェクトが表すURLが無効だったとしても、単純にエラーとしてしまわないことが大切です。このような場合、共有アプリケーションオブジェクト上でopenURL:を呼び出すことにより、Safariを起動してリンク先を開くとよいでしょう。それでもうまくいかなければ、状況を説明するエラーメッセージを表示します。