ReactNative Android все запросы не выполняются, пока iOS работает - PullRequest
1 голос
/ 29 января 2020

Внезапно при отладке Android все сетевые запросы не выполняются, но в iOS он работает.

curl --data "email=test@gmail.com" https://unblnd.com/api/login работает правильно и обеспечивает ожидаемый результат. При использовании http запрос возвращается постоянно, но локальное соединение не работает, или это не должно быть проблемой?

Сбой на android физических устройствах и android эмуляторах в URL-адресах локального и удаленного API.

$ react-native info

info Fetching system and libraries information...
  ...
  npmPackages:
    react: 16.9.0 => 16.9.0 
    react-native: 0.61.5 => 0.61.5 
  npmGlobalPackages:
    react-native-cli: 2.0.1
    react-native-git-upgrade: 0.2.7

Файл конфигурации

if (__DEV__) {
  config = {
    clientId: '***',
    url: 'http://192.168.0.***:8000/api',
  };
} else {
  config = {
    clientId: '***',
    url: 'http://unblnd.com/api',
  };
}

Мы сделали эту функцию fetchApi, которая заботится о методах get и post

import apiConfig from './config';
import * as authSelectors from 'app/services/auth/selectors';

export const fetchApi = async (endPoint, method = 'get', body = {}) => {
  console.log(`start fetchApi ${method} ${endPoint}`);
  const accessToken = authSelectors.get().tokens.access.value;
  const accessType = authSelectors.get().tokens.access.type;
  let headers = {
    ...(accessToken
      ? {
          Authorization: `${accessType} ${accessToken}`,
          Accept: 'application/json',
        }
      : {
          'Content-Type': 'application/json',
        }),
  };
  let response;
  if (method == 'get' || Object.keys(body) == 0) {
    response = await fetch(`${apiConfig.url}${endPoint}`, {
      method: method,
      headers: headers,
    });
  } else {
    var formData = new FormData();
    Object.keys(body).forEach(type => {
      if (typeof body[type] === 'object') {
        body[type] = JSON.stringify(body[type]);
      }
      formData.append(type, body[type]);
    });
    console.log('sending data: ' + JSON.stringify(formData));
    response = await fetch(`${apiConfig.url}${endPoint}`, {
      method: method,
      headers: headers,
      body: formData,
    });
  }
  console.log('fetch response: ' + JSON.stringify(response));
  let responseJsonData = await response.json();
  console.log('fetch response json: ' + JSON.stringify(responseJsonData));
  return responseJsonData;
};

Что было опробовано ?

  • android:usesCleartextTraffic="true" добавлено в AndroidManifest.xml;
  • Добавлен файл res / xml / network_security_config. xml;
  • Использование инструментов: ...

AndroidManifest. xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
  package="com.unblnd">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.VIBRATE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    <application
      android:networkSecurityConfig="@xml/network_security_config"
      android:name=".MainApplication"
      android:label="@string/app_name"
      android:icon="@mipmap/ic_launcher"
      android:roundIcon="@mipmap/ic_launcher_round"
      android:allowBackup="false"
      android:theme="@style/AppTheme"
      android:usesCleartextTraffic="true"
      tools:targetApi="23">
        <uses-library
            android:name="org.apache.http.legacy"
            android:required="false" />
      <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
        android:windowSoftInputMode="adjustResize">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
      </activity>
      <activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
      <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id"/>
    </application>

</manifest>

Есть похожие темы на эти вопросы, но, похоже, это не помогло добавить взломать AndroidManifest.

...