【iOS】Password Autofillの実装

はじめに

iOS11からpassword autofillに対応することが可能になりました。 具体的には、パスワード新規作成時にiOSから提案される強力なパスワードを使用したり、keychainにユーザーID、パスワードのセットを記録し、アプリ使用時やWebサイトのログイン時に記録されたID・パスワードを使用することができます。

具体的な実装としては、下記のように対応することになります。

  • Apple Developer CenterにてAssociated Domainsにチェック
  • アプリのProject設定を変更
  • サーバーにapple-app-site-associationを配置
  • アプリ側のTextFieldのTypeに適切な値を設定する

本記事にて対応の概要と対応する中で学んだ注意点や補足事項を記載します。

環境設定

以下の環境を使用しています。

  • iOS 13.1.2
  • Xcode11.1.0

対応方法

以下で「はじめに」に記載した対応手順を概説します。

Apple Developer CenterにてAssociated Domainsにチェック

Apple Developer Center > Identifiersから自身のアプリを選択し、Associated Domainsにチェックをつける必要があります。この際にCapabilitiesの追加を行なったことによりProvisioning ProfileがInvalidateされますので、再作成を忘れないようにしてください。 f:id:Iganin:20191106201616p:plain

アプリのProject設定変更

アプリのProject設定を変更します。 Signing & Categoriesから「+Capability」ボタンを押下し、Associated Domainsを選択します。この際に、まだProjectにentitlementsファイルがない場合は新規生成されますので、適当なフォルダに格納したり、命名の変更を行なってください。 f:id:Iganin:20191106204028p:plain

検証環境と本番環境のConfigurationを別々にしているのが一般的かと思いますので、Build Settingsから各Configurationにあったentitlementsを設定するのが良いかと思います。

f:id:Iganin:20191106204311p:plain

associated domainsに追加したいdomainを記載します。webcredentials:<domain名>かユニバーサルリンクの対応を行いたい場合はapplinks:<doamain名>とすれば良いでしょう。なお、associated domainsは各entitlementsに対して設定できますので、検証環境と本番環境を分けることが可能です。

f:id:Iganin:20191107015327p:plain

サーバーにapple-app-site-associationを配置

アプリのprojectにて設定したドメインのサーバーにapple-app-site-associationファイルを追加します。ドメイン直下か.well-known配下に格納するようドキュメントには記載されています。例えば、ドメイン直下に格納した場合はhttps:///apple-app-site-associationでアクセスできるか確認します。(※ .well-known配下に格納した場合はhttps:///.well-known/apple-app-site-association)

実際のファイルの中身は下記のようになります。あまり情報はありませんでしたが、webcredentialsとapplinksの双方を記述して問題なさそうでした。ファイル自体はJSON形式で詳しい内容はAppleの公式ドキュメントに記載されています。

{
    "webcredentials": {
        "apps": [ "${TeamID}.${BundleID}" ]
    },
    "applinks": {
        "apps": [],
        "details": [{
            "appID": "${TeamID}.${BundleID}",
            "paths": ["*"]
            }]
    }
}

アプリ側のTextFieldのTypeに適切な値を設定する

ユーザー名、パスワードを入力するTextFieldに適切な値を設定します。Username, New Passwordの組み合わせで強力なパスワードの自動生成、 Username, Passwordの組み合わせでユーザー名, パスワードの自動入力が使用できます。同一画面上にUsernameがなく、password関連の入力のみの場合は上記は機能しないようでした。また、One Time Passwordに設定することでSMSに届いたOne Time Passwordを自動で入力値の候補として使用するようにできます。このあたりの内容の詳細は公式ドキュメントを参照ください。

以上の設定でPassword Autofillの機能追加が完了します。ただ、検証する中で引っ掛かった点がありましたので、いかに補足として記載します。

補足

上記設定をしてもPassword Autofillが機能しない場合のiPhone側確認事項

Password Autofillですが、保存先としてiCloud Keychainを使用しています。 そのため、有効化するためには以下の設定が必要です。

  • Apple Accountでログインする
  • 設定アプリ > Apple ID > iCloud > キーチェーン が オンになっている

Face IDやTouch IDの認証が求められた際の挙動

QuickType barからユーザーID・パスワードを選択した際に、Face IDかTouch IDの入力を求められます。 この際に、Face IDかTouch IDが表示された際にapplicationWillResignActive(_:)が呼ばれ、入力が完了した際にapplicationDidBecomeActive(_:)が呼ばれます。したがって、該当メソッド内で画面遷移などを実装している場合、意図しない挙動となる可能性が高いため注意が必要です。

Associated Domainsが登録されるタイミング

公式ドキュメントによると、アプリがiOSバイスにインストールされたタイミングでentitlementファイルのassociated domainsに登録されているドメインからassociationファイルをダウンロードし、アプリのIdentifierが登録されているか確認し、登録を行うようです。

この際にサーバーから500-599のエラーが返却された際はデフォルトでは3時間おきに8回まで通信リトライをするとのことです。

ドメインの関連付けに成功した後はアプリがデバイスから削除されるまでは関連付けは維持され続けるようです。サーバー側のassociationファイルの修正の反映を即座に確認したい場合はアプリの削除をすることが推奨されていました。 この辺りの詳細は* 公式ドキュメント - About the Password AutoFill Workflow を参照ください。

参考

以下参考文献です。公式のドキュメントから関連した文書を集めました。 やはりまずは一次情報に一通り当たるのが理解の近道かと思います。