Delphi HTTP Clear Text Traffic on FMX Android
Ambiente di sviluppo
- Delphi 11.1 ( uso questa architettura dalla versione 10.0)
- Android 12 32bit/64bit compatiblità dalla versione 9 di Android
In tanti casi può essere necessario accedere a contenuti HTTP in rete dove non è disponibile l’SSL ad esempio:
- Un server all’interno della tua rete locale, on in VPN
- Hai un httpServer direttamente nella tua applicazione o sul tuo dispositivo
- Devi accedere ad un contenuto particolare su internet che non ha a disposizione un certificato
- Devi accedere direttamente ad un IP address
Per consentire alla tua app Delphi di chiamare un servizio HTTP è necessario creare un file standard di android che si chiama “network_security_config.xml” ed aggiungerlo all’elenco dei file da distribuire.
1 2 3 4 5 6 7 8 9 10 11 12 |
<?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">localhost</domain> <domain includeSubdomains="true">127.0.0.1</domain> </domain-config> </network-security-config> |
Nella sezione domain-config è possibile elencare tutti i domini o gli IP per cui è consentito il traffico non cifrato.
A questo punto va aggiunto al deployment del progetto:
E’ inoltre necessario anche modificare il file “AndroidManifest.template.xml” del vostro progetto aggiungendo la riga:
“android:networkSecurityConfig=”@xml/network_security_config”
nella sezione “<application”.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
<?xml version="1.0" encoding="utf-8"?> <!-- BEGIN_INCLUDE(manifest) --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="%package%" android:versionCode="%versionCode%" android:versionName="%versionName%" android:installLocation="%installLocation%"> <uses-sdk android:minSdkVersion="%minSdkVersion%" android:targetSdkVersion="%targetSdkVersion%" /> <%uses-permission%> <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" /> <uses-feature android:glEsVersion="0x00020000" android:required="True"/> <application android:persistent="%persistent%" <strong>android:networkSecurityConfig="@xml/network_security_config"</strong> android:restoreAnyVersion="%restoreAnyVersion%" android:label="%label%" android:debuggable="%debuggable%" android:largeHeap="%largeHeap%" android:icon="%icon%" android:theme="%theme%" android:hardwareAccelerated="%hardwareAccelerated%" android:usesCleartextTraffic="true" android:resizeableActivity="false" android:requestLegacyExternalStorage="true"> <%provider%> <%application-meta-data%> <%uses-libraries%> <%services%> <!-- Our activity is a subclass of the built-in NativeActivity framework class. This will take care of integrating with our NDK code. --> <activity android:name="com.embarcadero.firemonkey.FMXNativeActivity" android:label="%activityLabel%" android:configChanges="orientation|keyboard|keyboardHidden|screenSize" android:launchMode="singleTask"> <!-- Tell NativeActivity the name of our .so --> <meta-data android:name="android.app.lib_name" android:value="%libNameValue%" /> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <%activity%> <%receivers%> </application> </manifest> <!-- END_INCLUDE(manifest) --> |
Compilare e provare il progetto 🙂