Android 8: Cleartext HTTP trafiğine izin verilmiyor


1038

Android 8 kullanan kullanıcıların uygulamamın (arka uç feed'i kullanan) içerik göstermediğine dair raporlarım vardı. Soruşturmadan sonra Android 8'de şu İstisna gerçekleştiğini buldum:

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)

(Paket adını, URL'yi ve diğer olası tanımlayıcıları kaldırdım)

Android 7'de ve daha düşük her şey çalışıyor, android:usesCleartextTrafficManifest'te ayarlamıyorum (ve bunu trueyardımcı olmuyor, bu zaten varsayılan değer), ne de Ağ Güvenlik Bilgilerini kullanmıyorum. Aradığımda , aynı apk dosyasını kullanarak eski sürüm için Android 8 için NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted()geri döner . Android O hakkındaki Google bilgisinde bundan bahsetmeye çalıştım, ancak başarılı olamadım.falsetrue


28
Bu CodeLab kontrol edin ama kullanıncleartextTrafficPermitted="true"
ArtiomLK

5
Bu, bazı durumlarda sunucu HTTPS'den HTTP'ye yönlendirdiği için bakımını yaptığım bir uygulamada olur.
Büyük McLargeHuge,

Yanıtlar:


2198

Göre Ağ güvenliği yapılandırması -

Android 9'dan (API düzey 28) başlayarak, varsayılan olarak açık metin desteği devre dışıdır.

Ayrıca bir göz atın - https://koz.io/android-m-and-the-war-on-cleartext-traffic/

Kod etiketleri açıklaması - https://codelabs.developers.google.com/codelabs/android-network-security-config/index.html

Seçenek 1 -

Önce URL'ye "http: //" yerine "https: //" yazmayı deneyin

Seçenek 2 -

Res / xml / network_security_config.xml dosyası oluştur -

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

Seçenek 3 -

android: kullanırCleartextTraffic Doc

AndroidManifest.xml -

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

Ayrıca @ david.s'in cevabının da işaret ettiği android:targetSandboxVersiongibi bir sorun da olabilir -

Bildiri Belgelerine Göre -

android:targetSandboxVersion

Bu uygulamanın kullanacağı hedef sanal alanı. Korumalı alan sürüm numarası ne kadar yüksek olursa, güvenlik düzeyi de o kadar yüksek olur. Varsayılan değeri 1'dir; bu özelliği 2 olarak da ayarlayabilirsiniz. Bu özelliği 2 olarak ayarlamak uygulamayı farklı bir SELinux sanal alanına geçirir. 2. düzey sanal alan için aşağıdaki kısıtlamalar geçerlidir:

  • usesCleartextTrafficNetwork Security Config içindeki varsayılan değeri false değeridir .
  • Uid paylaşımına izin verilmiyor.

Seçenek 4 -

Eğer varsa android:targetSandboxVersioniçinde <manifest>o düşürün1

AndroidManifest.xml -

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

4
@HrishikeshKadam Cevabınız çok takdir ediliyor, ancak P'nin en son sürümünde başka bir adım olması gerektiği anlaşılıyor? Lütfen soruma bakın stackoverflow.com/questions/51770323/…
spartygw

8
ClearText HTTP, https yerine bir http sitesi kullandıkları anlamına mı geliyor?
Tom Hammond

4
Seçenek 1'i domain-
config'ten

165
Her geliştirici ekleyecekse bu Android güvenlik özelliğinin amacı android:usesCleartextTraffic="true"nedir?
Meyve

69
Bu, bu soruna en iyi çözümden bile bahsetmez: HTTPS kullanın. Bu cevapta belirtilen seçenekler sadece son çare olmalıdır.
Christian Brüggemann

131

AndroidManifest'te bu parametreyi buldum:

android:networkSecurityConfig="@xml/network_security_config"

ve @ xml / network_security_config, network_security_config.xml dosyasında şu şekilde tanımlanır:

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

sadece cleartextTrafficPermitted'i true olarak değiştirdim


11
+1 Bu, diğer yanıtların önerdiği gibi bir altkümeyi korumak yerine uygulamada kullanılan tüm alan adlarına uygulamak istiyorsanız kullanışlıdır.
Martin Price

2
Perfetct. Daha fazla bilgi için burada: codelabs.developers.google.com/codelabs/…
xxxxxxxxxxxxx

Değişikliklerden sonra uygulamayı yeniden yükleyin
Ssenyonjo

118

Android 9'daki sorunum http ile etki alanları üzerinde bir web görünümünde geziniyordu Bu yanıtın çözümü

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

ve:

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
Sadece bu cevap benim için çalıştı. Diğer cevaplar benim için işe yaramıyor. Bu en iyi cevap.
Ahamadullah Saikat

3
Mükemmel çalışın! Çok teşekkür ederim!
TedVN

1
Bu da benim için çalıştı, neden bilmiyorum
Sina Rahimi

Bunu bir şekilde yeniden yazabilir miyim gradle?
Morozov

2
Çözümlerin hiçbiri işe yaramadı. BU HARİÇ..!! Bir ton teşekkürler.
Kunal Kakkad

93

Hata ayıklama sırasında yalnızca açık metne izin vermek isteyebilirsiniz, ancak üretimde açık metni reddetmenin güvenlik avantajlarını koruyabilirsiniz. Uygulamamı https'yi desteklemeyen bir geliştirme sunucusuna karşı test ettiğim için bu benim için yararlı. Https'yi üretimde nasıl uygulayacağınız, ancak hata ayıklama modunda açık metinlere nasıl izin vereceğiniz aşağıda açıklanmıştır:

Build.gradle içinde:

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

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

AndroidManifest.xml'deki uygulama etiketinde

android:usesCleartextTraffic="${usesCleartextTraffic}"

1
sadece api 23 + 'da olsa kullanılır. Api'den bağımsız bir çözüm istiyorsanız şu adresteki onaylı çözüm: stackoverflow.com/questions/46302058/… iyi bir seçenektir ...
Rik van Velzen

Soru: Uygulama, tasarım gereği http veya https olabilecek web sunucularını kullandığında, http urls'ın web hizmetlerini kullanabilmesi gerekse bile "false" ifadesini kullanır mı? Yani true olarak ayarlamak, varsayılan olarak https hizmetlerinin zaten net metin göndermemesi anlamına mı geliyor?
whyoz

2
Teşekkürler dostum! Kabul edilen cevap olmalı.
Çalıştırmak

63

URL'nizi olarak HTTPdeğiştirinHTTPS ;

Çalışıyor!!!


97
bu nasıl onaylanır? sunucunuzun URL'si https değilse bir el sıkışma istisnası elde edersiniz
kkarakk

18
oy verilmiş çünkü yapılacak doğru şey (üretim ortamlarında). HTTPS HTTP değil, varsayılan olmalıdır.
beetstra

28
@beetsta İçeriğin sunulduğu içerik üzerinde tam denetime sahip olduğunuzu varsayarsınız. Dolayısıyla bu cevap doğal veya saygısızdır.
Martin Price

10
@beetstra Hata ayıklama sırasında neden bir YEREL makinede HTTPS varsayılanı olmalı? Bu çok aptalca, Google paternalizminin başka bir örneği. Neyse ki Tyler'ın çözümü ile hata ayıklama modu için bu sorunu çözebilir.
Bevor

2
Cevap sorudan habersiz. Küçük şirketlerdeki insanların aksine, bazen her aşama sunucusu için SSL'ye sahip değilsiniz. Cevap, bir Facebook gönderisindeki dilbilgisini düzelten biri kadar kötü ve bu soruya hiç cevap vermiyor ya da düzeltmiyor.
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>

Yukarıda verilen öneride URL'mi http://xyz.abc.com/mno/ olarak veriyordum

Bunu xyz.abc.com olarak değiştirdim ve çalışmaya başladı.


8
Domain! = URL. "http" protokoldür. Protokol asla alan adının bir parçası değildir.
İnanılmaz Ocak

en iyi cevap., Teşekkürler Etki Alanına Özel Yapılandırma ayarlama temel yapılandırma ayarlamaktan daha iyidir
trinadh thatakula

Bu doğrudur, orada sadece FQDN desteklenmektedir, IP adresi yoktur (yukarıda belirtilen).
Martin Zeitler

Alan 10.0.2.2 için çalışmıyor. Bağlantı noktası numarasını eklemeli miyim?
Ssenyonjo

28

Tamam, bu ⇒⇒ DEĞİL ⇐⇐ binlerce Manifest eklemek tekrar , ama bu temel bir ipucu, ama size ek Avantaj (ve belki bazı Arka Plan Bilgileri) vermek.

Android, src-Directory için bir tür üzerine yazma işlevine sahiptir.

Varsayılan olarak,

/ app / src / main

Ancak AndroidManifest.xml'inizin üzerine yazmak için ek dizinler ekleyebilirsiniz. Nasıl çalışır:

  • Dizin / app / src / debug dosyasını oluşturun
  • İçinde AndroidManifest.xml dosyasını oluşturun

Bu Dosyanın içine, tüm Kuralları koymak zorunda değilsiniz , yalnızca / app / src / main / AndroidManifest.xml dosyanızın üzerine yazmak istediğiniz kuralları girmeniz gerekir.

Aşağıda, istenen CLEARTEXT İzni için nasıl bir örnek bulabilirsiniz:

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

Bu bilgi ile artık hata ayıklamanıza bağlı olarak İzinlerinizi aşırı yüklemeniz 1,2,3 kadar kolay | ana | Çevre bırakın .

Bunun en büyük yararı ... üretiminizde hata ayıklama yok-Manifest ve düz ve bakımı kolay bir yapıya sahip olursunuz


3
Bu kesinlikle doğru çözüm. Android bu güvenlik ayarlarını bir nedenden dolayı ekledi, bu yüzden ayakta durmalılar. Çözümleriniz yerel güvensiz ortamları test etmemize izin verirken, üretim yapıları yine de önerilen güvenlik ayarlarına sahip olacaktır. Teşekkür ederim!
Coo

25

Birisi için yararlı olabilir.

Son zamanlarda Android 9 için aynı sorunu yaşadık, ancak sadece bazı URL'leri WebView'de görüntülememiz gerekiyordu, çok özel bir şey değildi. Bu yüzden android:usesCleartextTraffic="true"Manifest'e eklemek işe yaradı, ancak bunun için tüm uygulamanın güvenliğinden ödün vermek istemedik. Düzeltme bağlantıları değiştirerek oldu Yani httpetmekhttps


3
Yalnızca bazı URL'leri görüntülemek istiyorsam bir WebView'e ihtiyacım yok. Sadece bir TextView kullanıyorum. ;) Sanırım bazı html sayfalarını gösterdiğiniz anlamına geliyor. Düzeltmeniz yalnızca sunucunuz SSL sunuyorsa çalışır. Sadece bağlantıları değiştiremezsiniz.
İnanılmaz Ocak

2
Bu kesinlikle mümkün olduğunda en iyi seçenektir, ancak bir performans nedeni ya da sadece kaynak açık metin HTTP'de bulunmayabileceğinden, bunu her zaman seçemezsiniz.
Dakatine

"Tüm uygulamanın güvenliğinden ödün vermek istemedik", hangi güvenlik risklerine neden olabilir? Benim durumumda bir URL yok, bu yüzden onları manifest içinde ekleyemiyorum.
Robert Williams

Merhaba @RobertWilliams, sadece net trafiğin şifrelenmemiş trafiğe izin verileceği anlamına gelir. İşte bir blog yazısı ortamı.com/@son.rommer/…
sparkly_frog

Aynı sorun tekrar oldu. Tüm bu çözümleri denedim.
Ahamadullah Saikat

22

React Native projeleri için

Zaten RN 0.59 üzerinde düzeltildi. Yükseltme farkını 0,58,6'dan 0,59'a kadar bulabilirsiniz RN sürümünü yükseltmeden uygulayabilirsiniz.

Dosya oluştur:

android / app / src / debug /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>

android / app / src / hata ayıklama /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>

Temel nedeni öğrenmek için kabul edilen cevabı kontrol edin.


2
Reat-native 0.59.5 kullanıyorum ve aynı problemi yaşıyorum, AndroidManifest.xml'yi önerdiğiniz gibi manuel olarak ayarlamamız gerekiyor.
Cristian Mora

11

Tamam, bunu anladım. android:targetSandboxVersion="2"Anında Uygulama sürümüne de sahip olduğumuz için eklediğim Manifest parametresi nedeniyle - Kullanıcı Anında Uygulamadan normal uygulamaya yükselttikten sonra, aktarımla verilerini kaybetmeyeceğinden emin olmalıdır. Ancak belirsiz açıklamanın da belirttiği gibi:

Bu uygulamanın kullanmak istediği hedef sanal alanı belirtir. Daha yüksek sanbox sürümlerinde artan güvenlik seviyeleri olacaktır.

Bu özelliğin varsayılan değeri 1'dir.

Açıkçası, en azından Android 8'de yeni bir güvenlik politikası seviyesi ekliyor.


9

Bu satırı zaten var olan android manifest dosyasından kaldırdım

 android:networkSecurityConfig="@xml/network_security_config" 

ve ekledi

android:usesCleartextTraffic="true"

bunu manifest'teki uygulama etiketine

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

o zaman bu hata Cleartext HTTP trafiği overlay.openstreetmap.nl'e izin verilmiyor android 9 ve 10'da benim için gitti. Umarım bu, oy vermeyi unutmalarına yardımcı olursanız android 8 için de çalışır


8

Bu çeşitli yanıtları uygulamak Xamarin.Androidiçin sınıf ve montaj düzeyi Niteliklerini kullanabilirsiniz.AndroidManifest.xml

İnternet izni elbette gereklidir (duh ..):

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

Not: Genellikle montaj düzeyi öznitelikleri AssemblyInfo.csdosyanıza eklenir , ancak çalışmaların altında usingve üstünde bulunan tüm dosyalar namespace.

Ardından Uygulama alt sınıfınızda (gerekirse bir tane oluşturun), NetworkSecurityConfigbir Resources/xml/ZZZZ.xmldosyaya referansla ekleyebilirsiniz :

#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/xmlKlasörde bir dosya oluşturun ( xmlgerekirse klasörü oluşturun ).

Örnek xml/network_security_configdosya, gerektiği gibi ayarlayın (diğer yanıtlara bakın)

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

UsesCleartextTrafficParametreyi aşağıdakiler üzerinde de kullanabilirsiniz ApplicationAttribute:

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

Bir doamin üzerinde değilseniz ve 192.168 yerel bir ana bilgisayar adresinde değilseniz, uygulama internette değil, yerel bir ağda yayınlanacaktır
rogue39nin

ve xamrian formlarının sözdizimi nedir
rogue39nin

@ rogue39nin Cevabımın son bölümünü kullan:UsesCleartextTraffic = true
SushiHangover

4

Uygulamamı geliştirirken aynı "Cleartext HTTP trafiğine izin verilmiyor" hatasını da aldım. Uygulamamda şebeke aramaları için Retrofit2 kullanıyorum ve iki proje ortamım var (geliştirme ve üretim). Üretim alanımın HTTPS çağrılarıyla SSL sertifikası var ve geliştiricinin https'si olmayacak. Yapılandırma yapı aromalarına eklenir. Ancak dev'e geçersem bu sorun tetiklenir. Bu yüzden bunun için aşağıda bir çözüm ekledim.

Manifest'te açık metin trafiği ekledim

 android:usesCleartextTraffic="true"

Sonra sonradan yapılandırma sınıfı OKHttp oluşturma zamanı bir bağlantı spec ekledim.

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

Komple OkHttpClient oluşturma işlemi aşağıda verilmiştir

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

Aralık 2019 iyonik güncellemesi - 4.7.1

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

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

Lütfen yukarıdaki içeriği android manifest .xml dosyasına ekleyin

Önceki İyonik Sürümler

  1. config.xmlİyonik Projenizde aşağıdakilere sahip olduğunuzdan emin olun :

    <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. İyonik Cordova android inşa çalıştırın. Platformlar altında Android klasörü oluşturur

  3. Android Studio'yu açın ve proje proje platformlarımızda-android'de bulunan Android klasörünü açın. Kepçeyi inşa etmek için birkaç dakika bekletin

  4. Sonra gradle buildbitti biz de dahil olmak üzere bazı hatalar olsun minSdVersioniçinde manifest.xml. Şimdi biz ne sadece kaldırma olduğu <uses-sdk android:minSdkVersion="19" />gelen manifest.xml.

    Her iki konumdan da kaldırıldığından emin olun:

    1. uygulaması → manifests → AndroidManifest.xml.
    2. CordovaLib → manifestler → AndroidManifest.xml.

    Şimdi kepçeyi tekrar inşa etmeyi dene ve şimdi başarıyla inşa edildi

  5. Uygulama → manifest → içindeki Uygulama etiketinde aşağıdakilere sahip olduğunuzdan emin olun Androidmanifest.xml:

    <application
    android:networkSecurityConfig="@xml/network_security_config"  android:usesCleartextTraffic="true" >
  6. Açık network_security_config(Uygulamanın → res → xml → network_security_config.xml).

    Aşağıdaki kodu ekleyin:

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

İşte xxx.yyyy.comHTTP API'nizin bağlantısı. URL'den önce herhangi bir Http eklemediğinizden emin olun.

Not: Şimdi Android Studio (Build - Build Bundle's / APK - Build APK) kullanarak uygulamayı oluşturun ve şimdi bu Uygulamayı kullanabilirsiniz ve Android Pie'da iyi çalışır. İyonik Cordova build android kullanarak uygulama oluşturmaya çalışırsanız, tüm bu ayarları geçersiz kılar, bu nedenle Projeyi oluşturmak için Android Studio'yu kullandığınızdan emin olun.

Uygulamanın daha eski sürümleri yüklüyse, bunları kaldırın ve bir deneyin veya başka bir hatayla karşılaşırsınız:

Uygulama Yüklenmedi


iyonik? Cordova? Bu yüzden normal bir Android yapısı değil, bunun yerine ön uç teknoloji ile yerel uygulamalar oluşturmak için bir çerçeve .
Hafta Sonu

Ionic, android uygulamasında webivew uygulamasını sağlar ve Cordova, mikrofon, kamera gibi android yerel özelliklerine erişmenize yardımcı olur.
Gvs Akhil

3

Dosya oluştur - res / xml / network_security.xml

Network_security.xml içinde ->

<?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 dosyasını açın:

 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

Bu güvenlik nedeniyle yapılır, her zaman mümkün olduğunda HTTPS (HTTP Secure ) kullanmayı tercih etmelisiniz . Buradan
daha fazla bilgi edinebilirsiniz

Durumunuza bağlı olarak bu sorun için birden fazla çözüm vardır.

Birinci taraf bir hizmetle iletişim kurmaya çalışıyorsanız, IE: kendi web sunucunuz

Sunucu tarafı: Bu sunucuya HTTPS desteği eklemeli ve HTTP yerine HTTPS kullanmalısınız. Hatta gibi ücretsiz kullanılarak hizmetler için yapabilir Bugünlerde LetsEncrypt ve diğerleri
Müşteri tarafında: Eğer kullanıyorsanız HttpURLConnectiondan java.netsen geçebilirsiniz paketin HttpsURLConnectioniçinde java.net.sslanahtar zahmetsiz olması gerektiği, böylece paketin, bu da benzer bir aynısı olmasa bile API vardır.

Google, Facebook, hava durumu servisi vb. Gibi üçüncü taraf bir hizmet kullanıyorsanız.

İletişim kurduğunuz hizmetin HTTPS'yi (büyük olasılıkla yaptığı) desteklemesi durumunda istek URL'nizi 'den' olarak http://abc.xyzdeğiştirebilirsiniz https://abc.xyz.

Son çare olarak, iletişim kurmak istediğiniz üçüncü taraf hizmeti HTTPS'yi veya başka bir güvenli iletişimi desteklemiyorsa, bu yanıtı kullanabilirsiniz , ancak yine de, bu çok ihtiyaç duyulan amacı yendiğinden bu önerilmez. güvenlik özelliği.


2

Benim durumumda bu URL tarayıcıda da çalışmıyor.

Https://www.google.com/ ile kontrol ediyorum

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

Ve benim için çalıştı.


myWebView.loadUrl ( "www.site.com"); aynı zamanda web yöneticilerinin HTTPS olarak SSL'si değil, yalnızca HTTP'si için çalışır. Boş sayfa alınabilir ama.
Bay

verilen url web tarayıcınızda çalışıyorsa, web görünümünüzde kullanabilirsiniz. aksi halde bu hatayı görebilirsiniz.
Mayuresh Deshmukh

Bazen bir hata veriyor biliyorum, ama çoğu zaman boş sayfa bile run.javascript "true" olduğunu görüyorum ve web sitesine doğru bir şekilde erişebilirsiniz. Neden boş sayfa gördüğümü bilmiyorum, ayrıca zum yapabilen doğru ayarladım.
Bay

2

Android'i ekleyin: AndroidManifest.xml dosyasındaki useCleartextTraffic = "true"


2

İçin Xamarin.Android geliştiriciler emin HttpClient uygulama yapmak ve SSL / TLS Standart olarak ayarlanır.

Andorid Options -> Advanced Android Options altında bulunabilir.

resim açıklamasını buraya girin


2

Çalışma yanıtı benim için, @PabloCegarra tarafından:

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

Şunlarla ilgili bir güvenlik uyarısı alabilirsiniz: cleartextTrafficPermitted="true"

'Beyaz liste' alan adlarını biliyorsanız, hem kabul edilen cevabı hem de yukarıdaki cevabı karıştırmalısınız:

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

Bu kod benim için çalışıyor, ancak uygulamamın yalnızca books.google.com'dan veri alması gerekiyor. Bu şekilde güvenlik uyarısı kaybolur.


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'

          }

Sonra 2 Adım: -> manifest manifest uygulama etiketi içine ekleyin

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

// Adım 4 - >> Çekilebilir Oluştur >> Xml dosyası >> ad olarak >> 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>

Bunu aosp'ta değiştirmek mümkün mü?
Gölge

@ Gölge Evet değiştirebilirsiniz.
Ashif

Tam olarak nerede değiştirebileceğimi öğrenebilir miyim?
Gölge

@Shadow <base-config cleartextTrafficPermitted = "true"> <trust-anchors> <sertifikalar src = "sistem" /> </trust-anchors> </base-config> <domain-config cleartextTrafficPermitted = "true"> <etki alanı includeSubdomains = "true"> www.alanwebsidedomain.com </domain> </domain-config>
Ashif

Hayır!! Yine uygulama tarafında söylüyorsunuz. Çerçeve / <> klasör sınıfında nasıl değiştirileceğini soruyorum?
Gölge

1

React Native 0.58.5 veya daha yüksek bir sürüme yükseltme. Onlar sahip includeSubdomainRN 0.58.5 kendi yapılandırma dosyalarında.

ChangeLog

Rn 0.58.5 sürümünde network_security_configsunucu etki alanlarıyla birlikte beyan etmişlerdir. Ağ güvenliği yapılandırması, uygulamanın belirli bir alan adından açık metin trafiğine izin vermesine izin verir. Bu nedenle android:usesCleartextTraffic="true"bildirim dosyanızın uygulama etiketinde bildirerek fazladan çaba göstermenize gerek yoktur . RN Sürümü yükseltildikten sonra otomatik olarak çözülecektir.


1

Değiştirildikten sonra API 9.0 sürümü hatası YOUR-API.DOMAIN.COM için Cleartext HTTP trafiğine izin verilmiyor (targetSdkVersion = "28"). xamarin, xamarin.android ve android stüdyosunda.

Bu hatayı xamarin, xamarin.android ve android stüdyosunda çözmek için iki adım.

Adım 1: Dosya kaynakları / xml / network_security_config.xml oluşturun

Network_security_config.xml içinde

<?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.Adım: AndroidManifest.xml dosyasını güncelleyin -

Uygulama etiketine android: networkSecurityConfig = "@ xml / network_security_config" ekleyin. Örneğin:

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

1

başlığa bu parametreyi eklemek apiSauce React Native'deki sorunumu çözdü

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

1

İyonik kullanıyorsanız ve yerel http eklentisi sırasında bu hatayı alıyorsanız, aşağıdaki düzeltmenin yapılması gerekir.

goto olarak resources/android/xml/network_security_config.xml değiştir

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

Bu benim için çalıştı!


1

Eklenmesi ... android: usesCleartextTraffic = "true" ... manifest dosyanıza sorunu düzeltiyor gibi görünebilir, ancak veri bütünlüğü için bir tehdit açar.

Güvenlik nedeniyle android ile manifest yer tutucuları kullandım : manifest dosyasının içindeCleartextTraffic'i kullanıyorum ( kabul edilen cevabın Seçenek 3'teki gibi yani @ Hrishikesh Kadam cevabı gibi), debug ortamında açık metinlere izin vermek için kullanır.

Benim İçinde (: uygulaması) build.gradle dosya, böyle bir bildirim yer tutucu ekledi:

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

        debug {
            manifestPlaceholders.cleartextTrafficPermitted ="true"
        }
    }

Yukarıdaki bu satırda yer tutucu adını cleartextTrafficPermitted'e dikkat edin

            manifestPlaceholders.cleartextTrafficPermitted ="true"

Sonra Android Manifest'imde aynı yer tutucuyu kullandım ...

AndroidManifest.xml -

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

Bununla, açık metin trafiğine yalnızca hata ayıklama ortamında izin verilir.


0

Açık metin , şifrelenmemiş veya şifrelenmesi amaçlanan iletilmiş veya depolanmış bilgilerdir.

Bir uygulama, HTTP ( https değil ) gibi bir açık metin ağ trafiği kullanarak sunucularla iletişim kurduğunda , içeriğin saldırı ve kurcalanması riskini artırabilir. Üçüncü taraflar yetkisiz veriler enjekte edebilir veya kullanıcılar hakkında bilgi sızdırabilir. Bu nedenle geliştiricilerin yalnızca HTTPS gibi trafiği korumaları teşvik edilir. İşte bu sorunun nasıl çözüleceğine dair uygulama ve referans.



0

Cordova 8'i cordova-plugin-whitelist 1.3.4 ile kullanıyorum ve varsayılan yapılandırma, uygulamamın internete erişimi yok ve sadece manifest.xml'de bir parametre ekliyorum -> android: usesCleartextTraffic = "true"

Mainfest'in yolu Cordova 8'de değişti: 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>

Bu gerçek bir aptal çünkü app internet erişimi gerekir açık ....


0

Basit ve En Kolay Çözüm [Xamarin Form]

Android için

  1. Git Android Project, sonra tıklayın Properties,

resim açıklamasını buraya girin

  1. AssemblyInfo.csBu kodu açıp buraya yapıştırın:

    [assembly: Application(UsesCleartextTraffic =true)]

resim açıklamasını buraya girin

İOS için

Kullanım NSAppTransportSecurity:

Resim açıklamasını buraya girin

NSAllowsArbitraryLoadsAnahtarı dosyanızdaki sözlüğün YESaltına ayarlamanız NSAppTransportSecuritygerekir info.plist.

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

Liste yapılandırması

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.