【Androidアプリを】AppIndexingを使ってみた。【Googleに見て欲しい】


[参考： Google 検索用 App Indexing](https://developers.google.com/app-indexing/?hl=ja)

まぁ参考というか公式ドキュメントですが....
すっごく直感的ではないですよね。

とってもテキストテキストしてます。
こういうのこそ、電子書籍のリンクでも付けて無料配布すればいいのにと思っている。

どうも、そんな私です。

今回はAndroidアプリをもっと皆に知ってもらうための方法
「App Indexing」の導入をやってみましたので共有です。

# App Indexingって何？

googleさん曰く
「App Indexing を使うと、Google 検索の結果を通じてアプリの使用を増加させることができます。」
だそうです。
その説明通り、検索結果でアプリに関連するものが表示、もしくはアプリと関連付けられたWebページでアプリを起動する。というようなことが可能になります。

ちなみに、ディープリンクと言うのは

[android-app://com.google.android.youtube/http/www.youtube.com/watch?v=dQw4w9WgXcQ](intent://www.youtube.com/watch?v=dQw4w9WgXcQ#Intent;scheme=http;package=com.google.android.youtube;end)

こんな感じのURLをタップした時に関連するアプリを立ち上げるシステムのことです。
Androidでこれを見ている方は、youtubeが立ち上がると思います。


App Indexingって一括りにされてますが、

**Webmasterツールとgoogle play consoleでWebサイトとアプリを連携させるApp Indexing**

**App Indexing API を利用してWebサイトのURLをディープリンクで接続する**

が主に実装すべき事柄です。

# 実装１　Webmasterツールとgoogle play consoleでWebサイトとアプリを連携させるApp Indexing

此方は前々から合って、結構簡単に実装できます。
此方は公式ドキュメントを見ながらぽちぽちやればすぐです。

![googleより実装イメージ](https://developers.google.com/app-indexing/images/more-app-engagement.png "googleより実装イメージ")


## 手順１：アプリにApp IndexingさせたいURLでディープリンクを設定する。


## 手順２：下記に従ってwebとアプリを連携させる。

[参考：Google 検索での App Indexing](https://support.google.com/googleplay/android-developer/answer/6041489)

簡単です。ぶっちゃけディープリンクも要らないのでは....？
なしで実装してないですが、恐らく関連付けした時点で表示されているような気がします。

# 実装２　App Indexing API を利用してWebサイトのURLをディープリンクで接続する


此方はAPIが絡むので少々面倒。ですがそんなに難しくない。
此方も公式ドキュメントを読んで進めれば問題なし。

例えば、

## 前準備：アプリにどのWebページと関連付けるか考える。

```
http://sample.hoge.net/
```
というwebページとhoggame.sample.comというアプリを僕が持っているとします。

アプリのmainアクティビティが
Webのindexページと一緒です。なら、ここは紐付けます。

アプリのdetailアクティビティと
Webのdetailページが一緒です。ここも紐付けれます。

でも、アプリのcampaignアクティビティは
Webのどことも一緒じゃないので、ヒモ付は出来ません。
しかし、アプリのキャンペーンページ導線をWebに付ける。

という設定で、App Indexing APIを利用するとします。


## 手順１：アプリにディープリンクを設定

まずはこんな感じで

```
<activity android:name="hoggame.sample.com.mainActivity"
           android:label="@string/hogehoge" >
           
     <intent-filter>
         <action android:name="android.intent.action.VIEW" />
         <data android:scheme="http"
               android:host="sample.hoge.net"
               android:pathPrefix="/" />
         <category android:name="android.intent.category.DEFAULT" />
         <category android:name="android.intent.category.BROWSABLE" />
     </intent-filter>
 </activity>
 
 <activity android:name="hoggame.sample.com.detailActivity"
           android:label="@string/hogehoge" >
           
     <intent-filter>
         <action android:name="android.intent.action.VIEW" />
         <data android:scheme="http"
               android:host="sample.hoge.net"
               android:pathPrefix="/detail" />
         <category android:name="android.intent.category.DEFAULT" />
         <category android:name="android.intent.category.BROWSABLE" />
     </intent-filter>
 </activity>
 
 <activity android:name="hoggame.sample.com.campaignActivity"
           android:label="@string/hogehoge" >
           
     <intent-filter>
         <action android:name="android.intent.action.VIEW" />
         <data android:scheme="http"
               android:host="sample.hoge.net"
               android:pathPrefix="/app_campaign" />
         <category android:name="android.intent.category.DEFAULT" />
         <category android:name="android.intent.category.BROWSABLE" />
     </intent-filter>
 </activity>
```
こんな感じで設定したとしましょう。
ディープリンクの違う設定方法は公式ドキュメントをちら見して下さい。
この設定だけでもとりあえずディープリンクできます。

例えば、

```txt
//android-app://アプリID/scheme/host/pathPrefix

android-app://hoggame.sample.com/http/sample.hoge.net/
```

こんな感じのURLを
[ディープリンクテスト](https://developers.google.com/app-indexing/webmasters/test?hl=ja)
ここで叩くと、指定のアクティビティがURLで起動するかと思います。

##手順２：それぞれのアクティビティにAPIを仕込む。

https://developers.google.com/app-indexing/webmasters/appindexingapi?hl=ja
基本的にはここに忠実に再現すればOK

注意点はonStart()の部分。

```一部省略
Uri appUri1 = Uri.parse("android-app://hoggame.sample.com/http/sample.hoge.net/");
Uri webUrl1 = Uri.parse("http://sample.hoge.net/");

//公式はボタンだけど別にViewならボタンじゃなくてもいい
AppIndexingLink item1 = new AppIndexingLink(appUri1, webUrl1, this.findViewById(R.id.view));

List<AppIndexingLink> outlinks = new ArrayList<AppIndexingLink>();
outlinks.add(item1);

final String TITLE = "App Indexing API Title";

// タイトルの設定
AppIndex.AppIndexApi.view(mClient, this, APP_URI, TITLE, WEB_URL, outlinks);
```

ここは

```
http://sample.hoge.net/
```
というURLが叩かれたら

```
android-app://hoggame.sample.com/http/sample.hoge.net/

```
というディープリンクでアプリを引っ掛けますよ。と言う設定です。つまり、WebのindexページをAndroidが開こうとしたと検知した時に、開く候補にアプリを出す。というものです。
そこでアプリが選ばれればアプリが指定したアクティビティで開く。

という感じです。例えば、

```一部省略
Uri appUri1 = Uri.parse("android-app://hoggame.sample.com/http/sample.hoge.net/detail");
Uri webUrl1 = Uri.parse("http://sample.hoge.net/detail");

//公式はボタンだけど別にViewならボタンじゃなくてもいい
AppIndexingLink item1 = new AppIndexingLink(appUri1, webUrl1, this.findViewById(R.id.view));

List<AppIndexingLink> outlinks = new ArrayList<AppIndexingLink>();
outlinks.add(item1);

final String TITLE = "App Indexing API Title";

// タイトルの設定
AppIndex.AppIndexApi.view(mClient, this, APP_URI, TITLE, WEB_URL, outlinks);
```

というような感じに設定しておいて
```
http://sample.hoge.net/detail/123
```
というようなURLが叩かれてもアプリは拾うことが出来ますし、

onCreate()の中に

```
if (Intent.ACTION_VIEW.equals(intent.getAction())) {
    //暗黙的インテント経由で起動された時の処理（ディープリンクで起動したら）
    String uri = String.valueOf(intent.getData().getPath());
    String[] uriStrings = uri.split("/");
	//= uriStrings[0] > detail
	//= uriStrings[1] > 123
}
```
という記述をしておけば、アクティビティが立ち上がった後に、123というパラメータを取得できます。
また

```一部省略

final String TITLE = "App Indexing API Title";

// タイトルの設定
AppIndex.AppIndexApi.view(mClient, this, APP_URI, TITLE, WEB_URL, null);
```

こうしておけば反応するURLがなくなります。
ですが、Web上の何処かaタグで

```
android-app://hoggame.sample.com/http/sample.hoge.net/detail
```
を設定しておけばAndroidはアプリがなきゃgoogleplayを見に行かせるし、有ればアプリを立ち上げる挙動を行ってくれるので便利です。


それぞれタイトルが設定できるのですが、アプリをインデックスするときにそのタイトルを見てインデックスしているので、しっかり付けてあげましょう。

というか、グーグルがどうやったらきちんとAndroidアプリをクロールしてくれるのかよくわかってない...
えろいひと誰か教えてください('A`)

##App Indexing APIを実装する上でのルール

### ディープ リンクを開くと、その後何も操作せずに関連コンテンツが表示される（新しくインストールしたアプリでも、アプリが「First Click Free」を提供している）

割と重要なことなのに公式ドキュメントはpタグでさらっと書いてます。


#### ディープ リンクを開くと、その後何も操作せずに関連コンテンツが表示される

webとアプリを紐付けているので、
アプリで引っ掛けるURLを開いた時に、そのURLに対応したアクティビティが開かれるわけなんですが、

それが「アプリを開かずに遷移したWebページと同じコンテンツ」でなければいけないようです。
と言ってもそれを判断する方法が現状ないので大丈夫では有りますが、

グーグルが定めたルール的には宜しくないようです。

#### 「First Click Free」

というのは、所謂スプラッシュとか挟むんじゃねーぞ？って意味です。
そして、バックキーを押したらブラウザアプリに戻ってこれる状態の事を言います。

Androidアプリ製作者ならなんとなく察するかもしれませんが、
アクティビティを立ち上げた後に、バックキーで何か表示するようにしてたり、
ディープリンクでアクティビティを二枚立ち上げたりしない限り、

バックキー＞アクティビティ終了＞何も残らないのでアプリも終了

というステータスになりますが、それが正しい状態で、そこになにかはさもうものなら
Webmasterツールにエラーが起きてますと言われるようです。


それにしても、どうして公式ドキュメントはこうゆうことをよく読まないと分からない位置に配置するんでしょうか...（疑惑）

#App Indexingの今後

現在の仕様だと **Webサイトがないとアプリをしっかりクロールできない** ようです。
一応引っ掛けることは出来るようなのですが、どうも精度があまりよろしくない（ように感じる）。
しかし、将来的にアプリ単体でクロールできるようにするとの話なので、
前準備として実装するのはいいかもですね！

Webサイトを持たないアプリ的にはあまり意味を持たない機能であることは確かです。

ですが、それなら公式サイトを何でも適当に立ち上げればよい話ですよね。

そうすることでASO（SEO？）としての価値は高まる事間違いなし、ですね。


それでは、あぢゅー。