Android 9 Pie'dan itibaren, şifreleme olmadan yapılan istekler asla çalışmayacaktır. Ve varsayılan olarak Sistem sizden TLS kullanmanızı bekleyecektir.Bu özelliği buradan okuyabilirsiniz Yani yalnızca HTTPS üzerinden istek yaparsanız güvendesiniz demektir. Ancak farklı siteler üzerinden istekte bulunan uygulamalar, örneğin tarayıcı benzeri uygulamalar ne olacak?
Android 9 Pie'da HTTP ve HTTPS tüm bağlantı türlerine yönelik istekleri nasıl etkinleştirebilirim?
Bunu uygulamanın kolay yolu, tüm istekler için tüm http
lere izin verdiğiniz AndroidManifest.xml
nizde bu özniteliği kullanmaktır:
android:usesCleartextTraffic="true"
Ancak, farklı bağlantılar için bazı daha fazla yapılandırma istiyorsanız, örneğin bazı alan adları için http
ye izin verirken diğer alan adlarına izin vermiyorsanız, networkSecurityConfig
dosyasını sağlamanız gerekir.
Bunu Android 9 Pie'da yapmak için Manifest application
etiketinizde aşağıdaki gibi bir networkSecurityConfig
ayarlamanız gerekecektir:
<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
<application android:networkSecurityConfig="@xml/network_security_config">
</application>
</manifest>
Daha sonra xml
klasörünüzde, Manifest'te adlandırdığınız gibi network_security_config
adında bir dosya oluşturmanız ve şifreleme olmadan tüm istekleri etkinleştirmek için dosyanızın içeriğinin bu şekilde olması gerekir:
<?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>
Oradan gitmeye hazırsınız. Artık uygulamanız her türlü bağlantı için istekte bulunacaktır. Bu konu hakkında daha fazla bilgi için burayı okuyun.
Bu sorunla karşılaşan hem Android
hem de React-native
kullanıcıları için tamamen çalışan çözüm sadece şunu ekleyin
android:usesCleartextTraffic="true"
AndroidManifest.xml dosyasında bu şekilde:
android:usesCleartextTraffic="true"
tools:ignore="GoogleAppIndexingWarning">
<uses-library
android:name="org.apache.http.legacy"
android:required="false" />
arasında <application>
.. </application>
etiketini şu şekilde kullanabilirsiniz:
<application
android:name=".MainApplication"
android:label="@string/app_name"
android:icon="@mipmap/ic_launcher"
android:allowBackup="false"
android:theme="@style/AppTheme"
android:usesCleartextTraffic="true"
tools:ignore="GoogleAppIndexingWarning">
<uses-library
android:name="org.apache.http.legacy"
android:required="false" />
<activity
android:name=".MainActivity"
android:label="@string/app_name"/>
</application>
Hata ayıklamada çalışırken React Native
uygulamaları için @Xenolion tarafından belirtilen xml bloğunu
<project>/android/app/src/debug/res/xml
içinde bulunan react_native_config.xml
dosyasına ekleyin
Aşağıdaki parçacığa benzer:
<?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>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
</network-security-config>