Внезапно при отладке 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.