Как исправить ‘net::ERR_CLEARTEXT_NOT_PERMITTED’ в flutter

#flutter #flutter-dependencies

#flutter #flutter-зависимости

Вопрос:

Я реализовал WebView в flutter, но он не открывает мой веб-сайт php, который находится на сервере, что я делаю неправильно.

Я новичок в flutter и попробовал webview интегрировать веб-страницу моего веб-сайта в свое приложение, но безуспешно.

 Widget build(BuildContext context) {
    // TODO: implement build
    return WebviewScaffold(
      appBar: AppBar(iconTheme:IconThemeData(color: Colors.white),title: Text("Intake Form",style:new TextStyle(color: Colors.white,fontWeight: FontWeight.bold)),backgroundColor:Colors.indigoAccent,automaticallyImplyLeading: false),
     url: url,
      //url: "http://xxxxxxxx/",
       withJavascript: true,
       supportMultipleWindows: true,
      withLocalStorage: true,
      allowFileURLs: true,
      enableAppScheme: true,
      appCacheEnabled: true,
      hidden: false,
      scrollBar: true,
      geolocationEnabled: false,
      clearCookies: true,
       // usesCleartextTraffic="true"



    );
  }
  

Я ожидаю, что на выходе будет запущен webview, но выдается ошибка.

Ответ №1:

В главном каталоге вашего проекта Flutter у вас есть три основные папки:

 - lib         =  your Dart code
- ios         =  generated structure for iOS platform
- android     =  generated structure for Android platform
  

Нас интересует android каталог.
Когда вы откроете его, вы увидите «типичную структуру приложения для Android».

Итак, вам нужно сделать 2 вещи:

1) Добавить новый файл в res

Перейдите в каталог:

 my_flutter_project/android/app/src/main/res/
  

Создайте xml каталог (в res !)

И внутри xml добавить новый файл с именем: network_security_config.xml и содержимым:

 <?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
            <certificates src="user" />
        </trust-anchors>
    </base-config>
</network-security-config>
  

network_security_config.xml должно быть расположено в path:

 my_flutter_project/android/app/src/main/res/xml/network_security_config.xml
  

network_security_config

Здесь вы можете найти более подробную информацию об этом файле:

https://developer.android.com/training/articles/security-config

2) Изменить AndroidManifest.xml

Перейдите к:

 flutter_project/android/app/src/main/AndroidManifest.xml
  

введите описание изображения здесь

AndroidManifest.xml это XML-файл со структурой:

 <manifest>
    <application>
        <activity>
            ...
        </activity>
        <meta-data >
    </application>
</manifest>
  

Итак, для <application> СВОЙСТВ вам нужно добавить 1 строку:

 android:networkSecurityConfig="@xml/network_security_config"
  

введите описание изображения здесь

Помните, что вы должны добавить его как свойство (внутри application открывающего тега):

 <application

    SOMEWHERE HERE IS OK

>
  

Не как тег:

 <application>           <--- opening tag

    HERE IS WRONG!!!!

<application/>          <--- closing tag
  

Комментарии:

1. Какой замечательный ответ, где каждый шаг объяснен с полной ясностью!

2. Я не могу понять, почему topic starter не принял этот ответ. Это действительно работает! Спасибо, и примите мой голос

3. Ответ правильный, вот мое восприятие в соответствии с вопросом, заключается в том, что когда разработчик внедряет сайт с http: //, тогда этот файл безопасности необходим, иначе, если вы просто измените URL-адрес на https: //, вы не получите никакой ошибки в веб-представлении

4. это замечательный пример и объясняет простой и очень легкий метод работы, спасибо.

5. Не забудьте перезапустить приложение, чтобы изменения вступили в силу

Ответ №2:

установите для свойства usesCleartextTraffic значение true в вашем файле AndroidManifest, как показано ниже.

 <application
....
android:usesCleartextTraffic="true"
....>
  

Комментарии:

1. Даже с этой опцией это не работает :/ Мне пришлось запустить flutter clean , а затем снова запустить проект

2. @lonelLupu Возможно, очистка не требуется. Кажется, что достаточно остановить все приложение и перестроить его. Причина в том, что AndroidManifest не перезагружается при горячей перезагрузке / перезапуске Flutter.

3. Простой и очень легкий рабочий метод.

4. Я лично думаю, что установка этого значения в true противоречит рекомендациям Android, связанным с сетевой безопасностью; developer.android.com/guide/topics/manifest/application-element . С Android 8 это свойство по умолчанию равно false.

Ответ №3:

Android:

В flutter_project/android/app/src/main/AndroidManifest.xml

Добавить

 <application
....
android:usesCleartextTraffic="true"
....>
  

iOS:

В flutter_project/ ios/ Runner/info.plist

Добавить

 <key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>
  

Выполнить flutter clean .Затем запустите приложение.

Ответ №4:

Для ios измените info.plist ./ios/Runner/info.plist

Добавьте следующее:

 <key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>
  

и запустите flutter clean перед повторным запуском приложения

Ответ №5:

  • сделать network_security_config.xml файл.

 <?xml version="1.0" encoding="utf-8"?>
        <network-security-config>
            <base-config cleartextTrafficPermitted="true">
                <trust-anchors>
                    <certificates src="system" />
                </trust-anchors>
            </base-config>
        </network-security-config>  

введите описание изображения здесь

  • добавьте эти две строки в файл манифеста в тег приложения.

Комментарии:

1. Где именно этот файл должен быть размещен?

2. в папке res создайте папку xml, а затем поместите этот XML-файл .

3. Я работаю в flutter, поэтому там нет папки res.

4. Согласно документам: Этот флаг игнорируется на Android 7.0 (уровень API 24) и выше, если присутствует конфигурация сетевой безопасности Android.