そしてDeprecatedへ
Firebaseのサポートからメールが来ていたので報告していたバグが直ったかなーと思ったら Deprecated の案内だった。
https://firebase.google.com/docs/invites/deprecation
今後は普通のACTION_SENDのシェアと Dynamic Link 使えとのことだそうな。俺の調査時間を返せ。
↓↓↓↓↓ 以下はDeprecatedになる前の調査記事 ↓↓↓↓↓
現状について
Firebase Invitesの最新のAndroidライブラリ16.0.6では 連絡先一覧画面のActivityからメッセージを表示する(電話番号送信時の課金警告とメール送信後の完了メッセージ)際に、Oreo以降のバージョンだとパーミッションエラーが発生してActivityが落ちてしまうのでこの問題をFirebaseに報告しつつ採用は見送り中。
(追記) 12/4にバグレポートの担当者から問題が再現したので対応中との連絡あり。連絡を待つことにする。
お題
Firebase Invitesを使ってユーザーがアプリから友達を招待できるようにしたい。
環境
- Android Studio 3.3 Beta4
- com.android.tools.build.gradle:3.2.1
- kotlin-gradle-plugin:1.3.10
- firebase-plugins:1.1.5
- google-services:4.2.0
- firebase-core:16.0.4
- firebase-invites:16.0.4
実装
onClickListenerなどに書く
val intent = AppInviteInvitation.IntentBuilder("ご案内") .setMessage("このアプリやろうぜ") .setEmailSubject("アプリに招待します") .setEmailHtmlContent( "<html><body>%%APPINVITE_LINK_PLACEHOLDER%%</body></html>" ) .setGoogleAnalyticsTrackingId(getString(R.string.ga_trackingId)) //GoogleAnalytics .setDeepLink(Uri.parse("https://hogehoge.com/items/12345")) //DeepLinkは現在未使用だが無いとSMSのURLが500エラーになるので仮当て .build() startActivityForResult( intent, REQUEST_INVITE )
動作
startActivity
するとcom.google.android.gms.appinvite.ACTION_APP_INVITE
アクションに対応するcom.google.android.gms..appinvite.AppInviteActivity
が起動する
トラブルシューティング
SMSが送信されない
SMSを選択すると招待画面が落ちる(未解決)
- Android 8.0以降か
- Permissionの問題
android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@3b3fae7 -- permission denied for window type 2003
とか発生して落ちる
SMSのリンク先が500エラーになる
setDeepLink
を記述しないと発生する。nullをセットすると落ちる。使わなくても何かしらそれっぽいURLを書いておく。
メールが送信されない
- ドキュメントに記載がないが、
setEmailSubject
setEmailHtmlContent
を使わないと送信されない。
onActivityResultが2回呼ばれる
- FragmentからStartActivityForResultしていて、MainActivity内でFragmentのonActivityResultを呼んでいたために発生
厳密にはrequestCodeが異なるので合致するRequestCodeのみ扱うことで対応。
onActivityResultが resultCode=3
になある
- 送信に失敗している
- Firebase ConsoleにSHA1を登録していない(releaseとstagingでKeyStoreが異なる場合などで設定忘れに注意)
- Firebase ConsoleにSHA256を登録していない(Dynamic Linkの生成に必要)
onActivityResultが常に resultCode=0(RESULT_CANCELED)
になる
- 「SMSを選択すると招待画面が落ちる」と関連
- 自分のアプリに戻る前にAppInviteActivityが落ちている
- 送信完了メッセージをSnackBarで表示しようとして落ちる
- 完了通知時に落ちるので送信はされる(正しく書けていれば)
firebase-core:16.0.5にするとビルドエラーになる
依存関係の問題。 修正版がリリースされているが、よく分からない。dex絡み。
Release Notes | Google Play services | Google Developers
プロジェクトのbuild.gradleにVersion Matcher Pluginを入れたら動くにようになった気がする
apply plugin: 'com.google.android.gms.strict-version-matcher-plugin' classpath 'com.google.android.gms:strict-version-matcher-plugin:1.0.2'
- Clean Projectしてから再ビルドが必要。
まとめ
- ドキュメント通りには動かない
- メソッドの使用有無で送信されたりされなかったりがある
- SMS送信の際にDynamic Linkが自動生成されるので
AppsFlyerなどの他のDynamic Linkツールと組み合わせて使うには妥協が必要 - 送信されない理由の説明がないので原因が特定しにくい
- 結構バグっぽい挙動も多くて手強い
参考
https://firebase.google.com/docs/invites/android?hl=ja#header_2