はじめに

UniversalLinksでディープリンクを実装し、リンククリックでアプリを起動する方法をメモします。ios9より対応しているため、それ以前のバージョンは考慮しません。(実際はカスタムURLを使うと実装が可能です。iOS9以前を対象ととする場合はバージョンにより切り分ける処理が、アプリ側もサーバ側も必要になります。)

やりたいこと

1)既にアプリがインストールされている場合はアプリを起動
2)アプリがインストールされていない場合はストアを起動(アプリのインストールを促す)

ドキュメント
https://developer.apple.com/jp/documentation/General/Conceptual/AppSearch/UniversalLinks.html

UniversalLinksについて

引用:

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

iOS9より前のバージョンのUniversalLinks挙動

引用:

iOS 9.0よりも古いバージョンであれば、ユニバーサルリンクをタップするとSafariが起動し、リンク先ページが開きます。

新規アプリの場合はios9以前のバージョンは現時点で5%以下のため捨てて良いと思います。
https://developer.apple.com/support/app-store/

UniversalLinks実装について

UniversalLinksの実装にはアプリ側とサーバ側どちらも設定を行う必要があります。サーバ側のみ対応してもアプリ側で対応しないとディープリンクは有効に働きません。

サーバ側の実装:
1)apple-app-site-associationファイルの作成と設置

アプリ側の実装:
1)com.apple.developer.associated-domainsエンタイトルメントに該当するドメインのエントリを追加する
2)ディープリンクをハンドリング

[サーバ側] 1)apple-app-site-associationファイルの作成と設置

アプリとサーバで関連付けを行い信頼をあげるための処理を入れる必要があります。
apple-app-site-associationファイルを作成し、サーバに設置し、アプリ側でインストール時にダウンロードを行い中身の整合性チェックを行いセキュアな接続をしています。

引用:

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

apple-app-site-associationファイルにドメイン情報を設定します。
ファイルはjsonですが拡張子はつけるとうまく動作しないようです。

設定例:

{
“applinks”: {
“App”: [],
“details”: [
{
"appID": "9JA89QQLNQ.com.apple.wwdc",
"paths": [ "/wwdc/news/", "/videos/wwdc/2015/*"]
},
{
“appID”: “ABCD1234.com.apple.wwdc”,
“paths”: [ "*" ]
}
]
}
}

引用:apple-app-site-associationファイル記述に関する説明文

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/*領域がユニバーサルリンクとして処理されないように設定できます。

“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」のように記述することも可能です。

[アプリ側] 1)com.apple.developer.associated-domainsエンタイトルメントに該当するドメインのエントリを追加する

サーバとの関連付けのため、ドメインをエントリします。
xcodeのcapabilitiesから設定します。

引用:

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

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

[アプリ側] 2)ディープリンクをハンドリング

アプリでディープリンクを取得しドメインにより処理を切り分けます。

引用:

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

実装コード例

func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool {

if userActivity.activityType == NSUserActivityTypeBrowsingWeb {
let webpageURL = userActivity.webpageURL! // userActivity.webpageURLのurlを取得し、ドメイン判定を行い処理を切り分ける。サポートしていない場合はsafariへリダイレクト処理を入れるのが慣例
}

return true
}

アプリをインストールしていない場合にStoreへ遷移するには

Universal Linksは直接Storeへの遷移はできないため、一旦、未インストール用のページをサーバで用意して、そちらに遷移し、そこのファイル内でStoreへ遷移させることが必要になります。

<a href=”itmss://itunes.apple.com/us/app/myapp/id[アプリID]?ls=1&mt=8″></a>

アプリIDにiTunesサイトのリンクのIDを入れると遷移します

参考

http://qiita.com/mono0926/items/2bf651246714f20df626

https://developer.apple.com/jp/documentation/General/Conceptual/AppSearch/UniversalLinks.html

その他おすすめの備忘録

Comments are closed.