AppIndexingについて

# AppIndexingとは
AppIndexingとは、ウェブページURLやキーワードとアプリの特定画面へのディープリンクを紐付け、Google検索結果から直接アプリの特定画面を起動させるための仕組みです。
現在はウェブサイトにアプリ用ディープリンクを埋め込む方法(狭義のAppIndexing)と、アプリ側で特定のキーワードとアプリ用ディープリンクを埋め込む方法(AppIndexingApi)の二種類が提供されています。

https://developers.google.com/app-indexing/?hl=ja

実際の動作については以下の記事がわかりやすくまとめられています。

[App Indexing のススメ - pixiv engineering blog](http://inside.pixiv.net/entry/2014/12/15/152113)


# ディープリンクについて
ディープリンクとは、アプリのあるコンテンツについて直接アクセスするためのリンクのことです。
AndroidアプリにおいてはAndroidManifest.xml`内に<data>`を指定する形で記述された`<intent-filter>`の実装と、その`<data>`で定義されたURIを指します。
http://example.com/gizmos?1234 のようなhttpスキームやexample://gizmos?1234のような独自のスキームを定義したものが利用できます。

## アプリへのディープリンク追加

AppIndexing、AppIndexingApiともにアプリにディープリンクを追加しておく必要があります。
Androidアプリにディープリンクを指定する方法は次の通りです。

1. AndroidManifest.xmlで対象Activityに`<intent-filter>`要素を追加します。
2. ACTION_VIEWを指定する`<action>`を`<intent-filter>`に追加します。
3. 受け付けるディープリンクの仕様に従って`<data>`を`<intent-filter>`に追加します。
4. BROWSABLEを指定する`<category>`を`<intent-filter>`に追加します。
5. DEFAULTを指定する`<category>`を`<intent-filter>`に追加します。(任意)

上記のうち、DEFAULTカテゴリの指定のみ任意となります。
DEFAULTカテゴリを指定しなかった場合、Google検索結果からアプリへのディープリンクを起動することはできますが、Google検索結果以外のページから対象ウェブページへリンクした際にアプリへのディープリンクを起動することができなくなります。

https://developers.google.com/app-indexing/webmasters/app?hl=ja


例として、`http://example.com/gizmos`で始まるディープリンクで起動するアクティビティを設定する場合、以下のように記述します。

```xml
<activity android:name="com.example.android.GizmosActivity"
           android:label="@string/title_gizmos" >
     <intent-filter android:label="@string/filter_title_viewgizmos">
         <action android:name="android.intent.action.VIEW" />
         <!-- Accepts URIs that begin with "http://example.com/gizmos” -->
         <data android:scheme="http"
               android:host="example.com"
               android:pathPrefix="/gizmos" />
         <category android:name="android.intent.category.DEFAULT" />
         <category android:name="android.intent.category.BROWSABLE" />
     </intent-filter>
 </activity>
```

## 注意点
アプリへディープリンクを追加する際、いくつかの注意点があります。

### First Click Freeに従う
First Click Freeとは、2008年に制定されたGoogleのウェブインデックスポリシーのことです。
名前の通り、Google検索から最初のクリックで遷移したページは登録・購読不要で閲覧可能とすることで会員制ページもウェブインデックスに含まれるようになっています。
http://web-tan.forum.impressrd.jp/e/2008/10/28/4293

ディープリンクによってアプリが起動される場合、このFirst Click Freeに従う必要があります。
すなわち、ディープリンクによってアプリが起動される場合、ウェブページと同じコンテンツを直接ユーザーに表示しなければいけません。
以下のような挙動はFirst Click Freeに違反しています。

- コンテンツの表示を遮るプロンプトを表示する
- スプラッシュ画面を表示する
- ログイン画面を表示する
- インタースティシャルページ(ページ遷移の際に経由させる画面)を表示する

http://googlewebmastercentral.blogspot.jp/2008/10/first-click-free-for-web-search.html

### 戻る動作
ディープリンクによってアプリが起動された画面から「戻る」が押された場合、遷移元(通常は検索結果)のページに戻る必要があります。
また、戻る際にアプリ内の他のコンテンツや確認のプロンプトが表示されることのないようにします。


# AppIndexing
AppIndexingはサーバ側の設定によりウェブサイトとディープリンクの紐付けを行う方法です。
本来AppIndexingはAppIndexingApiも含んだアプリのディープリンク提供サービスを指しますが、以前はこの方法しか提供されていなかったため、単にこの方法のみを指してAppIndexingと呼ぶ場合もあります。

https://developers.google.com/app-indexing/webmasters/server?hl=ja

## Playコンソールのウェブサイトを確認する

Playコンソール上のウェブサイトが確認済みである必要があります。
(ウェブサイトが複数存在する場合、すべて確認済みである必要があります)

https://support.google.com/googleplay/android-developer/answer/6041489


## ウェブサイトへのディープリンク追加
ウェブサイトへのディープリンク追加方法は2種類提供されています。
いずれの場合でもディープリンクを指定するためのアプリURIは以下のフォーマットに従う必要があります。

```
android-app://{package_id}/{scheme}/{host_path}
```

- package_id: アプリのパッケージID
- scheme: アプリに渡すディープリンクのスキーム
- host_path: アプリに渡すディープリンクのパス

パッケージIDが` com.example.android`の場合、以下のような設定が可能です。

|ディープリンク|アプリURI|
|----|----|
|http://example.com/gizmos?1234|android-app://com.example.android/http/example.com/gizmos?1234|
|http://example.com/gizmos/1234|android-app://com.example.android/http/example.com/gizmos/1234|
|http://example.com/gizmos/toys/1234|android-app://com.example.android/http/example.com/gizmos/toys/1234|
|example://gizmos?1234|android-app://com.example.android/example/gizmos?1234|
|example://gizmos/1234|android-app://com.example.android/example/gizmos/1234|
|example://gizmos/toys/1234|android-app://com.example.android/example/gizmos/toys/1234|

アプリURIをテストするためにディープリンクテストツールが提供されています。

このツールを使用するとアプリURI

https://developers.google.com/app-indexing/webmasters/test?hl=ja

### 各ページに実装
ディープリンクの追加を行うページの`<head>`セクションに`<link>`要素を追加することで、ウェブページとアプリへのディープリンクを紐付けることができます。

```html
<html>
<head>
  ...
  <link rel="alternate" href="android-app://com.example.android/http/example.com/gizmos" />
  ...
</head>
<body> … </body>
```

### サイトマップに実装
ウェブサイトのXMLサイトマップに`<link>`要素を追加することで、ウェブページとアプリへのディープリンクを紐付けることができます。

```xml
<?xml version="1.0" encoding="UTF-8" ?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
 xmlns:xhtml="http://www.w3.org/1999/xhtml">
<url>
  <loc>http://example.com/gizmos</loc>
  <xhtml:link rel="alternate" href="android-app://com.example.android/example/gizmos" />
</url>
...
</urlset>
```

# AppIndexingApi
AppIndexingApiを利用するとアプリが実装しているディープリンクを直接Googleに通知することができます。
これにより、Google検索アプリ（バージョン3.6以降）のキーワードコンプリートで特定キーワードからアプリへのディープリンクを表示できる他、ウェブページURLを指定することでGoogle 検索結果に表示されるようになります。

AppIndexingApiとAppIndexingの大きな違いは、ウェブページURLとの紐付けではなくタイトル(キーワード)との紐付け機能であることです。
ウェブサイトの都合で一意のURLを生成できないような場合やウェブサイトのないサービスにも導入することができます。
また、検索キーワードを入力する際のキーワードコンプリートとして表示されるため、ブラウザを経由することなく直接アプリが起動されるようになります。

https://developers.google.com/app-indexing/webmasters/appindexingapi?hl=ja


# まとめ
よくある疑問まとめ
AppIndexingページのFAQも参照してください。

https://developers.google.com/app-indexing/faq?hl=ja

## AppIndexingとAppIndexingApiのどちらを実装すれば良いか
AppIndexingとAppIndexingApiはそれぞれ以下のような特徴があります。

- AppIndexing
→ Googleが階層を自動でクロールしてくれるのでページ数が多くても浸透に時間がかからない

- AppIndexingApi
→ 対象画面それぞれについて一度画面を表示しないとAPIが送信されないので浸透まで時間がかかる
→ URLなしでも登録可能(Google検索アプリのキーワードオートコンプリートで利用できる)

多数のWebページと紐付ける場合はAppIndexingのほうが有利そうですが、AppIndexingApiにはキーワードとの紐付けが可能というメリットがあります。
AppIndexingとAppIndexingApiはお互いに検索結果、検索アプリで補いあうことができるため、できれば両方実装するのが良いでしょう。

## 戻る動作の実装が難しい
スプラッシュや`launchMode`などの不要な設定を排して単純にActivityが起動するようにすれば自然に戻るはずです。

## 正しく設定しているはずなのに動作しない
チェックリストを参照してください。
ウェブページからディープリンクを起動する場合、検索結果にインデックスされるまで時間がかかる場合があります。

https://developers.google.com/app-indexing/webmasters/checklist?hl=ja

## 勝手にAppIndexingみたいな挙動になってる
アプリのディープリンクスキームがhttpの場合で、ウェブサイトがPlayコンソールで確認済み、かつウェブサービスのコンテンツページURLとアプリのディープリンクURIが完全に同一の場合、Googleのウェブインデックスで紐付けが行われ、AppIndexingと同じ挙動になります。
…というよりも、この挙動をカスタムスキームで行えるようにしたのがAppIndexing/AppIndexingApiです。
ただし現在はhttpスキームを利用する場合でも明示的にディープリンクの紐付けを行うことが推奨されています。

https://developers.google.com/app-indexing/webmasters/connect?hl=ja