Slide 1

Slide 1 text

CredentialManager移行の 落とし穴 ゆつぼ(@morayl1) 1

Slide 2

Slide 2 text

ゆつぼ 株式会社リクルート スタディサプリのAndroidエンジニア うつぼです。かわいい! 2 morayl morayl1

Slide 3

Slide 3 text

はじめに ● ID/パスワードの入力補助のお話 ● Smart Lock for Passwordsからの移行 ● 環境依存が強いので、結果が異なる場合があるかも 3

Slide 4

Slide 4 text

Smart Lock for PasswordsとCredentialManager ● Smart Lock for Passwords(CredentialsApi) ○ ID/Passwordの保存・読み出しを中継するライブラリ ○ gms:play-services-authに入っていたが、2022年にdeprecatedになった ○ gms:play-services-auth:21.0.0から削除されている(21.2.0が最新) ● それに変わるのがCredentialManager ○ Passwordだけでなく、GoogleSignIn・Passkeyにも対応できる ● ライブラリが変わるので、移行にはコードの書き換えが必要 4

Slide 5

Slide 5 text

CredentialManagerへの移行 公式にマイグレーションガイドがある https://developer.android.com/identity/sign-in/smart-lock-migration 5

Slide 6

Slide 6 text

パスワードの保存 6

Slide 7

Slide 7 text

パスワードの読み出し 7

Slide 8

Slide 8 text

パスワードの読み出し 8

Slide 9

Slide 9 text

パスワードの読み出し 9

Slide 10

Slide 10 text

落とし穴 10

Slide 11

Slide 11 text

正常パターン 11

Slide 12

Slide 12 text

12

Slide 13

Slide 13 text

13

Slide 14

Slide 14 text

14

Slide 15

Slide 15 text

15

Slide 16

Slide 16 text

異常パターン 16

Slide 17

Slide 17 text

17

Slide 18

Slide 18 text

18

Slide 19

Slide 19 text

19

Slide 20

Slide 20 text

20

Slide 21

Slide 21 text

21

Slide 22

Slide 22 text

事象と条件 事象:特定の条件でパスワード保存シートが2回表示される 発生条件:Android14以降で、入力UIにEditTextを使っている 22

Slide 23

Slide 23 text

23

Slide 24

Slide 24 text

24

Slide 25

Slide 25 text

25

Slide 26

Slide 26 text

分かったこと 勝手に出てくるもの + 自分が出しているもの、で 2つ出ている ● EditTextでinputTypeがpassword系の場合に出る(OS14以降) ○ 画面遷移(Activity/Fragment):保存UI ○ EditTextへのフォーカス(autofill属性による):読み出しUI ● OS14から、Autofillが強化されたことが原因 ● Composeでは発生しない ○ ComposeはまだAutofillに最適化されていないらしい ○ そのうち最適化されそう ● play-services-authでは発生しない 26

Slide 27

Slide 27 text

解決策 Compose化する パスワード入力ViewでEditTextを使わなければ解決する ● EditTextだけComposeにする ○ Abstract/ComposeViewを使うと出来る ○ TextInputLayoutで囲んである場合は、難しいかも ● 画面全体・Fragmentのレイアウトを全てComposeにする 27

Slide 28

Slide 28 text

「今、Compose化は出来ん」 28

Slide 29

Slide 29 text

xmlのまま解決する方法はないか? 1. 解決しない方法 2. ちょっと解決する方法 3. 解決ではない方法 4. 解決策? 5. 解決策 29

Slide 30

Slide 30 text

解決しない方法 xmlでAutofillの無効化する 30 inputTypeがpasswordだと表示されてしまう。 IssueTrackerで、仕様通りと回答されている。(以下、抜粋・翻訳) Android 14以降では、「自動入力の重要度」の挙動が更新されました。 Views#isImportantForAutofill が no または noExcludeDescendants に設定されてい るビューでも、フォーカスされた際に通常は自動入力がトリガーされます。

Slide 31

Slide 31 text

解決ではない方法 play-services-authの21.0.0未満を使い続ける メリット ● 問題が発生しない ○ OS14でも、勝手に表示されない デメリット ● deprecatedのままで、ライブラリアップデートも出来ない 31

Slide 32

Slide 32 text

ちょっと解決する方法 画面遷移前に、 AutofillManagerのcancelを呼ぶ。 メリット ● 画面遷移後に出る(保存)のは防げる デメリット ● EditTextタップ時に出てくるもの(読み出し)は防げない 32

Slide 33

Slide 33 text

解決策? OS14以降で、CredentialManagerのメソッドを呼ばない メリット ● 問題は解決する デメリット ● 読み出し・保存のタイミングが制御できない ● 明示しないことには不安がある ○ 内部仕様が変わると動作しなくなるかも・・・? 33

Slide 34

Slide 34 text

解決策 EditTextにisCredential=trueを付ける メリット ● 問題が解決する デメリット? ● 移行ガイドの手順通り進めると出てこない ○ https://developer.android.com/identity/sign-in/smart-lock-migration 34

Slide 35

Slide 35 text

isCredentialとは何か Android 14以降では、isCredential属性を使用して、ユーザー名やパスワードなどの資格情報フィー ルドを示すことができます。この属性は、そのビューが Credential Managerやサードパーティの資格 情報プロバイダーと連携するための資格情報フィールドであることを示し、オートフィルサービスがよ り適切なオートフィル候補を提供できるように支援します。 アプリがCredential Manager APIを使用する場合、利用可能な資格情報を表示する Credential Managerのボトムシートが表示されるため、ユーザー名やパスワード用のオートフィルのダイアログ を表示する必要はありません。同様に、アプリが Credential Manager APIを使用して資格情報を保 存するため、オートフィルのパスワード保存ダイアログも表示する必要がありません。 https://developer.android.com/identity/sign-in/credential-manager#indicate_credential_fields 35

Slide 36

Slide 36 text

isCredentialとは何か Android 14以降では、isCredential属性を使用して、ユーザー名やパスワードなどの資格情報フィー ルドを示すことができます。この属性は、そのビューがCredential Managerやサードパーティの資格 情報プロバイダーと連携するための資格情報フィールドであることを示し、 オートフィルサービスがよ り適切なオートフィル候補を提供できるように支援します 。 アプリがCredential Manager APIを使用する場合、利用可能な資格情報を表示する Credential Managerのボトムシートが表示されるため、ユーザー名やパスワード用のオートフィルのダイアログ を表示する必要はありません。同様に、アプリが Credential Manager APIを使用して資格情報を保 存するため、オートフィルのパスワード保存ダイアログも表示する必要がありません。 36 「trueにすると勝手に出る」ようになりそう?

Slide 37

Slide 37 text

isCredentialとは何か Android 14以降では、isCredential属性を使用して、ユーザー名やパスワードなどの資格情報フィー ルドを示すことができます。この属性は、そのビューがCredential Managerやサードパーティの資格 情報プロバイダーと連携するための資格情報フィールドであることを示し、 オートフィルサービスがよ り適切なオートフィル候補を提供できるように支援します 。 アプリがCredential Manager APIを使用する場合、利用可能な資格情報を表示する Credential Managerのボトムシートが表示されるため、ユーザー名やパスワード用のオートフィルのダイアログ を表示する必要はありません。同様に、アプリが Credential Manager APIを使用して資格情報を保 存するため、オートフィルのパスワード保存ダイアログも表示する必要がありません。 37 isCredentialを使わないと2回表示される(不適切になる) →trueにすると適切に表示できる

Slide 38

Slide 38 text

isCredentialとは何か Android 14以降では、isCredential属性を使用して、ユーザー名やパスワードなどの資格情報フィー ルドを示すことができます。この属性は、そのビューが Credential Managerやサードパーティの資格 情報プロバイダーと連携するための資格情報フィールドであることを示し、オートフィルサービスがよ り適切なオートフィル候補を提供できるように支援します。 アプリがCredential Manager APIを使用する場合、利用可能な資格情報を表示する Credential Managerのボトムシートが表示されるため、ユーザー名やパスワード用のオートフィルのダイアログ を表示する必要はありません。同様に 、アプリがCredential Manager APIを使用して資格情報を保 存するため、オートフィルのパスワード保存ダイアログも表示する必要がありません 。 38 CredentialManager・オートフィルの2種類のダイアログがある → CredentialManagerを使うなら、オートフィルは不要 = trueにするとオートフィルのダイアログが表示されない

Slide 39

Slide 39 text

isCredentialの属性値を見てみる 「CredentialManagerと紐づいていることを示す」 = 「紐付いているから勝手に出さないでね 」 ComposeもAutofillに最適化された場合、isCredentialのような設定値が増えるのかもし れない 39

Slide 40

Slide 40 text

まとめ ● CredentialManagerでは簡単にパスワードの読み出し・保存が出来る ● Smart Lock for PasswordsをCredentialManagerに移行しようとしたら、 UIが重複表示される事象が発生した ○ Android14以降でPassword入力のEditTextを使うことが条件 ● 解決方法 ○ EditTextにisCredential=trueを付ける ○ Composeに移行する 40