every Tech Blog

株式会社エブリーのTech Blogです。

Flutter iOS アプリで Email のワンタイムパスワード自動入力 (OTP AutoFill) を検証してみる

この記事は every Tech Blog Advent Calendar 2025 の 9 日目の記事です。

はじめに

こんにちは。リテールハブ開発部小売アプリチームの池です。

Flutter で開発しているアプリの中で、Email のワンタイムパスワード(OTP)を利用した認証機能を検証する機会がありました。

iOS には、SMS やメールで届いた認証コードをクイックタイプバーと呼ばれるキーボード上部に候補として表示し、タップするだけで入力できる自動入力(AutoFill)機能があります。 次の画像は OTP 自動入力が動作した際の UI イメージです。

OTP AutoFill 動作時の見た目

ユーザーの手入力やコピー&ペーストの手間を無くすことができるため、認証フローのユーザー体験にとって大切な機能だと考えています。

しかし、Apple 公式ドキュメントには SMS を前提とした記述が中心で、Email 経由の OTP 自動入力については情報が多くありませんでした。 どのような条件で動作するのか把握しづらいため、本記事では実機を用いて Email 経由の OTP 自動入力の挙動について検証します。

なお、本記事では iOS のみを検証対象としており、Android は対象外としています。

公式ドキュメントからわかること

私が確認した範囲にはなりますが、まずは、Apple および Flutter の公式ドキュメントから把握できる内容を整理します。

Apple 公式ドキュメントでわかること

Apple の公式ドキュメント(One-time codesAbout the Password AutoFill workflowEnabling Password AutoFill on a text input viewWWDC18 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 設定 メールアプリ 通知設定 結果
なし Mail ON 動作する
なし Mail OFF 動作する
なし Gmail ON 動作する
なし Gmail OFF 動作しない
あり Mail ON 動作する
あり Mail 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 種類ある

  1. Apple 純正アプリ(Mail / Messages) → 本文へ直接アクセス
  2. サードパーティアプリ → 通知本文のみ参照

そのため、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 のアップデートにより変化する可能性がありますが、本記事が少しでも参考になれば幸いです。