すぐできる iOS Strong Password and Security Code AutoFill

この記事は RECRUIT MARKETING PARTNERS Advent Calendar 2018 の投稿記事です。

こんにちは、エンジニアの @koutalou です。

2018年のWWDCでiOS12からサポートされる高強度のパスワードとセキュリティコードの自動入力について発表されました。

便利な機能ですぐ対応できる割にあまり対応しているアプリを見かけないので、紹介したいと思います。ちなみにサンプルコードも用意してます。

ログインパスワード自動入力

2つのUITextFieldの textContentType にそれぞれ .username, .password を指定するとkeychainに登録されたアカウント情報を選択して入力できるようになります。

let userTextField = UITextField()
userTextField.textContentType = .username
userTextField.keyboardType = .emailAddress
let passwordTextField = UITextField()
passwordTextField.textContentType = .password
passwordTextField.secureTextEntry = true

簡単ですね、ログインパスワード自動入力対応はこれだけです。

アカウント作成自動パスワード生成

2つのUITextFieldの textContentType にそれぞれ .username, .newPassword を指定する必要があります。

let userTextField = UITextField()
userTextField.textContentType = .username
userTextField.keyboardType = .emailAddress
let passwordTextField = UITextField()
passwordTextField.textContentType = .newPassword
passwordTextField.secureTextEntry = true

こちらは残念ながら textContentType の指定だけでは動作しません。

Associated Domainsの対応が必要になります。

Associated Domainsはデベロッパーサイトの App IDsとXcodeのCapabilitiesで有効にできます。

webcredentials: で設定する情報は以下に詳細が記載されていますが、Credentialファイルをどこかのサーバに置いて呼び出し先を指定する必要があります。

Credentialファイルは、 apple-app-site-association という名前にする必要があり、上記のApp IDの場合であれば以下のようなJsonデータにする必要があります。

{
  "webcredentials": {
    "apps": [ "H384Y529P5.com.koutalou.strong-security-autofill-sample" ]
  }
}

またアップロードは .well-known ディレクトリ内にする必要があります。

Credentialファイルを以下のS3にアップした場合、Xcode CapabilitiesのAssociated DomainsのDomainsにはhttpsと .well-known 以下のPathを抜いた s3-ap-northeast-1.amazonaws.com/test-strong-security-autofill-samplewを指定します。

以上でセキュリティ強度の高いパスワードが自動入力されるようになります。

また自動生成されるパスワードに制限をかける場合は以下のようにルールを指定することができます。

passwordTextField.passwordRules = UITextInputPasswordRules(
  descriptor:  "required: upper; required: lower; required: digit; allowed: [-().&@?'#,/"+]; max-consecutive: 2; minlength: 8;"
)

公式の検証ページも用意されています。

SMS認証自動入力

1つのUITextFieldの textContentType.oneTimeToken を指定するとSMSで送信された認証情報を選択して入力できるようになります。

let authenticateTextField = UITextField()
authenticateTextField.textContentType = .oneTimeToken
authenticateTextField.keyboardType = .numberPad

番号しか内容がないメッセージではなぜか認識しないようです。WWDCの時にメッセージの内容によって認識しない場合は教えてくれとAppleの人が言っていたので、認識されない場合も問い合わせれば対応してくれるかもしれません。

まとめ

Associated Domainsの設定だけ少し面倒ですが、基本的にはかなり簡単な対応だと思います。

新規既存サービスに関わらず対応しておいて損はない機能ですし、特に新規サービスだとアカウント登録時に最新機能に対応してると分かりやすい指標にもなるのでぜひ対応してみてはいかがでしょうか。