😬
【Flutter】デバッグでiOSで動くのにAndroidで「Error in anonymous」が起きた時に確認すること【初心者向け】
こんにちは、ワニかず@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 通信が許可されていないことが原因です。
対策
-
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"> <!-- この行を追加 -->
- その後、アプリを再ビルドしてください:
flutter clean
flutter pub get
flutter run
何故このようなことが起きる?
- 現在 Firebase Emulator を使用していて、これは開発用のローカルサーバー(
10.0.2.2
)で動作しています - ローカルサーバーは HTTP を使用して通信を行います
- Android 9 以降は、セキュリティ強化のため、デフォルトで HTTP 通信(暗号化されていない通信)をブロックする設定になっています
本番環境との違い:
- 本番環境の Firebase は
https://
で始まる URL を使用し、暗号化された通信(HTTPS)を行います - そのため、この問題は本番環境では発生しません
つまり:
- デバッグ環境:ローカルの Emulator に HTTP で接続しようとしてブロックされる
- 本番環境:Firebase の本物のサーバーに HTTPS で接続するためブロックされない
解決策として android:usesCleartextTraffic="true"
を追加するのは:
- 開発中に Emulator と通信するための一時的な設定
- リリースビルドでは必要ない(むしろセキュリティのために外すべき)設定
注意
なお、この設定は開発時のエミュレータ使用時のみに必要な設定です。
本番環境では基本的に必要ありません(Firebase の本番環境は HTTPS を使用するため)。
セキュリティ上の理由から、
- 本番環境用のビルドではこの設定を削除するか、
- 開発環境と本番環境で異なる
AndroidManifest.xml
を使用する
おしまいに
iOSでFirestoreとの疎通が取れたけど、
「Andoroid側は絶対なんか起きるだろうな」
「いやだな、いやだなー」
「こわいな、こわいなー」
・
・
・
「と思ったら、やっぱり、あるんです、問題が」
という感じで起きた問題でした。
※稲川淳二風
Discussion