pixiv insideは移転しました! ≫ https://inside.pixiv.blog/

App Indexing のススメ

こちらは ピクシブ株式会社 Advent Calendar 2014 の12/15の記事です。


こんにちは。pixivのAndroidアプリ担当の @consomme72 です。

今回は、Googleのサービスである「App Indexing」についてご紹介します。

App Indexing とは?

2013年10月にGoogleが発表した、Googleで検索されたWebページのコンテンツと、アプリのコンテンツの紐付けを行うことができるサービスです。日本では2014年6月でも機能が公開され、pixivのアプリもローンチパートナーとして紹介されております。

Androidアプリでは、Manifestファイルにてhttpのリンクを受け取れるようにIntent-filterを設定しておけば、Webブラウザからリンクを開いた際にアプリを起動することができます。しかしその際に、ブラウザで開くかアプリで開くかのダイアログが表示されるため、ユーザーにとって無駄な選択を強いてしまうことになります。

App Indexingを使えば、Googleの検索結果に表示されたリンクからアプリケーション選択のダイアログを経由せずに、ワンタッチでアプリを起動してWebのコンテンツをアプリで見ることができます。

f:id:consomme72:20141215142828j:plain

詳しいことはGoogleのドキュメントに書かれていますので、そちらを参照してください。

実装方法

App Indexingを有効にするには、Web側とアプリ側の両方で機能を実装する必要があります。といっても特に難しいことはありません。Web側はHTMLのlink要素にalternateを使用してディープリンクを指定し、アプリ側はそれを受け取れるようにintent-filterを設定するだけです。

まずWeb側ですが、pixivでは以下のように要素を埋め込んでいます。これは「ラブライブ!」でイラストのタグ検索をした場合です。

<html>
<head>
  ...
<link rel="alternate" href="android-app://jp.pxv.android/pixiv/illusts/tag/%E3%83%A9%E3%83%96%E3%83%A9%E3%82%A4%E3%83%96%21" />
  ...
</head>
<body></body>

一方Androidアプリでは、Intentを受け取るため、AndroidManifest.xmlに以下のような記述を行います。

<activity android:name=".ReceiveActivity">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />

        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />

        <data android:scheme="pixiv" />
    </intent-filter>
</activity>

これで、ReceiveActivityでApp Indexingのリクエストを受け取る準備ができました。あとはこれを受け取るActivityにてよしなに処理すればOKです。pixivではイラストの他に小説などでもApp Indexingを使っているため、URIのHostで判別して処理を行うようにしています。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Uri uri = getIntent().getData();

    // 例に上げたURIの場合、Hostは "illusts" 、pathは "ラブライブ!" が取得できます
    // 文字列はエンコードされているのでデコードして使ってください(今回は省略)
    String host = uri.getHost();
    String path = uri.getPath();

    // 受け取ったintentのhost別に処理を行う
    switch (host) {
        case "illusts":
            searchIllust(path);
            break;
        case "novels":
        // 以下省略
    }

    // 以下省略
}

実装上の注意点

アプリ側でApp Indexingを実装するときは、いくつか注意しなければならない点があります。

First Click Free

ディープリンクからアプリを起動する場合、First Click Freeを守っていなければいけません。これは、コンテンツの表示を遮ることなく、ユーザーに直接、Webと同じコンテンツをアプリでも表示させなければならないという原則です。

つまり、アプリ起動時のスプラッシュ画面やログイン画面などを経由せずに、Webと同じコンテンツを直で閲覧できるようにする必要があります。これを対応していないと、コンテンツの不一致と判断されてリンクが登録されない可能性がありますので、注意してください。

これはアプリだけではなくWeb側にも言えます。ページを開いた時に何らかのダイアログ等がオーバーレイするような場合は、同様にコンテンツの不一致となる可能性があります。

戻るボタン

Androidには戻るボタンがあります。押せば前の画面に戻る、単純にして便利なボタンです。この動作にも注意です。

例えば、Google検索結果からApp Indexingでアプリを開いたあと、そのまま戻るボタンを押した場合、元のGoogle検索結果の画面に戻らなければいけません。アプリのホーム画面に遷移したりしてはいけないことに注意してください。

App Indexing API

Webページに直接ディープリンクを埋め込む以外にも、App Indexing APIを使って、GoogleにWebページとアプリを紐付けるリクエストを送ることができます。

App Indexingで開かせたい画面をアプリで開いた際に、それに紐づくディープリンクの情報をGoogleに送信することによって、検索インデックスの登録に反映させることができます。

また、Google検索アプリのオートコンプリートに登録することができ、Google設定アプリで端末内検索をオンにすることにより、ブラウザを開かずに直接アプリが起動できるようになります。

こちらの機能は、pixivアプリでも現在実装を進めており、近日中に公開する予定ですのでお待ちください。

f:id:consomme72:20141215144023p:plain

エンジニア募集!

pixivではスマートフォンアプリエンジニアを大募集しております。一緒にpixivを盛り上げていきましょう!

次回のAdvent Calendarは?

明日はdnskimoさんです。乞うご期待。