Integrazione dell'IA nelle app mobili: una guida pratica passo dopo passo
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:
- 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.
- Model Pruning (Potatura): Rimuove le connessioni neurali ridondanti che contribuiscono in modo minimo alla precisione del modello.
- 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.