Edited at

App Invitesの仕組みを理解する

More than 3 years have passed since last update.


App Invitesとは

App Invitesとは、Google Play Services 8.1から登場した、メールやSMSで友人・知人を簡単に招待できる仕組みです。

Google Play Services 8.3と8.4でも少しずつ改良が加えられています。

例えば、今ショッピングアプリで見ている商品がとても良いので、誰かに共有したい!ついでに良い商品がたくさんあるアプリなのでアプリも一緒に紹介したい!と思った時に、このApp Invitesが導入されていれば、開発者が招待メールをカスタマイズすることができるので、端末内の連絡先から選んで、今表示している内容とアプリを一緒に共有することができます。

また、招待された人は招待メールに記載されているリンクからアプリをインストールすることで、インストール後すぐに、共有した内容をアプリのディープリンクでスムーズに閲覧することが可能になります。


フロー





画像はApp Invites for Androidから引用

公式には上記のようなフローが載っているのですが、日本語で書くとおそらくこんな感じだと思います。

画像だけだと少し分かりにくいので、サンプルを利用して、招待したときとされた時の流れを見ていきます。


招待するとき


  1. 連絡先を選択



  2. 右上のメール送信ボタンを押す


招待は、たったこれだけで完了です。


招待されたとき

招待メールに記載されているリンクは、アプリがインストールされているかどうかで挙動が変わります。


  1. 招待メールを開く




  2. メール内に記載されているリンクを開く(サンプルの場合は[Install Now!]ボタン)



    • アプリ未インストールの場合


      1. 自動でPlayストア画面に遷移

      2. ユーザーがアプリをインストールする

      3. ユーザーがアプリを起動する

      4. 自動でディープリンクが発動し、メールで共有された内容がアプリで表示される




    • アプリインストール済の場合


      1. 自動でアプリ起動

      2. 自動でディープリンクが発動し、メールで共有された内容がアプリで表示される






準備

App Invitesを使うためには、Google Servicesを有効にし、google-services.jsonをダウンロードしてアプリのプロジェクト内に配置する必要があります。

以下にその手順を記載します。


Androidの場合



  1. Enable Google services for your appにアクセスする

  2. アプリ名とパッケージ名を入力する


  3. App Invitesの設定画面で証明書のフィンガプリントを入力
    ターミナルでアプリのkeystoreに対して以下のコマンドを入力すると取得できます
    keytool -exportcert -alias aliasname -keystore debug.keystore -list -v


  4. App Invitesの値を取るためにGoogle Analyticsの設定もする



  5. CONTINUE TO Generate configuration filesをクリックする



  6. Download google-services.jsonからjsonファイルをダウンロードする


  7. google-services.jsonをアプリモジュールのルートディレクトリに配置する


iOSの場合 (2016/01/27 追記)

App Invitesを実装するAndroidアプリで、iOSアプリも提供している場合は、上記のAndroidアプリの場合と同じように以下のURLから同じ手順で設定すると、招待リンクをクリックした端末がiOSの場合は、自動的にApp Storeが開くようになります。

https://developers.google.com/mobile/add?platform=ios&cntapi=appinvite

iOSアプリでもアプリが入っている場合にDeep Linkを起動させたい場合は、当然ですがiOS側でも別途実装が必要になります。

iOS側の実装に関しては、以下のドキュメントを参照してください。


App Invites for iOS

https://developers.google.com/app-invites/ios/



実装

準備が終わったら、実際にコードを書いてみます。



  1. build.gradleに依存関係を追加する


    1. top-levelのbuild.gradleに依存関係を追加

      classpath 'com.google.gms:google-services:1.3.0-beta1'

    2. app-levelのbuild.gradleにプラグインを追加

      apply plugin: 'com.google.gms.google-services'

    3. アプリのbuild.gradleにGoogle Play Servicesへの依存関係を追加

      compile 'com.google.android.gms:play-services:8.4.0'




  2. AndroidManifest.xmlにGoogle Play Servicesのmeta-dataタグを入れる


    AndroidManifest.xml

    <meta-data
    
    android:name="com.google.android.gms.version"
    android:value="@integer/google_play_services_version" />




  3. App Invitesの招待メールから起動するディープリンクのActivityを作成


    AppInvitesActivity.java

    public class AppInvitesActivity extends AppCompatActivity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_app_invites);
    }

    @Override
    protected void onStart() {
    super.onStart();
    Intent intent = getIntent();
    // IntentにApp Invitesの情報が含まれているか調べる
    if (AppInviteReferral.hasReferral(intent)) {
    processReferralIntent(intent);
    }
    }

    // IntentからAppInvitesの情報を取得して処理する
    private void processReferralIntent(Intent intent) {
    // App Invitesの招待IDを取得
    String invitationId = AppInviteReferral.getInvitationId(intent);
    // ディープリンクに設定したURLを取得
    String deepLink = AppInviteReferral.getDeepLink(intent);
    Log.d(AppInvitesActivity.class.getName(), "Found Referral: " + invitationId + ":" + deepLink);
    // ディープリンクのURLに含まれるパラメータを使って何か処理したり。。
    }
    }





  4. AndroidManifest.xmlに先ほどのActivityでディープリンクを受け取れるようにする


    AndroidManifest.xml

    <activity android:name=".app.ui.AppInvitesActivity">
    
    <!-- [START deep_link_filter] -->
    <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:host="invites.syarihu.net" android:scheme="http"/>
    <data android:host="invites.syarihu.net" android:scheme="https"/>
    </intent-filter>
    <!-- [END deep_link_filter] -->
    </activity>





  5. App Invitesの招待状送信画面を起動する

    実際にApp Invitesを使って招待するためには、以下のようにIntentを発行して招待させたいところでこのIntentを起動します。

    setEmailHtmlContentにある%%APPINVITE_LINK_PLACEHOLDER%%はメールを送信するタイミングで自動で招待URLに置き換えられるので、これが無いとただメールを送るだけになってしまいます。これについての詳しい説明は後述します。

    private void onCustomInviteClicked() {
    
    Intent intent = new AppInviteInvitation.IntentBuilder("アクションバーのタイトル部分")
    .setMessage("メール本文の一番上の部分")
    .setDeepLink(Uri.parse(getString(R.string.invitation_deep_link)))
    .setGoogleAnalyticsTrackingId(GA_TRACKER_ID)
    .setEmailHtmlContent("<html><body>" +
    "<h1>App Invites</h1>" +
    "<a href=\"%%APPINVITE_LINK_PLACEHOLDER%%\">Install Now!</a>" +
    "<body></html>")
    .setEmailSubject("メールのタイトル")
    .build();
    startActivityForResult(intent, 0);
    }



  6. 送信後の処理

    送信後、必要があれば以下のようにして招待した結果をonActivityResultで受け取り、成功・失敗などによって処理を変えることができます。

    App Invitesはデフォルトで招待状の送信の成功・失敗・キャンセル時にSnackbarが出るようになっているため、カスタマイズする必要がなければ実装しなくても大丈夫です。

    @Override
    
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Log.d(TAG, "onActivityResult: requestCode=" + requestCode + ", resultCode=" + resultCode);

    if (requestCode == REQUEST_INVITE) {
    if (resultCode == RESULT_OK) {
    // 招待状を送信した相手ごとにユニークな招待IDを取得できる
    String[] ids = AppInviteInvitation.getInvitationIds(resultCode, data);
    } else {
    // 送信に失敗したかキャンセルされた場合の処理
    }
    }
    }




  7. アプリ起動時のActivityにApp Invitesの招待を受け取る処理を入れる


    MainActivity.java

    public class MainActivity extends AppCompatActivity implements
    
    GoogleApiClient.OnConnectionFailedListener {

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

    // App InvitesにアクセスするためのGoogle Api Clientを作成
    GoogleApiClient mGoogleApiClient = new GoogleApiClient.Builder(this)
    .addApi(AppInvite.API)
    .enableAutoManage(this, this)
    .build();

    // App Inviteの招待かどうかを確認し、そうだったらディープリンクのActivityを起動する
    // ActivityはAndroidManifest.xmlにディープリンクURLを受け取れるように記述する必要がある
    boolean autoLaunchDeepLink = true;
    AppInvite.AppInviteApi.getInvitation(mGoogleApiClient, this, autoLaunchDeepLink)
    .setResultCallback(
    new ResultCallback<AppInviteInvitationResult>() {
    @Override
    public void onResult(AppInviteInvitationResult result) {
    Log.d(TAG, "getInvitation:onResult:" + result.getStatus());
    // autoLaunchDeepLink = true ではなくfalseの場合は、
    // ここに自分でディープリンクを受け取ってActivityを起動する処理を書く
    }
    });
    }

    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
    Log.d(TAG, "onConnectionFailed:" + connectionResult);
    }
    }





仕組み

App Invitesがどういう仕組みなのか、実装するにあたって知っておく必要があると思ったので、少し調べてみました。

これは公式のドキュメントに載っていなかったので、自分で調べてみた結果の推測です。


送信側


  1. メール・SMSの送信前に招待IDを発行

  2. 招待IDを元に招待URLを生成し、%%APPINVITE_LINK_PLACEHOLDER%%をその招待URLに置き換える(こんな感じのURL: https://plus.google.com/appinvite/xxxxxxxxxxxx-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx )

  3. 招待URLを含めたメール・SMSを送信


受信側


  1. 招待された人が招待メール・SMSに記載されている招待URLを開く

  2. 招待URLの後ろに招待IDがついているので、それに紐付いているディープリンクURLやアプリのパッケージ名などを取得

  3. 取得したパッケージ名のアプリが端末内に入っているかどうかを確認


    • アプリが入っていない場合


      1. 招待IDやディープリンクURLをパラメータに含めたPlayストアのURLを開く(Android端末では自動的にPlayストアアプリが開く)

      2. アプリをインストールする(おそらくこの時点で招待情報が端末のどこかに保持される)

      3. ユーザーがアプリを起動する



    • アプリが入っている場合


      1. 招待IDやディープリンクURLを含めたIntentを発行する

      2. アプリを起動する






App Invitesのデータを取得するためのGoogle Analyticsの設定



  1. アナリティクス設定->プロパティ->カスタム定義->カスタムディメンション->新しいカスタムディメンション
    から、以下のようにディメンションを追加する。
    このディメンションは、カスタムディメンションの表のインデックス1でなければならないことに注意してください。


  2. 定義済みのApp Invites dashboardをダウンロードし、 対象のTrackingID->すべてのモバイルアプリのデータを選択する


  3. 選択したら好みの名前をつけて、作成をクリックする

  4. App Invitesのレポートは左のナビゲーションパネルからマイレポート一覧->非公開->App Invites(先ほどつけた名前)を選択することで確認することができる


Google AnalyticsはすぐにApp Invitesデータの受信を始めるが、Google Analyticsが表示を行うのに必要なデータを得るまで1〜2日かかるため、最初は空のデータとなります。


終わりに

App Invitesは仕組みが少し複雑ですが、それほど手間をかけずにアプリ招待の機能を実装できるので、ユーザーを増やすためのひとつの機能として有効だと思います。

どれほど効果が出るかは実際に実装して検証してみないことにはなんとも言えませんが、これを実装しているアプリは現状少なそう(今のところGoogle Santa Trackerしか見たこと無い)ですし、新しい技術なので試しに実装してみるのも良いかもしれませんね。

以上、おつかれさまでした。