Apple container

Apple container

Apple container

In questo articolo ci concentreremo sul tool e la libreria Swift (apple/container), che è l’elemento pratico e utilizzabile dagli sviluppatori, usando il contesto di Apple News come uno dei principali casi d’uso che ne ha probabilmente guidato la creazione..

Apple Container: Non solo per le News, un’immersione nel formato di archiviazione Swift di Cupertino

Mettiamoci nei panni di uno sviluppatore, chiamiamolo Marco. Marco sta lavorando a una nuova app per macOS e iOS. L’app necessita di gestire “pacchetti di risorse”: potrebbero essere temi per l’interfaccia utente, livelli di un gioco, o magari i dati e i pesi di un modello di machine learning. Ogni pacchetto contiene decine di file: JSON di configurazione, immagini PNG, icone SVG, forse anche dei file binari.

La prima idea di Marco è usare un banale archivio .zip. Funziona, ma è goffo. Per leggere un singolo, piccolo file di configurazione, deve decomprimere l’intero pacchetto in memoria o su disco. E come può garantire che nessuno abbia manomesso il pacchetto dopo averlo scaricato? Potrebbe implementare un sistema di firme digitali, ma è un’altra complicazione.

È in questo scenario, comune a molti di noi, che si inserisce una soluzione elegante e forse poco conosciuta, rilasciata in open source direttamente da Apple: Apple Container. Un nome semplice che nasconde un tool potente e sorprendentemente versatile.

Facciamo chiarezza: Quale “Container”?

Prima di addentrarci nel codice, è fondamentale fare chiarezza. Se cerchi “Apple Container” sui portali per sviluppatori di Apple, ti imbatterai in due concetti molto diversi:

  1. Container in Apple News Format: Come documentato su developer.apple.com, questo è un componente di layout all’interno della struttura JSON usata per definire gli articoli su Apple News. È un oggetto che raggruppa altri elementi visivi (testo, immagini, etc.) per applicare stili e posizionamenti comuni. È un concetto legato alla presentazione, non all’archiviazione di file.
  2. apple/container su GitHub: Questo è l’oggetto del nostro articolo. È una libreria Swift e un tool a riga di comando per creare, leggere e gestire un formato di archivio file chiamato .applecontainer. È un vero e proprio formato di file, pensato per aggregare in modo efficiente più file in un unico contenitore.

Il legame? È molto probabile che il formato .applecontainer sia stato sviluppato internamente proprio per esigenze come quelle di Apple News: aggregare tutte le risorse di un articolo (immagini, font, dati) in un unico pacchetto da inviare ai server di Apple. Ora, grazie al rilascio open-source, possiamo usarlo anche noi.

Le Caratteristiche Vincenti del Formato – Apple container

Il file .applecontainer non è un semplice “zip senza compressione”. Le sue caratteristiche, descritte nel README del progetto, lo rendono ideale per scenari moderni:

  • Accesso Casuale (Random Access): Questa è la killer feature. Puoi leggere i metadati e il contenuto di un qualsiasi file all’interno dell’archivio senza dover scorrere l’intero contenitore. Vuoi solo i 100 byte del file config.json che si trova alla fine di un archivio da 2GB? Puoi farlo istantaneamente.
  • Streaming-Friendly: Il formato è progettato per essere letto e scritto in modo sequenziale, rendendolo perfetto per operazioni di rete.
  • Integrità e Autenticità: I container possono essere firmati digitalmente (usando firme P-256) per garantire che non siano stati alterati e per verificarne l’origine.
  • Efficienza: È un formato binario semplice, senza la complessità e l’overhead della compressione, ideale quando i file sono già compressi (es. PNG, JPEG) o quando la velocità di accesso è più importante della dimensione su disco.

Mettiamoci al Lavoro: Installazione e Creazione

Vediamo come Marco (e noi con lui) può integrare apple/container nel suo progetto. Essendo un pacchetto Swift, l’integrazione è banale. Nel file Package.swift, basta aggiungere la dipendenza:

      // swift-tools-version:5.5
import PackageDescription

let package = Package(
    name: "MiaAppFantastica",
    dependencies: [
        .package(url: "https://github.com/apple/container.git", from: "1.0.0"),
    ],
    targets: [
        .executableTarget(
            name: "MiaAppFantastica",
            dependencies: [
                .product(name: "AppleContainer", package: "container"),
            ]
        ),
    ]
)
    

Ora, creiamo il nostro primo container. Immaginiamo di avere una cartella theme_assets con due file: style.json e background.png.

Ecco il codice Swift per creare un archivio default.theme (che è un file .applecontainer con un’estensione personalizzata):

      import Foundation
import AppleContainer

// Definiamo il percorso del nostro futuro container
let containerURL = URL(fileURLWithPath: "default.theme")

// Creiamo un writer per il nostro container
guard var writer = try? FileSystemContainerWriter(containerURL: containerURL) else {
    fatalError("Impossibile creare il writer per il container.")
}

// Aggiungiamo i file al container
do {
    // Modo 1: Aggiungere un file da un percorso su disco
    let styleURL = URL(fileURLWithPath: "theme_assets/style.json")
    try writer.add(entryAt: styleURL, pathInContainer: "config/style.json")

    // Modo 2: Aggiungere dati direttamente da un oggetto Data in memoria
    if let imageData = FileManager.default.contents(atPath: "theme_assets/background.png") {
        let entry = Entry(info: .init(path: "images/background.png", type: .regular), data: imageData)
        try writer.add(entry: entry)
    }

    // Finalizziamo la scrittura del container su disco
    try writer.write()
    print("Container 'default.theme' creato con successo!")

} catch {
    print("Errore durante la creazione del container: \(error)")
}
    

Questo stesso risultato può essere ottenuto usando il tool a riga di comando (CLI) che viene compilato insieme alla libreria:

      # Prima compiliamo il tool (da eseguire nella cartella del package clonato)
$ swift build

# Ora creiamo il container
$ .build/debug/apple-container create default.theme \
    --add theme_assets/style.json config/style.json \
    --add theme_assets/background.png images/background.png
    

Leggere e Ispezionare il Container

Creare è solo metà del lavoro. Vediamo come l’app di Marco può leggere i dati dall’archivio default.theme.

Prima di tutto, l’ispezione rapida con la CLI è incredibilmente utile in fase di sviluppo:

      # Ottenere informazioni generali sul container
$ .build/debug/apple-container info default.theme
Container: default.theme
Version: 1
Entry Count: 2
Signature: (none)

# Listare il contenuto del container
$ .build/debug/apple-container list default.theme
-rw-r--r--  config/style.json
-rw-r--r--  images/background.png
    

Ora, vediamo come accedere a questi dati programmaticamente in Swift, che è ciò che serve all’interno dell’app:

      import Foundation
import AppleContainer

let containerURL = URL(fileURLWithPath: "default.theme")

do {
    // Apriamo il container in modalità lettura
    let container = try FileSystemContainer(containerURL: containerURL)

    // Iterare su tutte le entry per vedere cosa c'è dentro
    print("Contenuto del container:")
    for entry in container.entries {
        print("- \(entry.info.path) (\(entry.info.size) bytes)")
    }

    // Accedere a un file specifico: il modo più performante
    print("\nLettura del file di stile:")
    if let styleEntry = container["config/style.json"] {
        // Leggiamo i byte del file
        let styleData = try container.read(entry: styleEntry)
        
        // Eseguiamo il decode del JSON
        // (supponendo una struct Decodable `ThemeStyle`)
        // let theme = try JSONDecoder().decode(ThemeStyle.self, from: styleData)
        
        let styleString = String(data: styleData, encoding: .utf8) ?? "Dati non validi"
        print(styleString)
    }

} catch {
    print("Errore durante la lettura del container: \(error)")
}
    

L’accesso tramite subscript container[“…”] è un esempio perfetto della potenza dell’accesso casuale. Non importa quanto sia grande il container, l’accesso ai metadati dell’entry è quasi istantaneo.

Il Tocco Finale: le Firme Digitali

Torniamo al problema della sicurezza di Marco. Con apple/container, aggiungere una firma è un’operazione integrata. Prima, bisogna generare una coppia di chiavi privata/pubblica (usando, ad esempio, OpenSSL).

      # Genera una chiave privata P-256
$ openssl ecparam -name prime256v1 -genkey -noout -out private_key.pem

# Estrai la chiave pubblica corrispondente
$ openssl ec -in private_key.pem -pubout -out public_key.pem
    

Ora, possiamo creare un container firmato:

      $ .build/debug/apple-container create secure.theme \
    --add theme_assets/style.json config/style.json \
    --signature-path private_key.pem
    

E, cosa più importante, possiamo verificarlo prima di usarlo, sia da CLI che da codice, usando la chiave pubblica.

      $ .build/debug/apple-container verify secure.theme --signature-path public_key.pem
Verification successful.
    

Questo flusso garantisce che il pacchetto di temi non solo sia integro, ma provenga anche da una fonte fidata (chi possiede la chiave privata).

Conclusione: Uno Strumento da Avere nella Cassetta degli Attrezzi

Apple Container risolve un problema comune con una soluzione che incarna la filosofia di Apple: è semplice in superficie, ma potente e sicura sotto il cofano. Abbandona la complessità dei formati di archivio tradizionali per concentrarsi su velocità di accesso, integrità e facilità d’uso all’interno dell’ecosistema Swift.

Per lo sviluppatore Marco, e per tutti noi, rappresenta un’alternativa robusta e performante ai file .zip o a formati binari custom. Che si tratti di pacchetti di risorse, modelli di ML, documenti complessi o bundle per servizi come Apple News, apple/container è un’aggiunta preziosa alla nostra cassetta degli attrezzi, un testamento di come le soluzioni più eleganti nascano spesso da necessità concrete e ben definite.

(fonte) (fonte)

Innovaformazione, scuola informatica specialistica segue costantemente i trend del mercato IT ed affianca le aziende nella formazione dei dipendenti dei team di sviluppatori. Trovate l’elenco corsi a catalogo rivolti alle aziende sul nostro sito QUI. (Vedi anche il Corso Swift)

Per altri articoli tecnici consigliamo invece di navigare sul nostro blog QUI.

INFO: info@innovaformazione.net – tel. 3471012275 (Dario Carrassi)

Ti potrebbe interessare

Articoli correlati