Androidのディープリンクで、「アプリをインストール済みの場合はそのアプリを起動、未インストールの場合はPlayStoreページを表示」というような動作をさせたい。
以前はiframeのsrc属性にアプリ独自のカスタムスキーマをセットして、そのスキーマに反応しなかった場合はjavascriptでPlayStoreへ飛ばし、反応した場合はそのままアプリを立ち上げるという方法をとって上記のディープリンク的な動作を実現していた。が、2017年現在、iframeのsrc属性にカスタムスキーマをセットしてもアプリは立ち上がることはないので、この方法は使うことができない。
そのため現在はAndroidIntentを使うことがGoogleから推薦されている。
<a href="intent://scan/#Intent;scheme=zxing;package=com.google.zxing.client.android;end"> Take a QR code </a>
intentで始まるのがこのAndroidIntent。intentスキーマをもったリンクをhrefにセットすれば利用できる。上のhtmlの場合、以下のアプリが入ってたらそのアプリを起動し、入っていなかったら以下のページをPlayStoreアプリで開くことになる。
intentの記法
intent:
HOST/URI-path // Optional host
#Intent;
package=[string];
action=[string];
category=[string];
component=[string];
scheme=[string];
end;
intentから始まるやつの記法はこの通り。Host(上のzxingの例で言うと「scan」の部分)とその後に続くパスはオプション。#Intent;以降はpackageでアプリのパッケージ名を、actionやcategory,schemeなどはAndroidManifest.xml内のIntentFilterの該当部分のものを書けば望んだ動作が得られることになる。
Referrerを取得するには
<a href="https://play.google.com/store/apps/details?id=com.google.zxing.client.android&referrer=param1">QR code app</a>
AndroidはPlayStoreにアクセスした時のリファラをとれる。と言ってもリファラは上のリンクのようにURLパラメータで指定したものだけど。これを複数サイトの「アプリをインストール!」みたいなボタンにそれぞれセットしておけば、どのサイトからインストールしたのかという情報がわかるようになる。このリファラの値はBroadcastReceiverから取得することができる。
で、問題はこのリファラの値をAndroidIntentでどう指定するか。ドキュメントページには何も書いていないが、以下の方法で指定することが出来る。
intent://scan/#Intent;scheme=zxing;package=com.google.zxing.client.android;S.market_referrer=param1;end
S.market_referrer
にリファラの値を入れればOK。