Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
[DroidKaigi 2017] Function Introduction of Goog...
Search
syarihu
March 08, 2017
Programming
0
3.7k
[DroidKaigi 2017] Function Introduction of Google Play Services
「Function Introduction of Google Play Services」の発表資料です。
syarihu
March 08, 2017
Tweet
Share
More Decks by syarihu
See All by syarihu
[DroidKaigi 2024] Android ViewからJetpack Composeへ 〜Jetpack Compose移行のすゝめ〜 / From Android View to Jetpack Compose: A Guide to Migration
syarihu
3
2.6k
[shibuya.apk #46] Composableの枠を超えてアニメーションする / Animation beyond Composable
syarihu
0
18
[shibuya.apk #41] Jetpack Composeでグリッドに柔軟にスペースを入れたい
syarihu
0
2.8k
[DroidKaigi 2022] 詳解Google Playの新しい定期購入 ~オファーの活用や実装例を添えて~
syarihu
0
3.3k
5分で分かるGoogle Playの新しいサブスクリプション / Google Play new subscription 2022
syarihu
1
1.8k
[DroidKaigi 2021] Google Play 定期購入 比例配分モード完全攻略ガイド / Google Play Subscription Proration Mode Complete Guide
syarihu
1
7.5k
[Money Forward Tech Drive] What's new in Google Play [Recap #io21]
syarihu
0
550
[Android 11 Meetups] Google Play Commerce からのアップデート / Android 11 Meetups Google Play Commerce
syarihu
4
2.8k
[potatotips #70] license-list-pluginを使ってOSSライセンス画面を自動生成する / license-list-plugin
syarihu
4
4.6k
Other Decks in Programming
See All in Programming
なまけものオバケたち -PHP 8.4 に入った新機能の紹介-
tanakahisateru
1
120
Monixと常駐プログラムの勘どころ / Scalaわいわい勉強会 #4
stoneream
0
270
Refactor your code - refactor yourself
xosofox
1
260
ゆるやかにgolangci-lintのルールを強くする / Kyoto.go #56
utgwkk
1
370
見えないメモリを観測する: PHP 8.4 `pg_result_memory_size()` とSQL結果のメモリ管理
kentaroutakeda
0
140
20年もののレガシープロダクトに 0からPHPStanを入れるまで / phpcon2024
hirobe1999
0
130
バグを見つけた?それAppleに直してもらおう!
uetyo
0
170
Асинхронность неизбежна: как мы проектировали сервис уведомлений
lamodatech
0
700
14 Years of iOS: Lessons and Key Points
seyfoyun
1
770
短期間での新規プロダクト開発における「コスパの良い」Goのテスト戦略」 / kamakura.go
n3xem
2
170
menu基盤チームによるGoogle Cloudの活用事例~Application Integration, Cloud Tasks編~
yoshifumi_ishikura
0
110
クリエイティブコーディングとRuby学習 / Creative Coding and Learning Ruby
chobishiba
0
3.9k
Featured
See All Featured
Put a Button on it: Removing Barriers to Going Fast.
kastner
59
3.6k
Designing for Performance
lara
604
68k
How to Think Like a Performance Engineer
csswizardry
22
1.2k
Site-Speed That Sticks
csswizardry
2
190
Visualization
eitanlees
146
15k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5.1k
BBQ
matthewcrist
85
9.4k
4 Signs Your Business is Dying
shpigford
181
21k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
45
2.2k
Writing Fast Ruby
sferik
628
61k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
159
15k
A designer walks into a library…
pauljervisheath
204
24k
Transcript
Function Introduction of Google Play Services DroidKaigi 2017 2017/03/09 (Thu.)
Taichi Sato (@syarihu)
対象者 • Androidアプリ開発をある程度やったこと のある人 • Google Sign-In APIに興味がある人 • ASOが気になる人
• App Invitesに興味がある人
話すこと 1. Google Sign-In API 2. Google Plus One Button
3. App Invites for Android
自己紹介
Taichi Sato (@syarihu) • GMO Media, inc. • エンジニア ◦
Androidアプリ ◦ サーバーサイドアプリ (Java)
Point Town
Google Sign-In API
以前のGoogle Sign-In • アカウント選択画面 AccountManager.newChooseAccountIntent • 自分でIntent投げて、返ってきたら色々やって …
以前のGoogle Sign-In • AuthTokenの取得 ( AccountManager#getAuthToken ) ◦ 認証状態の確認 ◦
認証されてなかったら認証許可ダイアログを表示 ◦ 認証されてたらAuthTokenを取得 ◦ 認証許可が外れてたら再取得も自分で…
以前のGoogle Sign-In • アカウントの選択でつかうメソッド AccountManager.newChooseAccountIntent( Account selectedAccount, ArrayList<Account> allowableAccounts, String[]
allowableAccountTypes, boolean alwaysPromptForAccount, String descriptionOverrideText, String addAccountAuthTokenType, String[] addAccountRequiredFeatures, Bundle addAccountOptions)
以前のGoogle Sign-In • AuthTokenの取得でつかうメソッド AccountManager#getAuthToken( Account account, String authTokenType, Bundle
options, boolean notifyAuthFailure, AccountManagerCallBack<Bundle> callback, Handler handler)
新しい Google Sign-In API • Google Play Services 8.3をリリースした 際、その新機能の一つとして新しい
Google Sign-In APIが公開された
新しい Google Sign-In API • Google Sign-InをAndroidで実装するた めには以前は実装がとても面倒だった
新しい Google Sign-In API • Google Sign-InをAndroidで実装するた めには以前は実装がとても面倒だった • これが簡単に実装できるようになったの
が新しいGoogle Sign-In API
新しい Google Sign-In API • アカウントを取得してサインインするのに権 限が必要ない
新しい Google Sign-In API • アカウントを取得してサインインするのに権 限が必要ない • 新しくデザインされたサインインボタン
新しい Google Sign-In API • アカウントを取得してサインインするのに権 限が必要ない • 新しくデザインされたサインインボタン •
実装も以前より簡単
新しい Google Sign-In API • アカウントを取得してサインインするのに権 限が必要ない • 新しくデザインされたサインインボタン •
実装も以前より簡単 • Silent Sign-In
サンプルアプリ
1. ログインボタンを押す
2. アカウントを選択する
3. 権限を許可する
4. サインイン完了
4. サインイン情報を利用して何かする
4. サインイン情報を利用して何かする
5. サインアウトする
5. サインアウトする
Silent Sign-In • ユーザーが以前に別のプラットフォーム 上のアプリに権限を許可している場合、 Silent Sign-Inを使用することができる
Silent Sign-In • プロジェクトのクライアントが要件を満た すように構成されている場合、 ユーザーはすぐにアプリケーションに サインインすることができる
Silent Sign-Inの要件 • OAuth 2.0クライアントIDは、 同じGoogle Developer Consoleプロジェクト でなければならない •
OAuthのスコープは、両方のクライアントで 同じでなければならない
• OAuth 2.0クライアントIDは、 同じGoogle Developer Consoleプロジェクトで なければならない • OAuthのスコープは、両方のクライアントで同じ でなければならない
要するにこうなっていれば
新たに許可する必要が無い
多言語対応 • com.google.android.gms.common. SignInButtonは、ローカライズされた文字 列を提供しており、これらは自動的に使 用可能となる
多言語対応 • どの言語に対応しているかなどを確認するた めにはSDKの以下のディレクトリから確認する ことができる <android-sdk-folder>/extras/google/ google_play_services/libproject/goo gle-play-services_lib/res/
Google Sign-In APIの実装
Google Sign-Inを使うための前提条件 • Google Play Storeを含むAndroid 2.3以上 • または、Android 4.2.2以降のGoogle
API プラットフォームを実行する、Google Play Servicesのバージョン9.8.0以降を含むAVD
前準備 1. 設定ファイルの取得、配置 2. build.gradleに追加
設定ファイルの取得 • 設定ファイルには、サービス固有の情報が 記述されている • Google API Consoleから既存のプロジェ クトを選択するか、新しいプロジェクトを作 成する必要がある
設定ファイルの取得 • アプリのパッケージ名と署名証明書の SHA-1ハッシュも必要
設定ファイルの取得 • Google Developer Consoleにプロジェクト が既にある場合は、以下のページから google-services.jsonを取得できる https://developers.google.com/mobile/a dd?platform=android
None
設定ファイルの取得 • 追加したいプロジェクトがFirebaseの場合 は、Firebase Consoleから google-services.jsonを取得できる https://console.firebase.google.com/
None
設定ファイルの配置 • ダウンロードしたgoogle-services.jsonをプ ロジェクトのappディレクトリ配下に配置する
build.gradleに追加 • プロジェクトのbuild.gradleに以下を追記 classpath 'com.google.gms:google-services:3.0.0'
build.gradleに追加 • appのbuild.gradleに以下を追記 compile 'com.google.android.gms: play-services-auth:10.2.0'
build.gradleに追加 • appのbuild.gradleの一番下に以下を追記 apply plugin: 'com.google.gms.google-services'
Google Sign-In APIの実装 • GoogleSignInOptions オブジェクトを作成 • GoogleApiClient オブジェクトを作成 •
Google サインインボタンを追加する • サインイン処理の実装 • サインアウト処理の実装
GoogleSignInOptions gso = new GoogleSignInOptions.Builder( GoogleSignInOptions.DEFAULT_SIGN_IN ) .requestEmail() .build(); GoogleSignInOptions
オブジェクトを作成
GoogleSignInOptions gso = new GoogleSignInOptions.Builder( GoogleSignInOptions.DEFAULT_SIGN_IN ) .requestEmail() .build(); GoogleSignInOptions
オブジェクトを作成
GoogleSignInOptions gso = new GoogleSignInOptions.Builder( GoogleSignInOptions.DEFAULT_SIGN_IN ) .requestEmail() .build(); GoogleSignInOptions
オブジェクトを作成
mScope = new Scope( "https://www.googleapis.com/auth/urls hortener"); GoogleSignInOptions オブジェクトを作成
GoogleSignInOptions gso = new GoogleSignInOptions.Builder( GoogleSignInOptions.DEFAULT_SIGN_IN ) .requestScopes(mScope) .requestEmail() .build();
GoogleSignInOptions オブジェクトを作成
GoogleSignInOptions gso = new GoogleSignInOptions.Builder( GoogleSignInOptions.DEFAULT_SIGN_IN ) .requestScopes(mScope) .requestEmail() .build();
GoogleSignInOptions オブジェクトを作成
mGoogleApiClient = new GoogleApiClient.Builder(this) .enableAutoManage( this /* FragmentActivity */, this
/* OnConnectionFailedListener */) .addApi(Auth.GOOGLE_SIGN_IN_API, gso) .build(); mGoogleApiClient.connect(); GoogleApiClient オブジェクトを作成
<com.google.android.gms.common.SignInButton android:id="@+id/sign_in_button" android:layout_width="wrap_content" android:layout_height="wrap_content"/> Googleサインインボタンの追加
Intent signInIntent = Auth.GoogleSignInApi .getSignInIntent(mGoogleApiClient); startActivityForResult( signInIntent, RC_SIGN_IN ); サインイン処理の実装
Intent signInIntent = Auth.GoogleSignInApi .getSignInIntent(mGoogleApiClient); startActivityForResult( signInIntent, RC_SIGN_IN ); サインイン処理の実装
@Override public void onActivityResult( int requestCode,int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data); /** GoogleSignInResult */ } サインイン処理の実装
if (requestCode == RC_SIGN_IN) { GoogleSignInResult result = Auth.GoogleSignInApi .getSignInResultFromIntent(data);
handleSignInResult(result); } サインイン処理の実装
if (requestCode == RC_SIGN_IN) { GoogleSignInResult result = Auth.GoogleSignInApi .getSignInResultFromIntent(data);
handleSignInResult(result); } サインイン処理の実装
private void handleSignInResult( GoogleSignInResult result) { if (result.isSuccess()) { mGoogleSignInAccount
= result .getSignInAccount(); showMessage(result.getSignInAccount() .getEmail()); } } サインイン処理の実装
private void handleSignInResult( GoogleSignInResult result) { if (result.isSuccess()) { mGoogleSignInAccount
= result .getSignInAccount(); showMessage(result.getSignInAccount() .getEmail()); } } サインイン処理の実装
private void handleSignInResult( GoogleSignInResult result) { if (result.isSuccess()) { mGoogleSignInAccount
= result .getSignInAccount(); showMessage(result.getSignInAccount() .getEmail()); } } サインイン処理の実装
Auth.GoogleSignInApi .signOut(mGoogleApiClient) .setResultCallback( // new ResultCallback ); サインアウト処理の実装
Auth.GoogleSignInApi .signOut(mGoogleApiClient) .setResultCallback( // new ResultCallback ); サインアウト処理の実装
new ResultCallback<Status>() { @Override public void onResult(Status status) { //
サインアウト後の処理 } }); サインアウト処理の実装
Auth.GoogleSignInApi .revokeAccess(mGoogleApiClient) .setResultCallback( // new ResultCallback ); 権限の取り消し
Auth.GoogleSignInApi .revokeAccess(mGoogleApiClient) .setResultCallback( // new ResultCallback ); 権限の取り消し
new ResultCallback<Status>() { @Override public void onResult(Status status) { signOut();
} }); 権限の取り消し
• status.getStatusCode()でStatusCodeを 取得できる • GoogleSignInStatusCodesについては以下 を参照 https://developers.google.com/android/reference/ com/google/android/gms/auth/api/signin/GoogleSig nInStatusCodes GoogleSignInStatusCodes
AuthTokenの取得 • AccountManagerでOAuth2認証してい たときには AccountManager#getAuthTokenを 使用してAuthTokenを取得していた
AuthTokenの取得 • GoogleSignInAccountにはそのような メソッドは用意されていないため、 GoogleAuthUtil.getTokenを使って AuthTokenを取得する
AuthTokenの取得 • AuthTokenが取得できたら、あとは以前と 同じようにAPIにリクエストを投げるときにこ のAuthTokenをaccess_tokenパラメータ として渡してあげることで、APIを利用するこ とがでできる
GoogleAuthUtil.getToken(context, new Account( mGoogleSignInAccount.getEmail(), ACCOUNT_TYPE), "oauth2:" + SHORTENER_SCOPE ); AuthTokenの取得
• SHORTENER_SCOPE “https://www.googleapis.com/auth/ urlshortener” • ACCOUNT_TYPE “com.google” AuthTokenの取得
Slient Sign-In • すでに権限を許可済の場合は、Silent Sign-Inを利用してサインインを行うこと ができる
@Override public void onResume() { super.onResume(); OptionalPendingResult<GoogleSignInResult> opr = Auth.GoogleSignInApi
.silentSignIn(mGoogleApiClient); } Silent Sign-In
@Override public void onResume() { super.onResume(); OptionalPendingResult<GoogleSignInResult> opr = Auth.GoogleSignInApi
.silentSignIn(mGoogleApiClient); } Silent Sign-In
if (opr.isDone()) { GoogleSignInResult result = opr.get(); handleSignInResult(result); } Silent
Sign-In 成功時
サンプルコード • syarihu/GoogleSignInTest: New Google Sign-In API Sample https://github.com/syarihu/GoogleSignI nTest
Qiita • Androidの新しいGoogleサインインAPIにつ いて - Qiita http://qiita.com/syarihu/items/1c67816 ad926f08d76d8
Google Plus One Button
Google Plus One Buttonとは? • ユーザーが気に入ったコンテンツを Google検索でおすすめしたり、 Google+で共有したりできる機能
Google Plus One Buttonとは? • 押すと数字が増える • Facebookで言う「いいね!」の ようなもの
Google Plus One Buttonとは? • Google Playストア上にはこのボタンは存 在しない
Google+1はASOに影響があるのか • ASOのことを調べていたら、 Google+1数は検索順位に影響するとい うような記事をちらほら見かけた • 本当に上がるのか気になったので、 実際に検証してみた
やったこと
やったこと • アプリ初回起動後、3日以上経過してい たら「+1で応援お願いします!」のような ダイアログを表示する
やったこと • アプリ初回起動後、3日以上経過してい たら「+1で応援お願いします!」のような ダイアログを表示する
やったこと • アプリ初回起動後、3日以上経過してい たら「+1で応援お願いします!」のような ダイアログを表示する
None
None
None
None
実装方法
build.gradleのdependenciesに追加 dependencies { compile "com.google.android.gms: play-services-plus:10.2.0" }
<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に追加
PlusOneButton button = (PlusOneButton) findViewById( R.id.plus_one_button ); ActivityのonResumeで初期化
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で初期化
implements PlusOneButton .OnPlusOneClickListener { クリック時に何かしたいとき
// +1ボタンの初期化 button.initialize("https://play.google. com/store/apps/details?id=パッケージ名", this /** OnPlusOneClickListener */); クリック時に何かしたいとき
@Override public void onPlusOneClick(Intent intent) { // PlusOneのActivityを起動する startActivityForResult( intent,
PLUS_ONE_BUTTON ); } クリック時に何かしたいとき
Google+1数の変化 • リリースしてから
Google+1数の変化 • リリースしてから ◦ 1ヶ月後 … 約2倍増加
Google+1数の変化 • リリースしてから ◦ 1ヶ月後 … 約2倍増加 ◦ 1年後 …
約6倍増加
クリックイベント
無料トップ総合順位
カテゴリ順位
検索順位
結果 • 総合順位、カテゴリ順位には大きく 影響する • 一時的には上昇するが、その状態を 保てるわけではなく、徐々に下がっていく
結果 • 検索順位には多少影響する • こちらは一度上がったあとはあまり下が らない • 総合順位、カテゴリ順位よりも結果がすぐ には出にくい
結果 • +1数が順位を決めるためのひとつの 要素であることは分かった • 総合順位、カテゴリ順位は常に変動して いるため、上位を保つためには+1 以外の要素が必要
結果 • 実装が手軽で長期的に見て上がる可能 性があるため、余裕があれば実装すべき
App Invites for Android
• Google Play Services 8.1から登場した、 メールやSMSで友人・知人を簡単に招待 できる仕組み App Invites とは
• Google Play Services 8.1から登場した、 メールやSMSで友人・知人を簡単に招待 できる仕組み • 開発者が招待メールをカスタマイズする ことができる
App Invites とは
• メールの招待リンクからアプリをインス トールすると、メールで共有された内容を ディープリンクでスムーズに アプリを開くことができる App Invites とは
• 現在はFirebase Invitesという名前になっ ているが、機能自体はFirebase Invites になる前とほぼ同じ App Invites とは
Firebase Invitesとの違い • play-services-appinviteに依存している • 利用するクラスのパッケージ名は com.google.android.gms.appinvite となっている
Firebase Invitesとの違い • アプリインストール用に生成されるリンク はFirebase InvitesになってからFirebase Dynamic Linksのリンクが生成されるよう になった
Firebase Invitesとの違い • 以前: https://plus.google.com/appinvites/xxxx xxxxx-xxxxxxxx-xxxxxxxxxxx
Firebase Invitesとの違い • 以前: https://plus.google.com/appinvites/xxxx xxxxx-xxxxxxxx-xxxxxxxxxxx • 今: https://xxxxx.app.goo.gl/xxxxxxxxx-xxxx xxxx-xxxxxxxxxxx
Google Santa Tracker
招待する側
【招待する側】ゲームで遊ぶ
【招待する側】ゲームで遊ぶ このゲーム面白い!
【招待する側】ゲームで遊ぶ このゲーム面白い! 誰かに共有したい!
【招待する側】共有ボタンを押す
【招待する側】共有ボタンを押す
【招待する側】App Invites 招待画面
【招待する側】App Invites 招待画面 連絡先を選択して
【招待する側】App Invites 招待画面 送信ボタンを押すだけ 連絡先を選択して
【招待する側】App Invites 招待画面
【招待する側】メール送信完了 送信完了!
招待される側
【招待される側】メール受信 あ、なんか友だちから メールきた
【招待される側】メール受信 面白そうだから インストールしてみよ
【招待される側】メール受信 面白そうだから インストールしてみよ
【招待される側】アプリのインストール
【招待される側】アプリの起動
【招待される側】アプリの起動 アプリ起動後、 ディープリンクが発動して 共有されたゲームを すぐに遊べる!
App Invites フロー
招待するとき 招待状を送信 メール or SMS 招待状を受信
招待されたとき(アプリ未インストール時) アプリ インストール アプリを開く ディープリンク 発動!
招待されたとき(アプリインストール済) アプリを開く ディープリンク 発動!
App Invitesの実装
前準備 1. Firebase Dynamic Linksの有効化 2. 設定ファイルの取得、配置 3. build.gradleに追加
Firebase Dynamic Linksの有効化 • App Invitesで招待する際に生成される共有 リンクはFirebase Dynamic Linksを利用して いる
Firebase Dynamic Linksの有効化 • そのため、Firebase Dynamic Linksを有効 にしていない場合は、Firebase Consoleから [Dynamic
Links] セクションを開き、表示され る利用規約に同意して、有効にする
設定ファイルの取得 • Firebase Consoleから google-services.jsonを取得する https://console.firebase.google.com/
None
設定ファイルの配置 • ダウンロードしたgoogle-services.jsonをプ ロジェクトのappディレクトリ配下に配置する
build.gradleに追加 • プロジェクトのbuild.gradleに以下を追記 classpath 'com.google.gms:google-services:3.0.0'
build.gradleに追加 • appのbuild.gradleに以下を追記 compile 'com.google.firebase: firebase-core:10.2.0' compile 'com.google.firebase: firebase-invites:10.2.0'
build.gradleに追加 • appのbuild.gradleの一番下に以下を追記 apply plugin: 'com.google.gms.google-services'
App Invitesの実装 • ディープリンク用のActivityを作成 • App Invitesの招待状送信画面を起動する • アプリ起動時のActivityでApp Invitesを
受け入れる
ディープリンク用のActivityを作成 public class AppInvitesActivity extends AppCompatActivity { @Override protected void
onStart() { super.onStart(); Intent intent = getIntent(); // IntentにApp Invitesの情報が含まれているか調べる if (AppInviteReferral.hasReferral(intent)) { processReferralIntent(intent); } }
ディープリンク用のActivityを作成 public class AppInvitesActivity extends AppCompatActivity { @Override protected void
onStart() { super.onStart(); Intent intent = getIntent(); // IntentにApp Invitesの情報が含まれているか調べる if (AppInviteReferral.hasReferral(intent)) { processReferralIntent(intent); } }
ディープリンク用のActivityを作成 private void processReferralIntent(Intent intent) { // 招待ID取得 String invitationId
= AppInviteReferral.getInvitationId(intent); // ディープリンク用URL取得 String deepLink = AppInviteReferral.getDeepLink(intent); // ディープリンクのURLに含まれるパラメータを使って // 何か処理したりする
ディープリンク用のActivityを作成 <activity android:name= ".app.ui.AppInvitesActivity"> <!-- [START deep_link_filter] --> <intent-filter> <!--
action, category, data --> </intent-filter> <!-- [END deep_link_filter] --> </activity>
ディープリンク用の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" />
招待状送信画面の起動 Intent intent = new AppInviteInvitation .IntentBuilder("アクションバーのタイトル部分") .setMessage("メール本文の一番上の部分") .setDeepLink(Uri.parse( getString(R.string.invitation_deep_link)
+ "?param=hoge" )) .setGoogleAnalyticsTrackingId(GA_TRACKER_ID)
招待状送信画面の起動 Intent intent = new AppInviteInvitation .IntentBuilder("アクションバーのタイトル部分") .setMessage("メール本文の一番上の部分") .setDeepLink(Uri.parse( getString(R.string.invitation_deep_link)
+ "?param=hoge" )) .setGoogleAnalyticsTrackingId(GA_TRACKER_ID)
招待状送信画面の起動 Intent intent = new AppInviteInvitation .IntentBuilder("アクションバーのタイトル部分") .setMessage("メール本文の一番上の部分") .setDeepLink(Uri.parse( getString(R.string.invitation_deep_link)
+ "?param=hoge" )) .setGoogleAnalyticsTrackingId(GA_TRACKER_ID)
招待状送信画面の起動 .setEmailHtmlContent("<html><body>" + "<h1>App Invites</h1>" + "<a href=\"%%APPINVITE_LINK_PLACEHOLDER%%\">Install Now!</a>" +
"<body></html>") .setEmailSubject("メールのタイトル") .build();
招待状送信画面の起動 .setEmailHtmlContent("<html><body>" + "<h1>App Invites</h1>" + "<a href=\"%%APPINVITE_LINK_PLACEHOLDER%%\">Install Now!</a>" +
"<body></html>") .setEmailSubject("メールのタイトル") .build();
招待状送信画面の起動 startActivityForResult(intent, 0);
mGoogleApiClient = new GoogleApiClient.Builder(this) .enableAutoManage( this /* FragmentActivity */, this
/* OnConnectionFailedListener */) .addApi(Auth.GOOGLE_SIGN_IN_API, gso) .build(); mGoogleApiClient.connect(); App Invitesを受け入れる
boolean autoLaunchDeepLink = true; AppInvite.AppInviteApi.getInvitation( mGoogleApiClient, this /* Activity */,
autoLaunchDeepLink ); App Invitesを受け入れる
boolean autoLaunchDeepLink = false; AppInvite.AppInviteApi.getInvitation( mGoogleApiClient, this, autoLaunchDeepLink ).setResultCallback( /**
ResultCallback */ ); App Invitesを受け入れる
new ResultCallback<AppInviteInvitationResult>() { @Override public void onResult( AppInviteInvitationResult result) {
// ここに自分でディープリンクを受け取って // Activityを起動する処理を書く } }); App Invitesを受け入れる
効果検証の方法
効果検証はどうやるの? • Google Analyticsと連携すれば、 送信、承諾、成立の数値を取ることが 可能
効果検証はどうやるの? • 送信 ◦ メールまたはSMSをクリック • 承諾 ◦ メールのインストールリンクを クリック
効果検証はどうやるの? • 成立 ◦ メールのインストールリンク経由でアプ リをインストール
効果検証はどうやるの? • App InvitesからFirebase Invitesに変わっ たタイミングでGoogle Analyticsとの連携方 法に関するドキュメントが消えたっぽい
Google Analyticsの設定 • 管理 -> プロパティ -> カスタム定義 -> カスタ
ムディメンション -> 新しいカスタムディメンション から、ディメンションを追加する
Google Analyticsの設定
Google Analyticsの設定 • このディメンションは、カスタムディメンションの 表のインデックス1でなければならない
Google Analyticsの設定
Google Analyticsの設定 • 定義済みのApp Invites dashboardをダウン ロードし、対象のTrackingID->すべてのモ バイルアプリのデータを選択する • https://www.google.com/analytics/web/
template?uid=Po4taKHETwmWrzqOOqrl QQ
Google Analyticsの設定
Google Analyticsの設定 • App Invitesのレポートは左のナビゲーションパ ネルからマイレポート一覧->非公開->App Invites(先ほどつけた名前)を選択することで 確認することができる
Google Analyticsの設定
レポートの見方 招待メール送信数
レポートの見方 招待メール送信数 インストールリンク クリック数
レポートの見方 招待メール送信数 インストールリンク クリック数 インストール数
イベントを直接見る場合 • イベントカテゴリ ◦ Invitation • イベントアクション ◦ Sent ◦
Accepted ◦ Completed
Google Analyticsの設定 • Google AnalyticsはすぐにApp Invitesのデータ の受信を始めるが、Google Analyticsが表示を 行うのに必要なデータを得るまで1〜2日かか るため、最初は空のデータとなる
App Invitesを導入した結果
導入箇所 • メールでアプリを紹介するボタンを押した時 • 今まではメールアプリを立ち上げるようにして いたが、それをApp Invitesが立ち上がるように 変更した
結果
結果 • 送信数の約50%が承諾し、その約30%が 成立した • App Invitesを導入したことによるインストール 数に大きな変化はなかった
結果 • ポイントタウンの場合はコンテンツの共有では なく単純にアプリを紹介するようなメールだっ たため、ディープリンクを活かしたメールにす ればもう少し改善できるかもしれない
App Invitesを導入するべきか • もともとメールで何かを共有する機能があるの であれば、これを実装すれば3ステップ(共有 ボタンを押す、連絡先を選択する、送信する) でアプリ内からメールを送信することが可能に なり、ユーザー体験の向上に繋がるため、導 入した方が良い
Google Santa Tracker • google/santa-tracker-android: Ho Ho Ho https://github.com/google/santa-tracker -android
Qiita • App Invitesの仕組みを理解する - Qiita http://qiita.com/syarihu/items/1847a7f1 caf7f71d26a4
まとめ
まとめ • 新しいGoogle Sign-In APIは導入が簡単で権 限も不要 • 別のプラットフォームでログインしていれば Silent Sign-Inでログインできる
まとめ • Google+1は総合順位、検索順位を決めるひと つの重要な要素である • Google+1数を上げることは長期的に見て順位 が上がる可能性があるため、余裕があれば実 装すべき
まとめ • もともとメールで何かを共有する機能があれ ば、App Invitesによりユーザー体験の向上に 繋がるため、導入した方が良い
ご清聴ありがとうございました