Integrazione dell'IA nelle app mobili: una guida pratica passo dopo passo

Integrazione dell'IA nelle app mobili

Nel 2026, le applicazioni mobili non sono più solo interfacce per dati statici. Ci si aspetta sempre più che percepiscano, ragionino e reagiscano all’ambiente circostante in tempo reale. L’integrazione dell’Intelligenza Artificiale nel proprio stack mobile non è più un lusso futuristico, ma una necessità moderna.

Tuttavia, gli sviluppatori si trovano di fronte a una decisione architetturale fondamentale: è meglio eseguire i modelli di IA nel cloud tramite API o direttamente sul dispositivo?

Questa guida fornisce una panoramica completa dell’integrazione dell’IA nelle app mobili, confrontando le architetture cloud e on-device, e fornendo un’implementazione pratica passo dopo passo sia per iOS (Swift) che per Android (Kotlin).


1. Cloud AI vs. On-Device AI: La scelta architetturale

Prima di scrivere codice, è fondamentale comprendere i compromessi della posizione in cui viene eseguito il modello:

Vettore Cloud AI (via API) On-Device AI (Edge)
Potenza di calcolo Virtualmente illimitata (GPU/TPU) Limitata dall’hardware mobile (CPU/GPU/NPU)
Latenza Dipendente dalla rete (100ms - 2s+) Ultra-bassa (inferiore a 10ms)
Costo Elevato (costi ricorrenti di API/server) Zero (utilizza l’hardware dell’utente)
Funzionamento offline Impossibile (richiede una connessione attiva) 100% funzionante offline
Privacy I dati sensibili dell’utente devono lasciare il dispositivo Assoluta (i dati non lasciano mai il dispositivo)

2. Framework per IA On-Device

Se si sceglie l’esecuzione on-device, sono disponibili diversi runtime ottimizzati:

  • Google ML Kit: Un SDK plug-and-play eccellente per attività comuni (etichettatura di immagini, riconoscimento di testo, rilevamento di volti) sia su Android che su iOS.
  • CoreML: Il framework altamente ottimizzato di Apple, progettato per sfruttare l’Apple Neural Engine (ANE) per la massima velocità.
  • TensorFlow Lite / PyTorch Mobile: Ideali per distribuire architetture di reti neurali personalizzate.
  • ONNX Runtime Mobile: Un motore multipiattaforma che consente di eseguire sul dispositivo modelli provenienti da quasi tutti i framework di addestramento (PyTorch, TensorFlow, ecc.).

3. Guida passo dopo passo: Classificazione delle immagini sul dispositivo

Creiamo una funzionalità pratica: la classificazione delle immagini sul dispositivo, che etichetta gli oggetti in una foto scattata senza utilizzare alcuna connessione a Internet.

A. Implementazione Android (Kotlin)

Useremo l’API di etichettatura delle immagini di Google ML Kit. Fornisce un modello pre-addestrato che viene eseguito localmente sul dispositivo Android.

Passaggio 1: Aggiungere la dipendenza

Aggiungi questo al tuo build.gradle.kts a livello di app:

dependencies {
    implementation("com.google.mlkit:image-labeling:17.0.7")
}

Passaggio 2: Scrivere la logica di inferenza

Ecco il codice Kotlin per caricare un’immagine da un URI ed eseguire il classificatore:

import android.content.Context
import android.net.Uri
import com.google.mlkit.vision.common.InputImage
import com.google.mlkit.vision.label.ImageLabeling
import com.google.mlkit.vision.label.defaults.ImageLabelerOptions

class ImageClassifier(private val context: Context) {

    fun classifyImage(imageUri: Uri, onSuccess: (List<String>) -> Unit, onFailure: (Exception) -> Unit) {
        try {
            // 1. Prepara InputImage da Uri
            val image = InputImage.fromFilePath(context, imageUri)
            
            // 2. Inizializza l'etichettatore di immagini locale predefinito
            val labeler = ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS)
            
            // 3. Elabora l'immagine
            labeler.process(image)
                .addOnSuccessListener { labels ->
                    val result = labels.map { "${it.text} (${(it.confidence * 100).toInt()}%)" }
                    onSuccess(result)
                }
                .addOnFailureListener { e ->
                    onFailure(e)
                }
        } catch (e: Exception) {
            onFailure(e)
        }
    }
}

B. Implementazione iOS (Swift)

Per iOS, utilizzeremo i framework nativi di Apple Vision e CoreML. Apple fornisce un modello MobileNetV2 precompilato gratuito per la classificazione generale delle immagini.

Passaggio 1: Importare il modello e i framework

Scarica il file MobileNetV2.mlmodel dal sito per sviluppatori Apple e trascinalo nel tuo progetto Xcode.

Passaggio 2: Scrivere la logica di inferenza

Ecco il codice Swift che utilizza Vision per elaborare l’immagine:

import Vision
import CoreML
import UIKit

class iOSImageClassifier {
    
    func classifyImage(image: UIImage, completion: @escaping (Result<[String], Error>) -> Void) {
        // 1. Carica il modello CoreML utilizzando il wrapper Vision
        guard let configuration = try? MLModelConfiguration(),
              let coreMLModel = try? MobileNetV2(configuration: configuration),
              let visionModel = try? VNCoreMLModel(for: coreMLModel) else {
            completion(.failure(NSError(domain: "Classifier", code: 1, userInfo: [NSLocalizedDescriptionKey: "Caricamento del modello fallito"])))
            return
        }
        
        // 2. Crea una richiesta Vision
        let request = VNCoreMLRequest(model: visionModel) { request, error in
            if let error = error {
                completion(.failure(error))
                return
            }
            
            guard let results = request.results as? [VNClassificationObservation] else {
                completion(.success([]))
                return
            }
            
            // 3. Formatta le prime classificazioni
            let formattedResults = results.prefix(3).map { 
                "\($0.identifier) (\(Int($0.confidence * 100))%)" 
            }
            completion(.success(formattedResults))
        }
        
        // 4. Converti UIImage in CGImage ed esegui la richiesta
        guard let cgImage = image.cgImage else {
            completion(.failure(NSError(domain: "Classifier", code: 2, userInfo: [NSLocalizedDescriptionKey: "Formato immagine non valido"])))
            return
        }
        
        let handler = VNImageRequestHandler(cgImage: cgImage, options: [:])
        DispatchQueue.global(qos: .userInitiated).async {
            do {
                try handler.perform([request])
            } catch {
                completion(.failure(error))
            }
        }
    }
}

4. Guida passo dopo passo: Integrazione dell’IA nel Cloud

Per attività complesse che richiedono modelli avanzati (come GPT-4 o Claude) o la generazione dinamica di immagini, l’esecuzione dei modelli sul dispositivo non è fattibile a causa dei limiti hardware. In questi casi, sfruttiamo l’IA nel Cloud.

[!IMPORTANT] Avviso di sicurezza: Non inserire mai le chiavi API (como le chiavi OpenAI o Anthropic) direttamente nel codice dell’applicazione mobile. Il reverse engineering di un file APK o IPA può facilmente esporre queste credenziali. Instrada sempre le tue richieste attraverso un proxy backend sicuro o un API Gateway.

A. Implementazione Android (Kotlin)

Ecco come effettuare una richiesta HTTP POST asincrona a un endpoint backend sicuro utilizzando OkHttp per ottenere una risposta da un modello basato su cloud:

import okhttp3.*
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.RequestBody.Companion.toRequestBody
import java.io.IOException

class CloudAIService {
    private val client = OkHttpClient()
    private val mediaType = "application/json; charset=utf-8".toMediaType()

    fun generateText(prompt: String, callback: (String?) -> Unit) {
        val jsonPayload = """
            {
                "model": "gpt-4-mini",
                "messages": [{"role": "user", "content": "$prompt"}]
            }
        """.trimIndent()

        val requestBody = jsonPayload.toRequestBody(mediaType)
        val request = Request.Builder()
            .url("https://api.ghaznix.com/v1/ai/generate")
            .post(requestBody)
            .build()

        client.newCall(request).enqueue(object : Callback {
            override fun onFailure(call: Call, e: IOException) {
                callback(null)
            }

            override fun onResponse(call: Call, response: Response) {
                if (response.isSuccessful) {
                    val responseString = response.body?.string()
                    callback(responseString)
                } else {
                    callback(null)
                }
            }
        })
    }
}

B. Implementazione iOS (Swift)

Di seguito è riportata l’implementazione iOS in Swift che utilizza i moderni async/await e URLSession per comunicare con lo stesso backend di IA nel Cloud:

import Foundation

class CloudAIService {
    
    struct ChatRequest: Codable {
        let model: String
        let messages: [Message]
    }
    
    struct Message: Codable {
        let role: String
        let content: String
    }
    
    func generateText(prompt: String) async throws -> String {
        guard let url = URL(string: "https://api.ghaznix.com/v1/ai/generate") else {
            throw URLError(.badURL)
        }
        
        var request = URLRequest(url: url)
        request.httpMethod = "POST"
        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
        
        let payload = ChatRequest(
            model: "gpt-4-mini",
            messages: [Message(role: "user", content: prompt)]
        )
        
        request.httpBody = try JSONEncoder().encode(payload)
        
        let (data, response) = try await URLSession.shared.data(for: request)
        
        guard let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 else {
            throw URLError(.badServerResponse)
        }
        
        if let jsonString = String(data: data, encoding: .utf8) {
            return jsonString
        } else {
            throw URLError(.cannotDecodeContentData)
        }
    }
}

5. Strategie di ottimizzazione dell’IA per dispositivi mobili

Quando si distribuiscono modelli direttamente sui dispositivi degli utenti, l’ottimizzazione è fondamentale per evitare il consumo eccessivo della batteria e l’aumento delle dimensioni dell’app:

  1. Quantizzazione (Post-Training): Converte i pesi del modello da virgola mobile a 32 bit (FP32) a interi a 8 bit (INT8). Ciò riduce le dimensioni del file del modello del 75% e accelera l’esecuzione su NPU con una perdita di precisione quasi nulla.
  2. Model Pruning (Potatura): Rimuove le connessioni neurali ridondanti che contribuiscono in modo minimo alla precisione del modello.
  3. Hardware Delegation: Assicurarsi che il codice utilizzi gli acceleratori hardware (ad esempio, utilizzando .useNNAPI(true) su Android o abilitando le opzioni GPU/Neural Engine nella configurazione Swift di iOS).

6. Conclusione

L’integrazione dell’IA nelle app mobili non è più solo una questione di connessione ad API esterne. Scegliendo l’esecuzione on-device, gli sviluppatori possono offrire esperienze utente private, senza latenza e altamente reattive.

Esplora altri approfondimenti tecnici sul Blog di Ghaznix →