こんにちは。
TunnelでAndroidアプリの開発を担当しています冨永です。
RoomClipでは昨年、主要なページを対象にAppIndexingの対応を行いました。
これによりWebの検索からシームレスにアプリを開くことができるようになっています。
また検索結果からだけではなく、RoomClipのページ内に「アプリで見る」等のボタンを配置してアプリを開くということもできるようになりました。
しかし、AppIndexingはアプリをインストールしていることが前提となっています。
そこでアプリをインストールしていない方にもWebから快適にアプリを使用していただくために、Firebaseの機能の1つであるDynamic Linksを導入したい!と思い、今回実際にリンクを作成して動作を確認してみました。
Dynamic Linksとは?
Firebaseは、Google I/O 2016で話題となった開発をサポートするモバイルプラットフォームです。Firebaseには、Analyticsを中心に様々な機能があります。
Dynamic Linksはその中でもGROWカテゴリに属する機能で、「さまざまプラットフォームで最適に動作するよう、動的に動作を変更できる便利な URL です」と紹介されています。
Dynamic Linksは、リンクを開いたユーザーの端末にアプリがインストールされていれば、そのリンクに紐づくコンテンツをアプリ上で表示し、インストールされていなければ、指定したGoogle Play ストアのページが開きインストールすることができます。
それだけでなく、インストール後も開いたURLを取得することができ適切にユーザーの求めるコンテンツを提供することができます。
実際に試してみる!
それでは、実際にリンクを作成して動かしてみたいと思います。
Firebaseのコンソールでリンクを作成
Firebaseのプロジェクト作成方法・初期設定は割愛します。
左メニューからDynamic Linksを選択します。
パッケージ名やIDが公的に入手可能なアセット/関連ファイルに追加されますがいいですか?と聞かれるので内容を確認して「始める」をクリックします。
Androidのアセットに関してはApp Links、iOSの関連ファイルに関してはUniversal Linksを確認してください。
質問に答えていくことでリンクが作成されます。
まず、ディープリンクURLとダイナミックリンク名を設定します。リンク名はコンソール画面での判別用の名前です。ディープリンクURLは、タグページがすでにディープリンクに対応しているのでこちらを使用します。
ちなみに、このURLでは西海岸インテリアのタグがついた実例写真一覧が表示されます。RoomClip Award 2016で見事1位に輝いた2016年主役のインテリアスタイルです。ぜひチェックしてみてください!
今回はiOSでの動作確認は割愛します。
Androidではアプリでディープリンクを開き、インストールされていない場合はGoogle Play ストアへ遷移するように設定します。
カスタムURLやアプリのバージョンで動きを変えることもできるのでサービスに合わせて設定してください。
残りの項目では、解析用のパラメータ設定やリンクがシェアされた際のプレビュータイトルなどの指定ができます。必要な場合は設定してください。
一通り設定して「ダイナミックリンクを作成」ボタンをクリックするとURLが作成されます。
動作を確認
それでは、実際にリンクを開いて動作を確認していきたいと思います。 まず以下の2つの場合を確認しました。使用したアプリは、記事公開時点でGoogle Play ストアに公開されているものでディープリンクに対応しています。
- アプリをインストールしていない状態でリンクを開く
- アプリをインストールした状態でリンクを開く
1. アプリをインストールしていない状態でリンクを開く
コンソールで設定したRoomClipのGoogle Play ストアのページが開きました。
ストアでインストール完了後、通常では「開く」と表示される部分が「次へ」となっています。
「次へ」をタップするとアプリが起動し、西海岸インテリアの写真一覧が表示されました。
2. アプリをインストールした状態でリンクを開く
こちらの場合も適切に西海岸インテリアの写真一覧が表示されました。
IntentFilterおよび受信したIntentとDynamic Linksの関係
アプリ側を変更せずに理想的な動作をしてしまいました。
理想的すぎて不安になったので動作を理解するために、IntentFilterおよび受信したIntentとDynamic Linksの関係を調べてみました。
確認には以下のコードを使用しました。action, data, ResultCallbackで取得できるディープリンクURLを確認しています。
コードは、公式のドキュメントで紹介されているものを使用しています。Firebaseそのものの実装はこちらの公式ドキュメントをご確認ください。
タグページのIntentFilterのみ実装しリンクを開く
受信したIntentからactionはandroid.intent.action.VIEW、dataは設定したディープリンクURLが取得できました。 また、ResultCallbackでもディープリンクURLを取得できています。
通常のディープリンクによる遷移は、actionがIntent.ACTION_VIEWであること、dataがnullでないことの2点の条件に当てはまるかどうかで判定し、dataに格納されているURLを解析して適切な画面を表示しています。
今回、Dynamic Linksのリンクを開きましたが、アプリ側では通常のディープリンクとして処理されていることがわかりました。
IntentFilterをすべて削除してリンクを開く
IntentFilterをすべて削除してリンクを開いたところ、アプリが起動しトップ画面が表示されました。
actionはandroid.intent.action.MAIN、dataは設定したディープリンクURLが取得できました。 また、ResultCallbackでもディープリンクURLを取得できています。
IntentFilterを設定していない場合は、通常起動と同じように起動されるようです。
Dynamic Linksに対応したIntentFilterを設定する
今回生成したリンクに対応したIntentFilterを設定し、以下の2パターンを確認しました。
Dynamic LinksのIntentFilterのみ設定した場合
actionはandroid.intent.action.MAIN、dataは設定したディープリンクURLが取得できました。Dynamic Linksとタグページの両方のIntentFilterを設定した場合
actionはandroid.intent.action.VIEW、dataは設定したディープリンクURLが取得できました。
1,2どちらの場合も、ResultCallbackでもディープリンクURLを取得できています。
Dynamic Linksを開いた際の動作まとめ
どうやら以下のような関係となっているようです。
- ディープリンクURLに対応するIntentFilterが設定されている場合、対応するActivityが開かれ、ブラウザ等でディープリンクを開いた際と同じ動作をする
- 通常のディープリンクとDynamic Linksを区別するにはResultCallbackで取得できる値を確認する必要があるが、非同期のため処理を工夫する必要がある
- IntentFilterを設定していない場合、通常起動と同じ動作をする
今回の調査でdataにディープリンクURLが入っていたことが予想外でした。
実装前は、通常のディープリンクの場合はdataにURLが入っていて、Dynamic Linksの場合は、dataは空でResultCallbackでURLが取得できてコンテンツを表示するという動きを期待していました。
まとめ
良いところ
- コンソールを使用するとURLの生成が簡単
- Android, iOSの両方に対応したURLが作成できる
- バージョン指定でアップデートにも対応できる
- ディープリンクに対応していれば、そのURLを設定することで簡単にDynamic Linksに対応することができる
- インストール後もすぐにユーザーの求めるコンテンツを表示することができる
- コンソールでURLを生成した場合は、クリック数を確認することができる
良くないところ
- アプリをインストール済みでリンクを開いた場合と、Google Play ストアでインストールした場合で表示するコンテンツを変えたい場合、実装が難しい
- コンソールでは、一度作成したリンクの内容を変更できない
使いどころ
今回URLはコンソールで作成しましたが、プログラムによってダイナミック リンクを作成することもできるようです。プログラムで作ることができると様々なページに対応することができます。
新規インストールしたユーザーを判別すれば、チュートリアルを表示した上で適切なコンテンツを表示することもできるので理想的な動作になり良いなと思いました。
また、広告で使用することも想定されているようですので、広告内容とリンク先内容の組み合わせを適切に設定することでより満足度の高い体験をしてもらえるのではないかと思いました。
以上となります。
今回は、弊社のRoomClipにDynamic Linksをテスト実装してみました。もともとのアプリの作り次第では、良くないところとして上げた点もうまく解消できる可能性があります。
URLの自動生成やiOSの実装に関してはまたの機会に。
ここまでお付き合いいただきありがとうございました!

この記事を書いた人:Tominaga
Androidエンジニア。 ドロイドくんが好き。