React Native + Android | TypeError: Network request fail の解決方法
概要
React Native + Android のプロジェクトで yarn android
コマンドを叩いて開発環境を起動して Dockerコンテナ で起動した GraphQL のエンドポイント(http://localhost:4000/graphql
)とAPI通信を実施しようとすると networkError TypeError: Network request fail
のエラーが出現してAPI通信が出来なかったのですが、このエラーを解決してAPI通信を成功させるまでにかなり時間がかかったので、エラーを解決するまでの手順を備忘録としてまとめます。
つまり、この記事を通して「達成したいこと」は以下です。
達成したいこと
React Native + Android + GraphQL で http通信 が出来るようにしたい
前提条件
- "react": "18.1.0"
- "react-native": "0.70.2"
- "@apollo/client": "^3.6.9"
- "graphql": "^16.6.0"
- Android の開発環境が
yarn android
で起動する状態であること
なぜ、Androidでhttp通信が出来ないのか?
詳しくは、クリアテキスト トラフィックをオプトアウトする | Android Developers を確認してほしいのですが、Android 9(API レベル 28)以上から cleartextTrafficPermitted="false"
がデフォルトで設定されるため、暗号化されていないHTTP通信(つまり https の s が付いてない通信)に失敗します。なのでhttp通信を有効にするための設定を実施する必要があるわけです。
では、http通信を有効にするための設定はどうやればいいのか?
http通信を有効にするための具体的な手順
前提条件
android / app / src / main / AndroidManifest.xml
にネットワークに接続するためのパーミッションである <uses-permission android:name="android.permission.INTERNET" />
が付与されているかどうかを確認してください。もし付与されていない場合は追加してください。
<!-- android / app / src / main / AndroidManifest.xml -->
<uses-permission android:name="android.permission.INTERNET" />
<application>
...
</application>
android:networkSecurityConfig="@xml/network_security_config"
追加
1. android / app / src / debug / AndroidManifest.xml に Android の開発環境を起動するときは、Android の Build Type は Debugモード になるため、debugディレクトリ配下の AndroidManifest.xml
を編集する必要があります。
android / app / src / debug / AndroidManifest.xml
に android:networkSecurityConfig="@xml/network_security_config"
を追加します
<!-- android / app / src / debug / AndroidManifest.xml -->
<application
android:usesCleartextTraffic="true"
android:networkSecurityConfig="@xml/network_security_config"
tools:targetApi="28"
tools:ignore="GoogleAppIndexingWarning">
<activity android:name="com.facebook.react.devsupport.DevSettingsActivity" android:exported="false" />
</application>
2. android / app / src / debug / res / xml / network_security_config.xml を新規作成
以下キャプチャのディレクトリ構成でファイルを新規作成します
ディレクトリ構成 |
---|
3. network_security_config.xml を編集
network_security_config.xml に以下の内容を記載します
<!-- android / app / src / debug / res / xml / network_security_config.xml -->
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">localhost</domain>
<!-- Wi-FiのIPアドレスをここに追加します -->
<domain includeSubdomains="true">{Wi-FiのIPアドレス}</domain>
</domain-config>
</network-security-config>
Wi-FiのIPアドレスは ifconfig | grep broadcast
で確認できます。
詳しくは Linux + macOS | 現在接続している Wi-Fi の IPアドレス を ターミナルで確認する方法が超簡単だった | Zenn を確認してください
Wi-FiのIPアドレスを確認できたら
network_security_config.xml
に
Wi-FiのIPアドレスを記載します
http://localhost:4000/graphql
から http://{Wi-FiのIPアドレス}:4000/graphql
に変更する
4. GraphQLエンドポイントのURLドメインを
http://localhost:4000/graphql
から
http://{Wi-FiのIPアドレス}:4000/graphql
に変更します
5. yarn android で開発環境を起動する
1 から 4 までの手順を実施した上で
yarn android
で開発環境を起動します。
もしうまく動かない場合は、キャッシュを削除した上で
再度、開発環境を起動してみると良いです。
# androidディレクトリに移動する
cd android
# ビルド後に生成されたファイルを削除
rm -rf android/app/build
# gradlew を clean する
./gradlew clean
# Android の開発環境を起動する
yarn android
これで自分は開発環境のGraphQLサーバーから
データを取得することができるようになりました。
参考文献
- [Android] Android 9 can not access bundler via cleartext request without additional config
- Android 9でHTTP通信を有効にする方法
- Android 9.0でReactNativeのReloadが失敗する
- FlutterでlocalhostのAPIサーバーに接続する
- Androidのビルドバリアントをイチから理解する
- Androidアプリのビルド設定管理(Product Flavor、Build Type)
- Android PでtargetSdkVersionを28に指定した場合にHTTP通信が失敗する
- React Native Android: Network Request Failed (using localhost)
Discussion