Via Cà Matta 2 - Peschiera Borromeo (MI)
+39 02 00704272
info@synaptica.info

Delphi HTTP Clear Text Traffic on FMX Android

Digital Innovation Partner

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.

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

<?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%" 
    	android:networkSecurityConfig="@xml/network_security_config" 
        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 🙂