😬

【Flutter】デバッグでiOSで動くのにAndroidで「Error in anonymous」が起きた時に確認すること【初心者向け】

2025/03/06に公開

こんにちは、ワニかず@40歳 出戻りエンジニアです。
Flutter×FirestoreのsignInAnonymouslyを使った匿名認証処理のデバッグ時に、

I/flutter ( 5731): Error in anonymous sign in: [firebase_auth/unknown] An internal error has occurred. [ Cleartext HTTP traffic to 10.0.2.2 not permitted

というようなエラーが
iOS→起きない
Android→起きる

ということがあるかと思います。

原因

このエラーは Android 9(API レベル 28)以降で、デフォルトで HTTP の通信がブロックされることに起因しています。Firebase Emulator に接続する際に必要な HTTP 通信が許可されていないことが原因です。

対策

  1. android/app/src/main/AndroidManifest.xml を開き、application タグに android:usesCleartextTraffic="true" を追加します
<application
    android:label="your_app_name"
    android:name="${applicationName}"
    android:icon="@mipmap/ic_launcher"
    android:usesCleartextTraffic="true">  <!-- この行を追加 -->
  1. その後、アプリを再ビルドしてください:
flutter clean
flutter pub get
flutter run

何故このようなことが起きる?

  1. 現在 Firebase Emulator を使用していて、これは開発用のローカルサーバー(10.0.2.2)で動作しています
  2. ローカルサーバーは HTTP を使用して通信を行います
  3. Android 9 以降は、セキュリティ強化のため、デフォルトで HTTP 通信(暗号化されていない通信)をブロックする設定になっています

本番環境との違い:

  • 本番環境の Firebase は https:// で始まる URL を使用し、暗号化された通信(HTTPS)を行います
  • そのため、この問題は本番環境では発生しません

つまり:

  • デバッグ環境:ローカルの Emulator に HTTP で接続しようとしてブロックされる
  • 本番環境:Firebase の本物のサーバーに HTTPS で接続するためブロックされない

解決策として android:usesCleartextTraffic="true" を追加するのは:

  • 開発中に Emulator と通信するための一時的な設定
  • リリースビルドでは必要ない(むしろセキュリティのために外すべき)設定

注意

なお、この設定は開発時のエミュレータ使用時のみに必要な設定です。
本番環境では基本的に必要ありません(Firebase の本番環境は HTTPS を使用するため)。

セキュリティ上の理由から、

  • 本番環境用のビルドではこの設定を削除するか、
  • 開発環境と本番環境で異なる AndroidManifest.xml を使用する

おしまいに

iOSでFirestoreとの疎通が取れたけど、

「Andoroid側は絶対なんか起きるだろうな」
「いやだな、いやだなー」
「こわいな、こわいなー」



「と思ったら、やっぱり、あるんです、問題が」
という感じで起きた問題でした。
※稲川淳二風

Discussion