Android 8 : 일반 텍스트 HTTP 트래픽이 허용되지 않습니다


1038

Android 8 사용자의 백엔드 피드를 사용하는 내 앱에 콘텐츠가 표시되지 않는다는보고가있었습니다. 조사 결과 Android 8에서 다음과 같은 예외가 발생했습니다.

08-29 12:03:11.246 11285-11285/ E/: [12:03:11.245, main]: Exception: IOException java.io.IOException: Cleartext HTTP traffic to * not permitted
at com.android.okhttp.HttpHandler$CleartextURLFilter.checkURLPermitted(HttpHandler.java:115)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:458)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:127)
at com.deiw.android.generic.tasks.AbstractHttpAsyncTask.doConnection(AbstractHttpAsyncTask.java:207)
at com.deiw.android.generic.tasks.AbstractHttpAsyncTask.extendedDoInBackground(AbstractHttpAsyncTask.java:102)
at com.deiw.android.generic.tasks.AbstractAsyncTask.doInBackground(AbstractAsyncTask.java:88)
at android.os.AsyncTask$2.call(AsyncTask.java:333)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
at java.lang.Thread.run(Thread.java:764)

(패키지 이름, URL 및 기타 가능한 식별자를 제거했습니다)

Android 7 이하에서는 모든 것이 작동하지만 android:usesCleartextTraffic매니페스트에서 설정 true하지 않으며 (어쨌든 기본값으로 도움이되지 않도록 설정 ) 네트워크 보안 정보를 사용하지 않습니다. 를 호출 하면 동일한 apk 파일을 사용하여 이전 버전의 Android 8에서 NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted()반환 됩니다. Google에서 Android O에 대한 정보를 찾으려고했지만 성공하지 못했습니다.falsetrue


28
이 CodeLab을 확인 하되 사용하십시오cleartextTrafficPermitted="true"
ArtiomLK

5
서버가 HTTPS에서 HTTP로 리디렉션되기 때문에 유지 관리하는 앱에서 발생합니다.
Big McLargeHuge

답변:


2198

에 따르면 네트워크 보안 구성 -

Android 9 (API 레벨 28)부터 일반 텍스트 지원이 기본적으로 사용되지 않습니다.

또한 살펴보십시오- https://koz.io/android-m-and-the-war-on-cleartext-traffic/을

코드 랩 설명 - https://codelabs.developers.google.com/codelabs/android-network-security-config/index.html

옵션 1 -

먼저 "http : //"대신 "https : //"로 URL을 누르십시오.

옵션 2-

res / xml / network_security_config.xml 파일 작성-

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">api.example.com(to be adjusted)</domain>
    </domain-config>
</network-security-config>

AndroidManifest.xml-

<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
    <uses-permission android:name="android.permission.INTERNET" />
    <application
        ...
        android:networkSecurityConfig="@xml/network_security_config"
        ...>
        ...
    </application>
</manifest>

옵션 3-

android : usesCleartextTraffic Doc

AndroidManifest.xml-

<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
    <uses-permission android:name="android.permission.INTERNET" />
    <application
        ...
        android:usesCleartextTraffic="true"
        ...>
        ...
    </application>
</manifest>

또한 @ david.s의 답변이 지적한 것처럼 android:targetSandboxVersion문제가 될 수 있습니다.

매니페스트 문서 에 따르면 -

android:targetSandboxVersion

이 앱에서 사용할 대상 샌드 박스입니다. 샌드 박스 버전 번호가 높을수록 보안 수준이 높아집니다. 기본값은 1입니다. 이 속성을 2로 설정하면 앱이 다른 SELinux 샌드 박스로 전환됩니다. 레벨 2 샌드 박스에는 다음 제한 사항이 적용됩니다.

  • 기본값 usesCleartextTrafficNetwork Security Config에서 은 false입니다.
  • UI 공유는 허용되지 않습니다.

따라서 옵션 4-

당신이있는 경우 android:targetSandboxVersion<manifest>그 다음에 그것을 감소1

AndroidManifest.xml-

<?xml version="1.0" encoding="utf-8"?>
<manifest android:targetSandboxVersion="1">
    <uses-permission android:name="android.permission.INTERNET" />
    ...
</manifest>

4
@HrishikeshKadam 귀하의 답변은 대단히 높이 평가되지만 P의 최신 릴리스에는 다른 단계가 있어야합니까? 내 질문을 참조하십시오 stackoverflow.com/questions/51770323/…
spartygw

8
ClearText HTTP는 https 대신 http 사이트를 사용하고 있음을 의미합니까?
Tom Hammond

4
옵션 1을 domain-config에서 base-config로 변경하면이 문제가 해결되었습니다.
GregM

165
모든 개발자가 추가 할 경우이 Android 보안 기능의 요점은 무엇입니까 android:usesCleartextTraffic="true"?
과일

69
이 문제에 대한 최상의 해결책은 언급하지 않았습니다. HTTPS를 사용하십시오. 이 답변에 언급 된 옵션은 최후의 수단이어야합니다.
Christian Brüggemann

131

AndroidManifest 에서이 매개 변수를 찾았습니다.

android:networkSecurityConfig="@xml/network_security_config"

@ xml / network_security_config는 network_security_config.xml에서 다음과 같이 정의됩니다.

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <!--Set application-wide security config using base-config tag.-->
    <base-config cleartextTrafficPermitted="false"/>
</network-security-config>  

방금 cleartextTrafficPermitted를 true로 변경했습니다.


11
+1 다른 답변에서 제안한대로 하위 집합을 유지하는 대신 앱에 사용 된 모든 도메인에 적용하려는 경우에 유용합니다.
마틴 가격

2
성능 자세한 내용은 여기 : codelabs.developers.google.com/codelabs/…
xxxxxxxxxxxxx

변경 후 앱 다시 설치
Ssenyonjo

118

나의 문제 안드로이드 9 http로 도메인을 통해 웹보기에에서 솔루션을 탐색 한 이 답변

<application 
    android:networkSecurityConfig="@xml/network_security_config"
    ...>

과:

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" />
        </trust-anchors>
    </base-config>
</network-security-config>

1
이 답변 만 나를 위해 일했습니다. 다른 답변은 저에게 효과적이지 않습니다. 이것이 가장 좋은 대답입니다.
Ahamadullah Saikat

3
완벽하게 작동하십시오! 정말 고맙습니다!
TedVN

1
이것도 저에게도 효과가
Sina Rahimi

어떻게 든 이것을 다시 쓸 수 있습니까 gradle?
Morozov 2018

2
해결책 중 어느 것도 효과가 없었습니다. 이거 빼고 .. !! 정말 감사합니다.
Kunal Kakkad '11

93

디버깅하는 동안 일반 텍스트 만 허용하고 프로덕션 환경에서 일반 텍스트를 거부하면 보안 상 이점을 유지할 수 있습니다. https를 지원하지 않는 개발 서버에 대해 앱을 테스트하기 때문에 유용합니다. 다음은 프로덕션 환경에서 https를 적용하는 방법이지만 디버그 모드에서 일반 텍스트를 허용합니다.

build.gradle에서 :

// Put this in your buildtypes debug section:
manifestPlaceholders = [usesCleartextTraffic:"true"]

// Put this in your buildtypes release section
manifestPlaceholders = [usesCleartextTraffic:"false"]

AndroidManifest.xml의 애플리케이션 태그에서

android:usesCleartextTraffic="${usesCleartextTraffic}"

1
그래도 API 23 이상에서만 사용됩니다. api 독립 솔루션을 원하는 경우 승인 된 솔루션 : stackoverflow.com/questions/46302058/… 좋은 옵션입니다 ...
Rik van Velzen

질문 : 앱이 의도적으로 http 또는 https 일 수있는 웹 서버를 사용하는 경우 http URL이 웹 서비스를 사용할 수 있어야하더라도 CleartextTraffic : "false"를 사용합니까? 따라서 true로 설정하면 기본적으로 https 서비스가 일반 텍스트를 보내지 않습니까?
whyoz 2016 년

2
고마워요! 허용되는 답변이어야합니다. 그것이 작동하게하는 것이 가장 안전한 방법입니다
dm707

63

당신의 URL로부터의 변경 HTTPHTTPS ;

작동합니다 !!!


97
이 방법은 어떻습니까? 서버 URL이 https가 아닌 경우 핸드 셰이크 예외가 발생합니다.
kkarakk

18
(생산 환경에서) 옳은 일이기 때문에 공감했습니다. HTTP가 아닌 HTTPS가 기본값이어야합니다.
beetstra

28
@beetsta 컨텐츠를 제공하는 대상을 완전히 제어 할 수 있다고 가정합니다. 따라서이 답변은 본질적으로 순진하거나 플립 팬트입니다.
마틴 가격

10
@beetstra 디버깅하는 동안 LOCAL 시스템에서 HTTPS 기본값을 사용해야하는 이유는 무엇입니까? 구글 패터 니즘의 또 다른 예일뿐입니다. 운 좋게도 타일러의 솔루션으로 디버그 모드 에서이 문제를 해결할 수 있습니다.
Bevor

2
대답은 질문에 무지합니다. 소규모 회사의 사람들과 달리 언젠가 모든 스테이징 서버에 대한 SSL이 없습니다. 답은 누군가가 Facebook 게시물에서 문법을 수정하는 것만 큼 나쁘며 질문에 전혀 대답하지도 않고 고치지도 않습니다.
Nick Turner

42
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">***Your URL(ex: 127.0.0.1)***</domain>
    </domain-config>
</network-security-config>

위에 제공된 제안에서 http://xyz.abc.com/mno/ 로 내 URL을 제공하고있었습니다.

xyz.abc.com으로 변경 한 다음 작동하기 시작했습니다.


8
도메인! = URL. "http"는 프로토콜입니다. 프로토콜은 도메인의 일부가 아닙니다.
놀라운 1

정답입니다. 감사합니다. 도메인 특정 구성을 설정하는 것이 기본 구성을 설정하는 것보다 낫습니다
trinadh thatakula

이것은 정확합니다. FQDN 만 지원되며 IP 주소는 없습니다 (위에 고정).
Martin Zeitler

도메인 10.0.2.2에서는 작동하지 않습니다. 포트 번호를 추가해야합니까?
Ssenyonjo

27

좋아, 그것은 ⇒⇒ 아닙니다 . 수천 번 반복해서 매니페스트추가 하지만 이것에 근거하는 힌트이지만 추가 이점 (및 배경 정보)을 제공합니다.

Android에는 src-Directory에 대한 일종의 덮어 쓰기 기능이 있습니다.

기본적으로

/ app / src / 메인

그러나 AndroidManifest.xml을 덮어 쓰는 디렉토리를 추가 할 수 있습니다. 작동 방식은 다음과 같습니다.

  • 디렉토리 만들기 / app / src / debug를
  • 내부에서 AndroidManifest.xml 생성

이 파일 안에 모든 규칙을 넣을 필요는 없지만 / app / src /에서 덮어 쓰려는 규칙 만 main / AndroidManifest.xml 쓰려

요청 된 CLEARTEXT-Permission에 대한 예는 다음과 같습니다.

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

    <application
            android:usesCleartextTraffic="true"
            android:name=".MainApplication"
            android:label="@string/app_name"
            android:icon="@mipmap/ic_launcher"
            android:allowBackup="false"
            android:theme="@style/AppTheme">
    </application>

</manifest>

이 지식을 통해 디버그 에 따라 권한을 오버로드하는 것이 1,2,3만큼 쉬워졌습니다. 메인 | 환경을 해제하십시오 .

그것에 큰 이점은 ... 당신은 당신의 프로덕션 매니 페스트에 디버그 물건이 없으며 똑바로 쉽고 유지 보수가 쉬운 구조를 유지


3
이것은 확실히 올바른 해결책입니다. Android는 이러한 보안 설정을 이유로 추가했기 때문에 그대로 유지해야합니다. 귀사의 솔루션을 사용하면 안전하지 않은 로컬 환경에서 테스트 할 수 있으며 프로덕션 빌드에는 여전히 권장되는 보안 설정이 있습니다. 감사합니다!
쿠 쿠

25

누군가에게 유용 할 수 있습니다.

우리는 최근에 Android 9와 동일한 문제를 겪었지만 WebView 내에서 일부 Urls 만 표시하면되며 특별한 것은 없습니다. 따라서 android:usesCleartextTraffic="true"Manifest에 추가하는 것이 효과가 있었지만이를 위해 전체 앱의 보안을 손상시키고 싶지 않았습니다. 수정은 링크를 변경이었다 그래서 httphttps


3
일부 URL 만 표시하려면 WebView가 필요하지 않습니다. 난 그냥 TextView를 사용합니다. ;) html 페이지를 표시한다고 가정합니다. 서버가 SSL을 제공하는 경우에만 수정 사항이 작동합니다. 단순히 링크를 변경할 수 없습니다.
놀라운 1

2
이것은 가능한 최선의 옵션이지만, 성능상의 이유나 단순한 텍스트 HTTP로 리소스를 사용할 수 없기 때문에 항상 선택할 수있는 것은 아닙니다.
다카 틴

"전체 앱의 보안을 손상시키고 싶지 않았습니다."어떤 보안 위험이 발생할 수 있습니까? 내 경우에는 하나의 URL이 없으므로 매니페스트에 추가 할 수 없습니다.
Robert Williams

안녕하세요 @RobertWilliams는 명확한 트래픽이 암호화되지 않은 트래픽이 허용됨을 의미합니다. 다음은 blogpost medium.com/@son.rommer/…입니다.
sparkly_frog

같은 문제가 다시 발생했습니다. 모든 솔루션을 시도했습니다.
Ahamadullah Saikat

22

React Native 프로젝트

RN 0.59에서 이미 수정되었습니다. 업그레이드 차이를 0.58.6에서 0.59로 찾을 수 있습니다. RN 버전을 업그레이드하지 않고도 적용 할 수 있습니다. 아래 단계를 따르십시오.

파일을 작성하십시오.

안드로이드 / 앱 / src / 디버그 /res/xml/react_native_config.xml -

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
  <domain-config cleartextTrafficPermitted="true">
    <domain includeSubdomains="false">localhost</domain>
    <domain includeSubdomains="false">10.0.2.2</domain>
    <domain includeSubdomains="false">10.0.3.2</domain>
  </domain-config>
</network-security-config>

안드로이드 / 앱 / src / 디버그 /AndroidManifest.xml -

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools">

  <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

  <application tools:targetApi="28"
      tools:ignore="GoogleAppIndexingWarning" 
      android:networkSecurityConfig="@xml/react_native_config" />
</manifest>

허용 된 답변을 확인하여 근본 원인을 확인하십시오.


2
나는 react-native 0.59.5를 사용하고 동일한 문제가 발생하므로 제안대로 AndroidManifest.xml을 수동으로 설정해야합니다.
Cristian Mora

11

좋아, 나는 이것을 알아 냈다. Manifest 매개 변수 android:targetSandboxVersion="2"때문입니다. Instant App 버전도 있기 때문에 추가했습니다. 즉, 사용자가 Instant App에서 일반 앱으로 한 번 업그레이드하면 데이터 전송이 끊어지지 않습니다. 그러나 모호한 설명이 제안하는 것처럼 :

이 앱에서 사용하려는 대상 샌드 박스를 지정합니다. Sanbox 버전이 높을수록 보안 수준이 높아집니다.

이 속성의 기본값은 1입니다.

또한 적어도 안드로이드 8에서 새로운 수준의 보안 정책을 추가합니다.


9

이미 존재하는 안드로이드 매니페스트 파일 에서이 줄을 제거했습니다.

 android:networkSecurityConfig="@xml/network_security_config" 

그리고 추가

android:usesCleartextTraffic="true"

매니페스트의 응용 프로그램 태그에

<application
    android:usesCleartextTraffic="true"
    android:allowBackup="true"
    android:label="@string/app_name"
    android:largeHeap="true"
    android:supportsRtl="true"
    android:theme="@style/AppTheme"
    >

그런 다음 android.9 및 10에서 허용되지 않는 이 오류 Cleartext HTTP 트래픽을 android.openstreetmap.nl로 허용하지 않습니다. 안드로이드 8에서도 작동합니다.


8

이러한 다양한 답변을에 적용하려면 Xamarin.Android클래스 및 어셈블리 레벨 속성을 사용하고AndroidManifest.xml

물론 인터넷 허가가 필요합니다 (duh ..) :

[assembly: UsesPermission(Android.Manifest.Permission.Internet)]

참고 : 일반적으로 어셈블리 레벨 속성은 AssemblyInfo.cs파일에 추가 되지만 using위와 아래의 파일 에는 추가됩니다 namespace.

그런 다음 Application 서브 클래스 (필요한 경우 하나 작성)에서 파일에 NetworkSecurityConfig대한 참조를 추가 할 수 있습니다 Resources/xml/ZZZZ.xml.

#if DEBUG
[Application(AllowBackup = false, Debuggable = true, NetworkSecurityConfig = "@xml/network_security_config")]
#else
[Application(AllowBackup = true, Debuggable = false, NetworkSecurityConfig = "@xml/network_security_config"))]
#endif
public class App : Application
{
    public App(IntPtr javaReference, Android.Runtime.JniHandleOwnership transfer) : base(javaReference, transfer) { }
    public App() { }

    public override void OnCreate()
    {
        base.OnCreate();
    }
}

Resources/xml폴더에 파일을 만듭니다 (xml 필요한 경우 폴더 ).

예제 xml/network_security_config파일, 필요에 따라 조정하십시오 (다른 답변 참조).

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
          <domain includeSubdomains="true">www.example.com</domain>
          <domain includeSubdomains="true">notsecure.com</domain>
          <domain includeSubdomains="false">xxx.xxx.xxx</domain>
    </domain-config>
</network-security-config>

다음에서 UsesCleartextTraffic매개 변수를 사용할 수도 있습니다 ApplicationAttribute.

#if DEBUG
[Application(AllowBackup = false, Debuggable = true, UsesCleartextTraffic = true)]
#else
[Application(AllowBackup = true, Debuggable = false, UsesCleartextTraffic = true))]
#endif

doamin이 아니고 로컬 호스트 주소가 192.168 인 경우 응용 프로그램이 인터넷이 아닌 로컬 네트워크에서 작동하지 않습니다.
rogue39nin

및 xamrian 형태의 구문 무엇인가
rogue39nin

@ rogue39nin 내 답변의 마지막 부분을 사용하십시오 :UsesCleartextTraffic = true
SushiHangover 2016 년

4

내 응용 프로그램을 개발하는 동안 동일한 "Cleartext HTTP traffic not allowed"오류가 표시됩니다. 내 응용 프로그램에서 네트워크 호출에 Retrofit2를 사용하고 있으며 두 가지 프로젝트 환경 (dev & production)이 있습니다. 내 프로덕션 도메인에 HTTPS 호출이 포함 된 SSL 인증서가 있으며 개발자는 https가 없습니다. 구성은 빌드 특징에 추가됩니다. 그러나 dev로 변경하면이 문제가 발생합니다. 그래서 그에 대한 솔루션을 추가했습니다.

매니페스트에 일반 텍스트 트래픽을 추가했습니다.

 android:usesCleartextTraffic="true"

그런 다음 개조 구성 클래스 OKHttp 생성 시간에 연결 사양을 추가했습니다.

 .connectionSpecs(CollectionsKt.listOf(ConnectionSpec.MODERN_TLS, ConnectionSpec.CLEARTEXT))

전체 OkHttpClient 생성은 다음과 같습니다.

OkHttpClient okHttpClient = new OkHttpClient.Builder()
        .readTimeout(10, TimeUnit.SECONDS)
        .connectTimeout(10, TimeUnit.SECONDS)
        .cache(null)
        .connectionSpecs(CollectionsKt.listOf(ConnectionSpec.MODERN_TLS, ConnectionSpec.CLEARTEXT))
        .addInterceptor(new NetworkInterceptor(context))
        .addInterceptor(createLoggingInterceptor())
        .addInterceptor(createSessionExpiryInterceptor())
        .addInterceptor(createContextHeaderInterceptor())
        .build();

4

2019 년 12 월 이온-4.7.1 업데이트

<manifest xmlns:tools=“http://schemas.android.com/tools”>

<application android:usesCleartextTraffic=“true” tools:targetApi=“28”>

위의 내용을 android manifest .xml 파일에 추가하십시오

이온의 이전 버전

  1. config.xmlIonic Project에 다음이 있는지 확인하십시오 .

    <edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application" xmlns:android="http://schemas.android.com/apk/res/android">
                <application android:networkSecurityConfig="@xml/network_security_config" />
                <application android:usesCleartextTraffic="true" />
            </edit-config>
  2. 이온 성 Cordova 빌드 안드로이드를 실행하십시오. 플랫폼 아래에 Android 폴더를 만듭니다.

  3. Android Studio를 열고 프로젝트 project-platforms-android에있는 Android 폴더를 엽니 다. gradle을 만들도록 몇 분 동안 그대로 두십시오.

  4. gradle build완료 후에 포함 minSdVersion에 대한 오류가 발생합니다 manifest.xml. 이제 우리가하는 일은에서 제거 <uses-sdk android:minSdkVersion="19" />하는 것 manifest.xml입니다.

    두 위치에서 모두 제거했는지 확인하십시오.

    1. 앱 → 매니페스트 → AndroidManifest.xml.
    2. CordovaLib → 매니페스트 → AndroidManifest.xml.

    이제 gradle을 다시 빌드하고 성공적으로 빌드하십시오.

  5. App → manifest →의 Application 태그에 다음이 있는지 확인하십시오 Androidmanifest.xml.

    <application
    android:networkSecurityConfig="@xml/network_security_config"  android:usesCleartextTraffic="true" >
  6. network_security_config(app → res → xml → network_security_config.xml)를 엽니 다 .

    다음 코드를 추가하십시오 :

    <?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
        <domain-config cleartextTrafficPermitted="true">
            <domain includeSubdomains="true">xxx.yyyy.com</domain>
        </domain-config>
    </network-security-config>

xxx.yyyy.comHTTP API의 링크는 다음과 같습니다 . URL 앞에 Http를 포함하지 않아야합니다.

참고 : 이제 Android Studio (빌드-빌드 번들 / APK-빌드 APK)를 사용하여 앱을 빌드하면 해당 앱을 사용할 수 있으며 Android Pie에서 제대로 작동합니다. ionic Cordova build android를 사용하여 앱을 빌드하려고하면이 모든 설정을 무시하므로 Android Studio를 사용하여 프로젝트를 빌드하십시오.

이전 버전의 앱이 설치되어있는 경우 앱을 제거하고 사용해보십시오. 그렇지 않으면 오류가 발생합니다.

앱이 설치되지 않았습니다


이온? 코르도바? 따라서 일반적인 Android 빌드는 아니지만 대신 프런트 엔드 기술을 사용 하여 기본 앱을 빌드하는 프레임 워크 입니다.
주말

Ionic은 안드로이드 앱에서 웹 구현을 제공하며 Cordova는 마이크, 카메라와 같은 안드로이드 기본 기능에 액세스하는 데 도움이됩니다.
Gvs Akhil

3

파일 작성-res / xml / network_security.xml

network_security.xml에서->

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">192.168.0.101</domain>
    </domain-config>
</network-security-config>

AndroidManifests.xml을 엽니 다.

 android:usesCleartextTraffic="true" //Add this line in your manifests

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:usesCleartextTraffic="true"
        android:theme="@style/AppTheme">

3

이것은 보안상의 이유로 수행 되며 가능한 경우 항상 HTTPS (HTTP Secure )를 사용하는 것이 좋습니다.
자세한 내용은 여기를 참조하십시오

상태에 따라이 문제에 대한 여러 가지 해결책이 있습니다.

자사 서비스와의 통신을 시도하는 경우 IE : 자체 웹 서버

서버 측 : 해당 서버에 HTTPS 지원을 추가하고 HTTP 대신 HTTPS를 사용해야합니다. 요즘 LetsEncrypt 와 같은 서비스를 사용하여 무료로 할 수도 있습니다.
클라이언트 측 할 수도 있습니다 HttpURLConnection. java.net패키지 에서 패키지를 사용하는 HttpsURLConnection경우java.net.ssl 스위치가 노력해야하므로 패키지, 그것은 비슷한하지 않을 경우 동일한 API가 있습니다.

Google, Facebook, 날씨 서비스 등과 같은 타사 서비스를 사용하는 경우

통신하는 서비스가 HTTPS (대부분의 경우)를 지원하는 경우 요청 URL을에서 (으) http://abc.xyz로 변경하면 됩니다 https://abc.xyz.

최후의 수단으로, 통신하려는 타사 서비스가 HTTPS 또는 다른 형태의 보안 통신을 지원하지 않는 경우이 답변을 사용할 수 있지만 다시 말하지만 이것이 필요한 많은 목적을 상실하므로 권장하지 않습니다 보안 기능.


2

제 경우에는 URL이 브라우저에서도 작동하지 않습니다.

https://www.google.com/에서 확인합니다.

webView.loadUrl("https://www.google.com/")

그리고 그것은 나를 위해 일했습니다.


myWebView.loadUrl ( "www.site.com"); 또한 웹 마스터가 SSL을 HTTPS로 사용하지 않고 HTTP 만 사용하는 경우에도 작동합니다. 빈 페이지가 표시 될 수 있습니다.
Bay

주어진 URL이 웹 브라우저에서 작동하면 웹보기에서 사용할 수 있습니다. 그렇지 않으면이 오류가 표시됩니다.
Mayuresh Deshmukh

때로는 오류가 발생한다는 것을 알고 있지만 대부분 빈 페이지가 실행되는 것을 볼 수 있습니다. 빈 페이지가 표시되는 이유를 모르겠으며 확대 / 축소 가능을 true로 설정했습니다.
Bay


2

대한 Xamarin.Android 개발자는 반드시 HttpClient를 구현하고 SSL / TLS는 기본값으로 설정되어 있습니다.

Andorid 옵션-> 고급 Android 옵션에서 찾을 수 있습니다.

여기에 이미지 설명을 입력하십시오


2

@PabloCegarra의 작업 답변은 다음과 같습니다.

<?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>

다음에 관한 보안 경고가 표시 될 수 있습니다. cleartextTrafficPermitted="true"

허용 목록에 해당하는 도메인을 알고 있다면 허용 된 답변과 위의 답변을 모두 혼합해야합니다.

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="false">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">books.google.com</domain>
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </domain-config>
</network-security-config>

이 코드는 저에게 효과적이지만 내 앱은 books.google.com에서만 데이터를 검색해야합니다. 이런 식으로 보안 경고가 사라집니다.


2
 cleartext support is disabled by default.Android in 9 and above

 Try This one I hope It will work fine

1 Step:->  add inside android build gradle (Module:App)
            useLibrary 'org.apache.http.legacy'

  android {
               compileSdkVersion 28
              useLibrary 'org.apache.http.legacy'

          }

그런 다음 2 단계 :-> manifest 응용 프로그램 태그 안에 manifest 추가

<application
    android:networkSecurityConfig="@xml/network_security_config">//add drawable goto Step 4

   // Step --->3  add to top this line  
     <uses-library
        android:name="org.apache.http.legacy"
        android:required="false" />

</application>

// 4 단계 --- >> Drawable 생성 >> Xml 파일 >> 이름을 >> 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>

aosp에서 이것을 변경할 수 있습니까?
그림자

@Shadow 예, 변경할 수 있습니다.
Ashif

정확히 어디에서 변경할 수 있는지 알고 싶습니다.
Shadow

@Shadow <base-config cleartextTrafficPermitted = "true"> <trust-anchors> <certificates src = "system"/> </ trust-anchors> </ base-config> <domain-config cleartextTrafficPermitted = "true"> <도메인 includeSubdomains = "true"> www.yourwebsidedomain.com </ domain> </ domain-config>
Ashif

아니!! 다시 응용 프로그램 측면에서 말하고 있습니다. framework / <> 폴더 클래스에서 변경하는 방법을 묻고 있습니까?
Shadow

1

React Native 0.58.5 이상 버전으로 업그레이드하십시오. 그들은이 includeSubdomainRN 0.58.5 자신의 설정 파일에.

변경 로그

Rn 0.58.5에서는 network_security_config서버 도메인으로 선언 했습니다. 네트워크 보안 구성을 통해 앱은 특정 도메인에서 일반 텍스트 트래픽을 허용 할 수 있습니다. 따라서 android:usesCleartextTraffic="true"매니페스트 파일의 응용 프로그램 태그를 선언 하여 추가 노력을 기울일 필요가 없습니다 . RN 버전을 업그레이드하면 자동으로 해결됩니다.


1

API 버전 9.0을 변경 한 후 YOUR-API.DOMAIN.COM에 대한 일반 텍스트 HTTP 트래픽이 허용되지 않습니다 (targetSdkVersion = "28"). xamarin, xamarin.android 및 Android 스튜디오에서.

xamarin, xamarin.android 및 android studio에서이 오류를 해결하는 두 단계

1 단계 : 파일 resources / xml / network_security_config.xml 작성

network_security_config.xml에서

<?xml version="1.0" encoding="utf-8" ?>
<network-security-config>
  <domain-config cleartextTrafficPermitted="true">
    <domain includeSubdomains="true">mobapi.3detrack.in</domain>
  </domain-config>
</network-security-config>

2 단계 : AndroidManifest.xml 업데이트-

애플리케이션 태그에 android : networkSecurityConfig = "@ xml / network_security_config"를 추가하십시오. 예 :

<application android:label="your App Name" android:icon="@drawable/icon" android:networkSecurityConfig="@xml/network_security_config">

1

헤더 에이 매개 변수를 추가하면 apiSauce React Native의 문제가 해결되었습니다.

"Content-Type": "application/x-www-form-urlencoded",
  Accept: "application/json"

1

이온 을 사용 하고 네이티브 http 플러그인 중에이 오류가 발생 하면 다음 수정을 수행해야합니다.

resources/android/xml/network_security_config.xml 변경

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">localhost</domain>
        <domain includeSubdomains="true">api.example.com(to be adjusted)</domain>
    </domain-config>
</network-security-config>

그것은 나를 위해 일했다!


1

매니페스트 파일에 ... android : usesCleartextTraffic = "true"...를 추가하면 문제가 해결 된 것으로 보이지만 데이터 무결성에 위협이됩니다.

보안상의 이유로 매니페스트 파일 내에서 android : usesCleartextTraffic 과 함께 매니페스트 자리 표시자를 사용 했습니다 (허용 된 답변의 옵션 3 과 같이 @ Hrishikesh Kadam 에만 디버그 환경에 일반 텍스트를 허용하는의 응답).

build.gradle (: app) 파일 안에 다음 과 같이 매니페스트 자리 표시자를 추가했습니다.

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }

        debug {
            manifestPlaceholders.cleartextTrafficPermitted ="true"
        }
    }

위의이 줄에서 자리 표시 자 이름 cleartextTrafficPermitted 를 확인하십시오.

            manifestPlaceholders.cleartextTrafficPermitted ="true"

그런 다음 Android Manifest에서 동일한 자리 표시자를 사용했습니다 ...

AndroidManifest.xml-

<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
    <uses-permission android:name="android.permission.INTERNET" />
    <application
        ...
        android:usesCleartextTraffic="${cleartextTrafficPermitted}"
        ...>
        ...
    </application>
</manifest>

이를 통해 일반 텍스트 트래픽은 디버그 환경에서만 허용됩니다.


0

일반 텍스트 는 암호화되지 않았거나 암호화하려는 전송 또는 저장된 정보입니다.

앱이 HTTP ( https 아님) 와 같은 일반 텍스트 네트워크 트래픽을 사용하여 서버와 통신 할 때 콘텐츠의 해킹 및 변조 위험이 높아질 수 있습니다. 타사는 무단 데이터를 주입하거나 사용자에 대한 정보를 유출 할 수 있습니다. 그렇기 때문에 개발자는 HTTPS와 같은 트래픽 만 보호해야합니다. 다음 은이 문제를 해결하는 방법의 구현 및 참조입니다.



0

cordova-plugin-whitelist 1.3.4와 함께 Cordova 8을 사용하며 기본 구성은 내 응용 프로그램이 인터넷에 액세스 할 수 없으며 manifest.xml-> android : usesCleartextTraffic = "true"

mainfest의 경로는 Cordova 8에서 변경되었습니다 : platform / android / app / src / main / AndroidManifest.xml.

 <?xml version='1.0' encoding='utf-8'?>
    <manifest android:hardwareAccelerated="true" android:versionCode="10000" android:versionName="1.0.0" package="io.cordova.hellocordova" xmlns:android="http://schemas.android.com/apk/res/android">
        <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" android:xlargeScreens="true" />
        <application 
android:hardwareAccelerated="true" 
android:icon="@mipmap/ic_launcher" 
android:label="@string/app_name" 
android:supportsRtl="true" 
android:usesCleartextTraffic="true">
            <activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode" android:label="@string/activity_name" android:launchMode="singleTop" android:name="MainActivity" android:theme="@android:style/Theme.DeviceDefault.NoActionBar" android:windowSoftInputMode="adjustResize">
                <intent-filter android:label="@string/launcher_name">
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    </manifest>

앱이 인터넷에 액세스해야한다는 것이 분명하기 때문에 이것은 정말 어리 석습니다 ....


0

간단하고 쉬운 솔루션 [Xamarin Form]

안드로이드

  1. 고토 Android Project, 다음을 클릭합니다 Properties,

여기에 이미지 설명을 입력하십시오

  1. AssemblyInfo.cs이 코드를 열고 붙여 넣습니다.

    [assembly: Application(UsesCleartextTraffic =true)]

여기에 이미지 설명을 입력하십시오

iOS의 경우

사용 NSAppTransportSecurity:

여기에 이미지 설명을 입력하십시오

파일 에서 NSAllowsArbitraryLoads키를 사전 YES아래 로 설정 NSAppTransportSecurity해야 info.plist합니다.

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

Plist 구성

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.