Upgrade to Pro — share decks privately, control downloads, hide ads and more …

[DroidKaigi 2017] Function Introduction of Google Play Services

Da5a59469ce3ebb55619ce34f85f8c4f?s=47 syarihu
March 08, 2017

[DroidKaigi 2017] Function Introduction of Google Play Services

「Function Introduction of Google Play Services」の発表資料です。

Da5a59469ce3ebb55619ce34f85f8c4f?s=128

syarihu

March 08, 2017
Tweet

Transcript

  1. Function Introduction of Google Play Services DroidKaigi 2017 2017/03/09 (Thu.)

    Taichi Sato (@syarihu)
  2. 対象者 • Androidアプリ開発をある程度やったこと のある人 • Google Sign-In APIに興味がある人 • ASOが気になる人

    • App Invitesに興味がある人
  3. 話すこと 1. Google Sign-In API 2. Google Plus One Button

    3. App Invites for Android
  4. 自己紹介

  5. Taichi Sato (@syarihu) • GMO Media, inc. • エンジニア ◦

    Androidアプリ ◦ サーバーサイドアプリ (Java)
  6. Point Town

  7. Google Sign-In API

  8. 以前のGoogle Sign-In • アカウント選択画面 AccountManager.newChooseAccountIntent • 自分でIntent投げて、返ってきたら色々やって …

  9. 以前のGoogle Sign-In • AuthTokenの取得 ( AccountManager#getAuthToken ) ◦ 認証状態の確認 ◦

    認証されてなかったら認証許可ダイアログを表示 ◦ 認証されてたらAuthTokenを取得 ◦ 認証許可が外れてたら再取得も自分で…
  10. 以前のGoogle Sign-In • アカウントの選択でつかうメソッド AccountManager.newChooseAccountIntent( Account selectedAccount, ArrayList<Account> allowableAccounts, String[]

    allowableAccountTypes, boolean alwaysPromptForAccount, String descriptionOverrideText, String addAccountAuthTokenType, String[] addAccountRequiredFeatures, Bundle addAccountOptions)
  11. 以前のGoogle Sign-In • AuthTokenの取得でつかうメソッド AccountManager#getAuthToken( Account account, String authTokenType, Bundle

    options, boolean notifyAuthFailure, AccountManagerCallBack<Bundle> callback, Handler handler)
  12. 新しい Google Sign-In API • Google Play Services 8.3をリリースした 際、その新機能の一つとして新しい

    Google Sign-In APIが公開された
  13. 新しい Google Sign-In API • Google Sign-InをAndroidで実装するた めには以前は実装がとても面倒だった

  14. 新しい Google Sign-In API • Google Sign-InをAndroidで実装するた めには以前は実装がとても面倒だった • これが簡単に実装できるようになったの

    が新しいGoogle Sign-In API
  15. 新しい Google Sign-In API • アカウントを取得してサインインするのに権 限が必要ない

  16. 新しい Google Sign-In API • アカウントを取得してサインインするのに権 限が必要ない • 新しくデザインされたサインインボタン

  17. 新しい Google Sign-In API • アカウントを取得してサインインするのに権 限が必要ない • 新しくデザインされたサインインボタン •

    実装も以前より簡単
  18. 新しい Google Sign-In API • アカウントを取得してサインインするのに権 限が必要ない • 新しくデザインされたサインインボタン •

    実装も以前より簡単 • Silent Sign-In
  19. サンプルアプリ

  20. 1. ログインボタンを押す

  21. 2. アカウントを選択する

  22. 3. 権限を許可する

  23. 4. サインイン完了

  24. 4. サインイン情報を利用して何かする

  25. 4. サインイン情報を利用して何かする

  26. 5. サインアウトする

  27. 5. サインアウトする

  28. Silent Sign-In • ユーザーが以前に別のプラットフォーム 上のアプリに権限を許可している場合、 Silent Sign-Inを使用することができる

  29. Silent Sign-In • プロジェクトのクライアントが要件を満た すように構成されている場合、 ユーザーはすぐにアプリケーションに サインインすることができる

  30. Silent Sign-Inの要件 • OAuth 2.0クライアントIDは、 同じGoogle Developer Consoleプロジェクト でなければならない •

    OAuthのスコープは、両方のクライアントで 同じでなければならない
  31. • OAuth 2.0クライアントIDは、 同じGoogle Developer Consoleプロジェクトで なければならない • OAuthのスコープは、両方のクライアントで同じ でなければならない

    要するにこうなっていれば
  32. 新たに許可する必要が無い

  33. 多言語対応 • com.google.android.gms.common. SignInButtonは、ローカライズされた文字 列を提供しており、これらは自動的に使 用可能となる

  34. 多言語対応 • どの言語に対応しているかなどを確認するた めにはSDKの以下のディレクトリから確認する ことができる <android-sdk-folder>/extras/google/ google_play_services/libproject/goo gle-play-services_lib/res/

  35. Google Sign-In APIの実装

  36. Google Sign-Inを使うための前提条件 • Google Play Storeを含むAndroid 2.3以上 • または、Android 4.2.2以降のGoogle

    API プラットフォームを実行する、Google Play Servicesのバージョン9.8.0以降を含むAVD
  37. 前準備 1. 設定ファイルの取得、配置 2. build.gradleに追加

  38. 設定ファイルの取得 • 設定ファイルには、サービス固有の情報が 記述されている • Google API Consoleから既存のプロジェ クトを選択するか、新しいプロジェクトを作 成する必要がある

  39. 設定ファイルの取得 • アプリのパッケージ名と署名証明書の SHA-1ハッシュも必要

  40. 設定ファイルの取得 • Google Developer Consoleにプロジェクト が既にある場合は、以下のページから google-services.jsonを取得できる https://developers.google.com/mobile/a dd?platform=android

  41. None
  42. 設定ファイルの取得 • 追加したいプロジェクトがFirebaseの場合 は、Firebase Consoleから google-services.jsonを取得できる https://console.firebase.google.com/

  43. None
  44. 設定ファイルの配置 • ダウンロードしたgoogle-services.jsonをプ ロジェクトのappディレクトリ配下に配置する

  45. build.gradleに追加 • プロジェクトのbuild.gradleに以下を追記 classpath 'com.google.gms:google-services:3.0.0'

  46. build.gradleに追加 • appのbuild.gradleに以下を追記 compile 'com.google.android.gms: play-services-auth:10.2.0'

  47. build.gradleに追加 • appのbuild.gradleの一番下に以下を追記 apply plugin: 'com.google.gms.google-services'

  48. Google Sign-In APIの実装 • GoogleSignInOptions オブジェクトを作成 • GoogleApiClient オブジェクトを作成 •

    Google サインインボタンを追加する • サインイン処理の実装 • サインアウト処理の実装
  49. GoogleSignInOptions gso = new GoogleSignInOptions.Builder( GoogleSignInOptions.DEFAULT_SIGN_IN ) .requestEmail() .build();  GoogleSignInOptions

    オブジェクトを作成
  50. GoogleSignInOptions gso = new GoogleSignInOptions.Builder( GoogleSignInOptions.DEFAULT_SIGN_IN ) .requestEmail() .build();  GoogleSignInOptions

    オブジェクトを作成
  51. GoogleSignInOptions gso = new GoogleSignInOptions.Builder( GoogleSignInOptions.DEFAULT_SIGN_IN ) .requestEmail() .build();  GoogleSignInOptions

    オブジェクトを作成
  52. mScope = new Scope( "https://www.googleapis.com/auth/urls hortener");  GoogleSignInOptions オブジェクトを作成

  53. GoogleSignInOptions gso = new GoogleSignInOptions.Builder( GoogleSignInOptions.DEFAULT_SIGN_IN ) .requestScopes(mScope) .requestEmail() .build();

     GoogleSignInOptions オブジェクトを作成
  54. GoogleSignInOptions gso = new GoogleSignInOptions.Builder( GoogleSignInOptions.DEFAULT_SIGN_IN ) .requestScopes(mScope) .requestEmail() .build();

     GoogleSignInOptions オブジェクトを作成
  55. mGoogleApiClient = new GoogleApiClient.Builder(this) .enableAutoManage( this /* FragmentActivity */, this

    /* OnConnectionFailedListener */) .addApi(Auth.GOOGLE_SIGN_IN_API, gso) .build(); mGoogleApiClient.connect();  GoogleApiClient オブジェクトを作成
  56. <com.google.android.gms.common.SignInButton android:id="@+id/sign_in_button" android:layout_width="wrap_content" android:layout_height="wrap_content"/>  Googleサインインボタンの追加

  57. Intent signInIntent = Auth.GoogleSignInApi .getSignInIntent(mGoogleApiClient); startActivityForResult( signInIntent, RC_SIGN_IN );  サインイン処理の実装

  58. Intent signInIntent = Auth.GoogleSignInApi .getSignInIntent(mGoogleApiClient); startActivityForResult( signInIntent, RC_SIGN_IN );  サインイン処理の実装

  59. @Override public void onActivityResult( int requestCode,int resultCode, Intent data) {

    super.onActivityResult(requestCode, resultCode, data); /** GoogleSignInResult */ }  サインイン処理の実装
  60. if (requestCode == RC_SIGN_IN) { GoogleSignInResult result = Auth.GoogleSignInApi .getSignInResultFromIntent(data);

    handleSignInResult(result); }  サインイン処理の実装
  61. if (requestCode == RC_SIGN_IN) { GoogleSignInResult result = Auth.GoogleSignInApi .getSignInResultFromIntent(data);

    handleSignInResult(result); }  サインイン処理の実装
  62. private void handleSignInResult( GoogleSignInResult result) { if (result.isSuccess()) { mGoogleSignInAccount

    = result .getSignInAccount(); showMessage(result.getSignInAccount() .getEmail()); } }  サインイン処理の実装
  63. private void handleSignInResult( GoogleSignInResult result) { if (result.isSuccess()) { mGoogleSignInAccount

    = result .getSignInAccount(); showMessage(result.getSignInAccount() .getEmail()); } }  サインイン処理の実装
  64. private void handleSignInResult( GoogleSignInResult result) { if (result.isSuccess()) { mGoogleSignInAccount

    = result .getSignInAccount(); showMessage(result.getSignInAccount() .getEmail()); } }  サインイン処理の実装
  65. Auth.GoogleSignInApi .signOut(mGoogleApiClient) .setResultCallback( // new ResultCallback );  サインアウト処理の実装

  66. Auth.GoogleSignInApi .signOut(mGoogleApiClient) .setResultCallback( // new ResultCallback );  サインアウト処理の実装

  67. new ResultCallback<Status>() { @Override public void onResult(Status status) { //

    サインアウト後の処理 } });  サインアウト処理の実装
  68. Auth.GoogleSignInApi .revokeAccess(mGoogleApiClient) .setResultCallback( // new ResultCallback );  権限の取り消し

  69. Auth.GoogleSignInApi .revokeAccess(mGoogleApiClient) .setResultCallback( // new ResultCallback );  権限の取り消し

  70. new ResultCallback<Status>() { @Override public void onResult(Status status) { signOut();

    } });  権限の取り消し
  71. • status.getStatusCode()でStatusCodeを 取得できる • GoogleSignInStatusCodesについては以下 を参照 https://developers.google.com/android/reference/ com/google/android/gms/auth/api/signin/GoogleSig nInStatusCodes  GoogleSignInStatusCodes

  72. AuthTokenの取得 • AccountManagerでOAuth2認証してい たときには AccountManager#getAuthTokenを 使用してAuthTokenを取得していた

  73. AuthTokenの取得 • GoogleSignInAccountにはそのような メソッドは用意されていないため、 GoogleAuthUtil.getTokenを使って AuthTokenを取得する

  74. AuthTokenの取得 • AuthTokenが取得できたら、あとは以前と 同じようにAPIにリクエストを投げるときにこ のAuthTokenをaccess_tokenパラメータ として渡してあげることで、APIを利用するこ とがでできる

  75. GoogleAuthUtil.getToken(context, new Account( mGoogleSignInAccount.getEmail(), ACCOUNT_TYPE), "oauth2:" + SHORTENER_SCOPE );  AuthTokenの取得

  76. • SHORTENER_SCOPE “https://www.googleapis.com/auth/ urlshortener” • ACCOUNT_TYPE “com.google”  AuthTokenの取得

  77. Slient Sign-In • すでに権限を許可済の場合は、Silent Sign-Inを利用してサインインを行うこと ができる

  78. @Override public void onResume() { super.onResume(); OptionalPendingResult<GoogleSignInResult> opr = Auth.GoogleSignInApi

    .silentSignIn(mGoogleApiClient); }  Silent Sign-In
  79. @Override public void onResume() { super.onResume(); OptionalPendingResult<GoogleSignInResult> opr = Auth.GoogleSignInApi

    .silentSignIn(mGoogleApiClient); }  Silent Sign-In
  80. if (opr.isDone()) { GoogleSignInResult result = opr.get(); handleSignInResult(result); }  Silent

    Sign-In 成功時
  81. サンプルコード • syarihu/GoogleSignInTest: New Google Sign-In API Sample https://github.com/syarihu/GoogleSignI nTest

  82. Qiita • Androidの新しいGoogleサインインAPIにつ いて - Qiita http://qiita.com/syarihu/items/1c67816 ad926f08d76d8

  83. Google Plus One Button

  84. Google Plus One Buttonとは? • ユーザーが気に入ったコンテンツを Google検索でおすすめしたり、 Google+で共有したりできる機能

  85. Google Plus One Buttonとは? • 押すと数字が増える • Facebookで言う「いいね!」の ようなもの

  86. Google Plus One Buttonとは? • Google Playストア上にはこのボタンは存 在しない

  87. Google+1はASOに影響があるのか • ASOのことを調べていたら、 Google+1数は検索順位に影響するとい うような記事をちらほら見かけた • 本当に上がるのか気になったので、 実際に検証してみた

  88. やったこと

  89. やったこと • アプリ初回起動後、3日以上経過してい たら「+1で応援お願いします!」のような ダイアログを表示する

  90. やったこと • アプリ初回起動後、3日以上経過してい たら「+1で応援お願いします!」のような ダイアログを表示する

  91. やったこと • アプリ初回起動後、3日以上経過してい たら「+1で応援お願いします!」のような ダイアログを表示する

  92. None
  93. None
  94. None
  95. None
  96. 実装方法

  97. build.gradleのdependenciesに追加 dependencies { compile "com.google.android.gms: play-services-plus:10.2.0" }

  98. <com.google.android.gms.plus.PlusOneButton xmlns:plus="http://schemas.android.com/ apk/lib.com.google.android.gms.plus" android:id="@+id/plus_one_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_margin="8dp" plus:annotation="inline" plus:size="medium"/>

    Google+1ボタンをxmlに追加
  99. PlusOneButton button = (PlusOneButton) findViewById( R.id.plus_one_button ); ActivityのonResumeで初期化

  100. private static final REQUEST_CODE_PLUS_ONE = 0; // +1ボタンの初期化 button.initialize("https://play.google. com/store/apps/details?id=パッケージ名",

    REQUEST_CODE_PLUS_ONE); ActivityのonResumeで初期化
  101. implements PlusOneButton .OnPlusOneClickListener { クリック時に何かしたいとき

  102. // +1ボタンの初期化 button.initialize("https://play.google. com/store/apps/details?id=パッケージ名", this /** OnPlusOneClickListener */); クリック時に何かしたいとき

  103. @Override public void onPlusOneClick(Intent intent) { // PlusOneのActivityを起動する startActivityForResult(     intent,

        PLUS_ONE_BUTTON   ); } クリック時に何かしたいとき
  104. Google+1数の変化 • リリースしてから

  105. Google+1数の変化 • リリースしてから ◦ 1ヶ月後 … 約2倍増加

  106. Google+1数の変化 • リリースしてから ◦ 1ヶ月後 … 約2倍増加 ◦ 1年後  …

    約6倍増加
  107. クリックイベント

  108. 無料トップ総合順位

  109. カテゴリ順位

  110. 検索順位

  111. 結果 • 総合順位、カテゴリ順位には大きく 影響する • 一時的には上昇するが、その状態を 保てるわけではなく、徐々に下がっていく

  112. 結果 • 検索順位には多少影響する • こちらは一度上がったあとはあまり下が らない • 総合順位、カテゴリ順位よりも結果がすぐ には出にくい

  113. 結果 • +1数が順位を決めるためのひとつの 要素であることは分かった • 総合順位、カテゴリ順位は常に変動して いるため、上位を保つためには+1 以外の要素が必要

  114. 結果 • 実装が手軽で長期的に見て上がる可能 性があるため、余裕があれば実装すべき

  115. App Invites for Android

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

  117. • Google Play Services 8.1から登場した、 メールやSMSで友人・知人を簡単に招待 できる仕組み • 開発者が招待メールをカスタマイズする ことができる

    App Invites とは
  118. • メールの招待リンクからアプリをインス トールすると、メールで共有された内容を ディープリンクでスムーズに アプリを開くことができる App Invites とは

  119. • 現在はFirebase Invitesという名前になっ ているが、機能自体はFirebase Invites になる前とほぼ同じ App Invites とは

  120. Firebase Invitesとの違い • play-services-appinviteに依存している • 利用するクラスのパッケージ名は com.google.android.gms.appinvite となっている

  121. Firebase Invitesとの違い • アプリインストール用に生成されるリンク はFirebase InvitesになってからFirebase Dynamic Linksのリンクが生成されるよう になった

  122. Firebase Invitesとの違い • 以前: https://plus.google.com/appinvites/xxxx xxxxx-xxxxxxxx-xxxxxxxxxxx

  123. Firebase Invitesとの違い • 以前: https://plus.google.com/appinvites/xxxx xxxxx-xxxxxxxx-xxxxxxxxxxx • 今: https://xxxxx.app.goo.gl/xxxxxxxxx-xxxx xxxx-xxxxxxxxxxx

  124. Google Santa Tracker

  125. 招待する側

  126. 【招待する側】ゲームで遊ぶ

  127. 【招待する側】ゲームで遊ぶ このゲーム面白い!

  128. 【招待する側】ゲームで遊ぶ このゲーム面白い! 誰かに共有したい!

  129. 【招待する側】共有ボタンを押す

  130. 【招待する側】共有ボタンを押す

  131. 【招待する側】App Invites 招待画面

  132. 【招待する側】App Invites 招待画面 連絡先を選択して

  133. 【招待する側】App Invites 招待画面 送信ボタンを押すだけ 連絡先を選択して

  134. 【招待する側】App Invites 招待画面

  135. 【招待する側】メール送信完了 送信完了!

  136. 招待される側

  137. 【招待される側】メール受信 あ、なんか友だちから メールきた

  138. 【招待される側】メール受信 面白そうだから インストールしてみよ

  139. 【招待される側】メール受信 面白そうだから インストールしてみよ

  140. 【招待される側】アプリのインストール

  141. 【招待される側】アプリの起動

  142. 【招待される側】アプリの起動 アプリ起動後、 ディープリンクが発動して 共有されたゲームを すぐに遊べる!

  143. App Invites フロー

  144.  招待するとき 招待状を送信 メール or SMS 招待状を受信

  145.  招待されたとき(アプリ未インストール時) アプリ インストール アプリを開く ディープリンク 発動!

  146.  招待されたとき(アプリインストール済) アプリを開く ディープリンク 発動!

  147. App Invitesの実装

  148. 前準備 1. Firebase Dynamic Linksの有効化 2. 設定ファイルの取得、配置 3. build.gradleに追加

  149. Firebase Dynamic Linksの有効化 • App Invitesで招待する際に生成される共有 リンクはFirebase Dynamic Linksを利用して いる

  150. Firebase Dynamic Linksの有効化 • そのため、Firebase Dynamic Linksを有効 にしていない場合は、Firebase Consoleから [Dynamic

    Links] セクションを開き、表示され る利用規約に同意して、有効にする
  151. 設定ファイルの取得 • Firebase Consoleから google-services.jsonを取得する https://console.firebase.google.com/

  152. None
  153. 設定ファイルの配置 • ダウンロードしたgoogle-services.jsonをプ ロジェクトのappディレクトリ配下に配置する

  154. build.gradleに追加 • プロジェクトのbuild.gradleに以下を追記 classpath 'com.google.gms:google-services:3.0.0'

  155. build.gradleに追加 • appのbuild.gradleに以下を追記 compile 'com.google.firebase: firebase-core:10.2.0' compile 'com.google.firebase: firebase-invites:10.2.0'

  156. build.gradleに追加 • appのbuild.gradleの一番下に以下を追記 apply plugin: 'com.google.gms.google-services'

  157. App Invitesの実装 • ディープリンク用のActivityを作成 • App Invitesの招待状送信画面を起動する • アプリ起動時のActivityでApp Invitesを

    受け入れる
  158.  ディープリンク用のActivityを作成 public class AppInvitesActivity extends AppCompatActivity { @Override protected void

    onStart() { super.onStart(); Intent intent = getIntent(); // IntentにApp Invitesの情報が含まれているか調べる if (AppInviteReferral.hasReferral(intent)) { processReferralIntent(intent); } }
  159.  ディープリンク用のActivityを作成 public class AppInvitesActivity extends AppCompatActivity { @Override protected void

    onStart() { super.onStart(); Intent intent = getIntent(); // IntentにApp Invitesの情報が含まれているか調べる if (AppInviteReferral.hasReferral(intent)) { processReferralIntent(intent); } }
  160.  ディープリンク用のActivityを作成 private void processReferralIntent(Intent intent) { // 招待ID取得 String invitationId

    = AppInviteReferral.getInvitationId(intent); // ディープリンク用URL取得 String deepLink = AppInviteReferral.getDeepLink(intent); // ディープリンクのURLに含まれるパラメータを使って // 何か処理したりする
  161.  ディープリンク用のActivityを作成 <activity android:name= ".app.ui.AppInvitesActivity"> <!-- [START deep_link_filter] --> <intent-filter> <!--

    action, category, data --> </intent-filter> <!-- [END deep_link_filter] --> </activity>
  162.  ディープリンク用のActivityを作成 <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" />
  163.  招待状送信画面の起動 Intent intent = new AppInviteInvitation .IntentBuilder("アクションバーのタイトル部分") .setMessage("メール本文の一番上の部分") .setDeepLink(Uri.parse( getString(R.string.invitation_deep_link)

    + "?param=hoge" )) .setGoogleAnalyticsTrackingId(GA_TRACKER_ID)
  164.  招待状送信画面の起動 Intent intent = new AppInviteInvitation .IntentBuilder("アクションバーのタイトル部分") .setMessage("メール本文の一番上の部分") .setDeepLink(Uri.parse( getString(R.string.invitation_deep_link)

    + "?param=hoge" )) .setGoogleAnalyticsTrackingId(GA_TRACKER_ID)
  165.  招待状送信画面の起動 Intent intent = new AppInviteInvitation .IntentBuilder("アクションバーのタイトル部分") .setMessage("メール本文の一番上の部分") .setDeepLink(Uri.parse( getString(R.string.invitation_deep_link)

    + "?param=hoge" )) .setGoogleAnalyticsTrackingId(GA_TRACKER_ID)
  166.  招待状送信画面の起動 .setEmailHtmlContent("<html><body>" + "<h1>App Invites</h1>" + "<a href=\"%%APPINVITE_LINK_PLACEHOLDER%%\">Install Now!</a>" +

    "<body></html>") .setEmailSubject("メールのタイトル") .build();
  167.  招待状送信画面の起動 .setEmailHtmlContent("<html><body>" + "<h1>App Invites</h1>" + "<a href=\"%%APPINVITE_LINK_PLACEHOLDER%%\">Install Now!</a>" +

    "<body></html>") .setEmailSubject("メールのタイトル") .build();
  168.  招待状送信画面の起動 startActivityForResult(intent, 0);

  169. mGoogleApiClient = new GoogleApiClient.Builder(this) .enableAutoManage( this /* FragmentActivity */, this

    /* OnConnectionFailedListener */) .addApi(Auth.GOOGLE_SIGN_IN_API, gso) .build(); mGoogleApiClient.connect();  App Invitesを受け入れる
  170. boolean autoLaunchDeepLink = true; AppInvite.AppInviteApi.getInvitation( mGoogleApiClient, this /* Activity */,

    autoLaunchDeepLink );  App Invitesを受け入れる
  171. boolean autoLaunchDeepLink = false; AppInvite.AppInviteApi.getInvitation( mGoogleApiClient, this, autoLaunchDeepLink ).setResultCallback( /**

    ResultCallback */ );  App Invitesを受け入れる
  172. new ResultCallback<AppInviteInvitationResult>() { @Override public void onResult( AppInviteInvitationResult result) {

    // ここに自分でディープリンクを受け取って // Activityを起動する処理を書く } });  App Invitesを受け入れる
  173. 効果検証の方法

  174. 効果検証はどうやるの? • Google Analyticsと連携すれば、 送信、承諾、成立の数値を取ることが 可能

  175. 効果検証はどうやるの? • 送信 ◦ メールまたはSMSをクリック • 承諾 ◦ メールのインストールリンクを クリック

  176. 効果検証はどうやるの? • 成立 ◦ メールのインストールリンク経由でアプ リをインストール

  177. 効果検証はどうやるの? • App InvitesからFirebase Invitesに変わっ たタイミングでGoogle Analyticsとの連携方 法に関するドキュメントが消えたっぽい

  178. Google Analyticsの設定 • 管理 -> プロパティ -> カスタム定義 -> カスタ

    ムディメンション -> 新しいカスタムディメンション から、ディメンションを追加する
  179. Google Analyticsの設定

  180. Google Analyticsの設定 • このディメンションは、カスタムディメンションの 表のインデックス1でなければならない

  181. Google Analyticsの設定

  182. Google Analyticsの設定 • 定義済みのApp Invites dashboardをダウン ロードし、対象のTrackingID->すべてのモ バイルアプリのデータを選択する • https://www.google.com/analytics/web/

    template?uid=Po4taKHETwmWrzqOOqrl QQ
  183. Google Analyticsの設定

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

  185. Google Analyticsの設定

  186. レポートの見方 招待メール送信数

  187. レポートの見方 招待メール送信数 インストールリンク クリック数

  188. レポートの見方 招待メール送信数 インストールリンク クリック数 インストール数

  189. イベントを直接見る場合 • イベントカテゴリ ◦ Invitation • イベントアクション ◦ Sent ◦

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

  191. App Invitesを導入した結果

  192. 導入箇所 • メールでアプリを紹介するボタンを押した時 • 今まではメールアプリを立ち上げるようにして いたが、それをApp Invitesが立ち上がるように 変更した

  193. 結果

  194. 結果 • 送信数の約50%が承諾し、その約30%が 成立した • App Invitesを導入したことによるインストール 数に大きな変化はなかった

  195. 結果 • ポイントタウンの場合はコンテンツの共有では なく単純にアプリを紹介するようなメールだっ たため、ディープリンクを活かしたメールにす ればもう少し改善できるかもしれない

  196. App Invitesを導入するべきか • もともとメールで何かを共有する機能があるの であれば、これを実装すれば3ステップ(共有 ボタンを押す、連絡先を選択する、送信する) でアプリ内からメールを送信することが可能に なり、ユーザー体験の向上に繋がるため、導 入した方が良い

  197. Google Santa Tracker • google/santa-tracker-android: Ho Ho Ho https://github.com/google/santa-tracker -android

  198. Qiita • App Invitesの仕組みを理解する - Qiita http://qiita.com/syarihu/items/1847a7f1 caf7f71d26a4

  199. まとめ

  200. まとめ • 新しいGoogle Sign-In APIは導入が簡単で権 限も不要 • 別のプラットフォームでログインしていれば Silent Sign-Inでログインできる

  201. まとめ • Google+1は総合順位、検索順位を決めるひと つの重要な要素である • Google+1数を上げることは長期的に見て順位 が上がる可能性があるため、余裕があれば実 装すべき

  202. まとめ • もともとメールで何かを共有する機能があれ ば、App Invitesによりユーザー体験の向上に 繋がるため、導入した方が良い

  203. ご清聴ありがとうございました