前提環境
- Xcode 13.1
- iOS 15.0 / 14.5
Password AutoFillとは
iOS 11から導入された、こちらの画像の機能です。『「🔑パスワード」っていうのを出さないようにしたい!』という話題です。
本来は、Webサーバーに Credential を配置することによって、保存済みのID/パスワードを選択することなく、ワンタップで自動入力するところまで可能となります。
(参考記事)[iOS 11] 新機能の Password AutoFill を実装する
したがって↑は正確には「Password AutoFillの一部機能」ですが、面倒なので本記事ではPassword AutoFillと記載します。
Password AutoFillの実装
めちゃくちゃ単純です。
パスワードのUITextFieldに以下のプロパティを設定するだけ。
passwordTextField.isSecureTextEntry = true
この実装は、Password AutoFillというより、入力値をマスクするためのプロパティ設定ですが…
これだけでキーボードに「🔑パスワード」が出て、選択したIDとパスワードが、iOSフレームワークによって、自動的にIDとパスワードのUITextFieldに貼り付けされます。
備考:
- OSバージョンによる実装差異(?)
- iOS 11時代はIDのUITextFieldに
.textContentType = .username
を、パスワードのUITextFieldに.textContentType = .password
を設定する必要があったようです。 - 冒頭の前提環境で調べた限りでは、上の1行実装だけでPassword AutoFillが有効になりました。
- iOS 11時代はIDのUITextFieldに
- iOSフレームワークは、IDのUITextFieldをどうやって検出しているのか?
- 冒頭の前提環境で調べた限りでは、「
isSecureTextEntry
をtrueに設定したUITextFieldの、一つ上に近接するUITextFieldがID」とみなしているようです。
- 冒頭の前提環境で調べた限りでは、「
Password AutoFillの無効化
こちらが本題です。
この機能を無効化できないかを調査しました。
(「なぜ無効化する必要があるのか?」とは聞かないでください。 )
結果、完全には困難でした。
「完全には」とは、以下のようなコードによって、iOS 12以降の端末では一応無効化できるものの…
if #available(iOS 12.0, *) {
idTextField.textContentType = .oneTimeCode
}
passwordTextField.isSecureTextEntry = true
if #available(iOS 12.0, *) {
passwordTextField.textContentType = .oneTimeCode
}
.oneTimeCode
つまり「SMS認証コード」という設定になるので、SMSで認証コードを受け取ると、キーボード上部に
「メッセージから
999999」
といったサジェスチョンが表示され、選択すると認証コードをID/パスワードに貼り付けることができてしまいます。
これでは、むしろ無用なトラブルを引き起こしかねないので、解決策として採用は見送りました。
あるいは、UITextFieldを継承して、自力で入力値をマスクする実装を追加し、.isSecureTextEntry = false
と設定すれば実現できるかも知れませんが…工数面や品質面で見送りました。
他に何か解決法をご存知の方がいらっしゃったら、ぜひご教示いただきたいです!