AlainIb
AlainIb

Reputation: 4728

IOS React Native fetch() POST : Network Request Failed

1) The following code give me an error on IOS but work on Android.

2) On IOS i Can make fetch with "get" but "post" fails

so this don't work on ios :

    var data = new FormData();
    data.append("fileUpload", { uri: imageUri, name: filename, type: "image/jpeg" });
    data.append("filename", filename);
    data.append("name", "uploadedFile");
    const config = {
        method: "POST",
        headers: {
            Accept: "application/json",
            "Content-Type": "multipart/form-data;"
        },
        body: data
    };

    return fetch(url, config).then((response) => response.json())
        .then(res => { return res ;})
        .catch(error => {
            console.error(error);
            return { name: "network error", description: "" };
        });

i try to fix the info.plist on IOS according to other post (like React Native fetch() Network Request Failed) but the error still there

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
        <key>CFBundleDevelopmentRegion</key>
        <string>en</string>
        <key>CFBundleDisplayName</key>
        <string>myapp</string>
        <key>CFBundleExecutable</key>
        <string>$(EXECUTABLE_NAME)</string>
        <key>CFBundleIdentifier</key>
        <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
        <key>CFBundleInfoDictionaryVersion</key>
        <string>6.0</string>
        <key>CFBundleName</key>
        <string>$(PRODUCT_NAME)</string>
        <key>CFBundlePackageType</key>
        <string>APPL</string>
        <key>CFBundleShortVersionString</key>
        <string>1.0</string>
        <key>CFBundleSignature</key>
        <string>????</string>
        <key>CFBundleVersion</key>
        <string>1</string>
        <key>LSRequiresIPhoneOS</key>
        <true/> 
        <key>NSAppTransportSecurity</key>                   // i add this
        <dict>                                              // i add this
            <key>NSAllowsArbitraryLoads</key>               // i add this
            <true/>                                         // i add this
            <key>NSAllowsArbitraryLoadsInWebContent</key>   // i add this  
            <true/>                                         // i add this
        </dict>                                             // i add this 
        <key>NSCameraUsageDescription</key>
        <string>Your message to user when the camera is accessed for the first time</string>
        <key>NSLocationWhenInUseUsageDescription</key>
        <string></string>
        <key>NSMicrophoneUsageDescription</key>
        <string>Your message to user when the microsphone is accessed for the first time</string>
        <key>NSPhotoLibraryUsageDescription</key>
        <string>Your message to user when the photo library is accessed for the first time</string>
        <key>UIAppFonts</key>
        <array>
            <string>Zocial.ttf</string>
            <string>Feather.ttf</string>
        </array>
        <key>UILaunchStoryboardName</key>
        <string>LaunchScreen</string>
        <key>UIRequiredDeviceCapabilities</key>
        <array>
            <string>armv7</string>
        </array>
        <key>UISupportedInterfaceOrientations</key>
        <array/>
        <key>UIViewControllerBasedStatusBarAppearance</key>
        <false/>
        <key>LSApplicationCategoryType</key>
        <string></string>
    </dict>
    </plist>

i try to restart xcode, clean project and build all.

any advice ? thanks

Upvotes: 0

Views: 3837

Answers (1)

Ray
Ray

Reputation: 9684

iOS does not allow insecure HTTP requests. In order to do so, you have to add your domain as an exception inside your info.plist.

Add the following:

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>yourserver.com</key>
    <dict>
      <!--Include to allow subdomains-->
      <key>NSIncludesSubdomains</key>
      <true/>
      <!--Include to allow HTTP requests-->
      <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
      <true/>
      <!--Include to specify minimum TLS version-->
      <key>NSTemporaryExceptionMinimumTLSVersion</key>
      <string>TLSv1.1</string>
    </dict>
  </dict>
</dict>

Upvotes: 2

Related Questions