3
2

More than 1 year has passed since last update.

[iOS] [Swift] Password AutoFill(パスワード自動入力)を無効化したい…けどダメだった話

Last updated at Posted at 2022-02-12

前提環境

  • Xcode 13.1
  • iOS 15.0 / 14.5

Password AutoFillとは

iOS 11から導入された、こちらの画像の機能です。『「🔑パスワード」っていうのを出さないようにしたい!』という話題です。
IMG_0003.PNGIMG_0004.PNG
IMG_0005.PNG
本来は、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フレームワークは、IDのUITextFieldをどうやって検出しているのか?
    • 冒頭の前提環境で調べた限りでは、「isSecureTextEntryをtrueに設定したUITextFieldの、一つ上に近接するUITextFieldがID」とみなしているようです。

Password AutoFillの無効化

こちらが本題です。
この機能を無効化できないかを調査しました。
(「なぜ無効化する必要があるのか?」とは聞かないでください。 :sweat_smile:

結果、完全には困難でした。
「完全には」とは、以下のようなコードによって、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と設定すれば実現できるかも知れませんが…工数面や品質面で見送りました。

他に何か解決法をご存知の方がいらっしゃったら、ぜひご教示いただきたいです! :bow_tone1:

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2