
この記事は every Tech Blog Advent Calendar 2025 の 9 日目の記事です。
はじめに
こんにちは。リテールハブ開発部小売アプリチームの池です。
Flutter で開発しているアプリの中で、Email のワンタイムパスワード(OTP)を利用した認証機能を検証する機会がありました。
iOS には、SMS やメールで届いた認証コードをクイックタイプバーと呼ばれるキーボード上部に候補として表示し、タップするだけで入力できる自動入力(AutoFill)機能があります。 次の画像は OTP 自動入力が動作した際の UI イメージです。

ユーザーの手入力やコピー&ペーストの手間を無くすことができるため、認証フローのユーザー体験にとって大切な機能だと考えています。
しかし、Apple 公式ドキュメントには SMS を前提とした記述が中心で、Email 経由の OTP 自動入力については情報が多くありませんでした。 どのような条件で動作するのか把握しづらいため、本記事では実機を用いて Email 経由の OTP 自動入力の挙動について検証します。
なお、本記事では iOS のみを検証対象としており、Android は対象外としています。
公式ドキュメントからわかること
私が確認した範囲にはなりますが、まずは、Apple および Flutter の公式ドキュメントから把握できる内容を整理します。
Apple 公式ドキュメントでわかること
Apple の公式ドキュメント(One-time codes、About the Password AutoFill workflow、Enabling Password AutoFill on a text input view、WWDC18 Session 204)から確認できる主なポイントは以下のとおりです。
- AutoFill は Apple 純正の Messages(SMS)および Mail アプリに対応
UITextContentType.oneTimeCodeを設定することで AutoFill 対象の入力欄と認識される- SMS には「code」または「passcode」というキーワードがコード文字列の近くに含まれている必要がある
- SMS から認証コードをパースできた場合、受信後最大 3 分間 QuickType バーに表示される
- 認証コード入力欄にカスタム入力ビューを使用すると、AutoFill の UI が表示されない
Flutter 公式ドキュメントでわかること
Flutter の公式ドキュメント(AutofillHints.oneTimeCode)から、以下の内容が確認できます。
- SMS ワンタイムコードの入力フィールドであることを示すヒント
- iOS で UITextContentType.oneTimeCode にマッピングされる
つまり、Flutter では AutofillHints.oneTimeCode を設定することで、iOS ネイティブの UITextContentType.oneTimeCode と同等の動作が期待されます。
公式ドキュメントから明確に確認できないこと
一方で、以下の点については公式ドキュメントに明記されていません。
- Gmail などサードパーティメールアプリでの挙動
- 通知設定が挙動に影響するかどうか
- Email 本文にも SMS 同様「フォーマット要件」があるか
AutofillHints.oneTimeCode設定有無による挙動差分(設定しない場合でも AutoFill が動作していたため)
これらの点について実機を用いて検証を行いました。
検証内容
検証環境
| 項目 | バージョン |
|---|---|
| iOS | 26.1 |
| Flutter | 3.35.6 |
検証パターン
Email 経由の OTP 自動入力について、以下の 3 つの軸の組み合わせを検証しました。
| 軸 | 条件 |
|---|---|
| メールアプリ | Apple 純正 Mail / Gmail |
Flutter の AutofillHints.oneTimeCode 設定 |
あり / なし |
| 通知設定 | ON / OFF |
さらに、Email 本文にもフォーマット要件(SMS の「code」相当)があるかどうかについても検証対象としました。
検証に使用した実装
検証には以下の 2 パターンの TextFormField 実装を使用しました(OTP 自動入力に関連する箇所のみ抜粋)。
パターン 1: AutofillHints.oneTimeCode なし
TextFormField( keyboardType: TextInputType.number, ... )
パターン 2: AutofillHints.oneTimeCode あり
TextFormField(
keyboardType: TextInputType.number,
autofillHints: const [AutofillHints.oneTimeCode],
...
)
検証結果
結果 ①:Mail と Gmail の挙動の違い
結論から言うと、Apple Mail はどのパターンも動作したが、Gmail は通知設定が必須です。
oneTimeCode 設定 |
メールアプリ | 通知設定 | 結果 |
|---|---|---|---|
| なし | ON | 動作する | |
| なし | OFF | 動作する | |
| なし | Gmail | ON | 動作する |
| なし | Gmail | OFF | 動作しない |
| あり | ON | 動作する | |
| あり | OFF | 動作する | |
| あり | Gmail | ON | 動作する |
| あり | Gmail | OFF | 動作しない |
画像では正確な挙動が分かりづらいですが、以下が純正 Mail アプリおよび Gmail で通知 ON/OFF における AutoFill の挙動の画像になります。
Mail では通知 OFF でもクイックタイプバーに認証コードが表示されています。
| Mail アプリ 通知 ON | Mail アプリ 通知 OFF |
|---|---|
|
|
一方で、Gmail では通知 OFF にするとクイックタイプバーに認証コードが表示されませんでした。
| Gmail 通知 ON | Gmail 通知 OFF |
|---|---|
|
|
この結果から、Mail ではメール本文を頼りに認証コードが検出され、Gmail では通知本文を頼りに認証コードを抽出されていると推測できます。
追加検証:プッシュ通知(FCM)からの OTP も検出されるか
Gmail で通知設定によって挙動が変わることから、「サードパーティメールアプリの場合、通知を頼りに iOS が認証コードを抽出しているのでは?」という仮説が生まれたので、FCM 経由で認証コードを含む通知を送信して検証しました。
次の画像の内容で通知を送ります。

結果、FCM からのプッシュ通知でも、クイックタイプバーに認証コードが表示されました。

つまり、iOS はメールアプリに限らず、通知に含まれる認証コードも AutoFill の対象としていることが確認できました。
結果 ②:Email のフォーマット要件
SMS では「code」または「passcode」というキーワードが必要という要件がありますが、Email についても同様の要件があるか検証しました。
以下の 3 パターンのメール本文で OTP 自動入力が動作するか確認しました。
| パターン | メール本文例 | 結果 |
|---|---|---|
| 数字のみ | 123456 |
動作しない |
| 「認証」キーワード | 認証:123456 |
動作しない |
| 「コード」キーワード | コード:123456 |
動作する |
| 数字のみ | 認証:123456 | コード:123456 |
|---|---|---|
|
|
|
結果、「コード」というキーワードが含まれている場合のみ OTP AutoFill が動作しました。これは SMS と同様に、Email でも「code」に相当するキーワード(日本語の「コード」を含む)が必要であることを示唆しています。
検証結果のまとめ
ここまでの事実を整理すると、以下になります。
iOS が OTP を検出する経路は 2 種類ある
- Apple 純正アプリ(Mail / Messages) → 本文へ直接アクセス
- サードパーティアプリ → 通知本文のみ参照
そのため、Gmail は通知 OFF で AutoFill が動作しないという挙動になる。
Email にも「キーワード要件」がある
- 「コード」「code」「passcode」など、コード番号の意味を示す語が必要
補足 AutofillHints.oneTimeCode の設定について
今回の検証では AutofillHints.oneTimeCode の設定有無で OTP 自動入力の挙動に違いは見られませんでした。しかし、Apple 公式ドキュメントでは UITextContentType.oneTimeCode の設定が必要とされています。設定なしで動作したのはあくまで検証時の結果であり、この挙動が保証されているわけではありません。
また、Apple は Associated Domains と組み合わせた domain-bound OTP(OTP を特定ドメインに紐づけるセキュリティ機能)をサポートしており、この機能にも UITextContentType.oneTimeCode の設定が必要です。
今回の検証では AutoFill に限り動作はしたものの保証されているものではなく、domain-bound OTP 機能もあるので、公式ドキュメントに則りAutofillHints.oneTimeCode は設定しておくことを推奨します。
終わりに
Email 経由の OTP AutoFill の挙動は、SMS に比べて公式情報が乏しくブラックボックスな部分が多いです。今回の検証により実践的な知見を得ることができました。
また、AutoFill による入力はもちろん大切ですが、ユーザーの利用しているメールアプリや設定次第では AutoFill が効かないことがわかったため、手動入力も意識した UI 設計を心がける必要があると学びました。
Email 経由の OTP AutoFill の挙動は iOS のアップデートにより変化する可能性がありますが、本記事が少しでも参考になれば幸いです。






