Travailler avec les archives ZIP en Swift (iOS/macOS)
Dans le développement moderne pour iOS et macOS, il est souvent nécessaire de compresser des fichiers dans des archives ZIP ou d'en extraire des données. Cela peut être utile pour économiser de l'espace, transférer des données sur le réseau ou organiser des sauvegardes. Dans cet article, nous examinerons deux approches principales : l'utilisation des fonctionnalités intégrées de Foundation et la bibliothèque tierce populaire ZipFoundation.
Outils intégrés de Foundation (NSFileCoordinator + travail de bas niveau)
Apple ne fournit pas d'API de haut niveau pour travailler avec les archives ZIP dans Foundation. Cependant, à partir d'iOS 12 / macOS 10.14, il est possible d'utiliser NSFileCoordinator et NSFileWrapper pour certaines opérations. Mais pour une manipulation complète des archives ZIP, on utilise le plus souvent l'utilitaire système libz via l'interface C.
Exemple : compression de données avec libz
import Compressionimport Foundation
func compressData(_ data: Data) -> Data? { let sourceData = data as NSData let compressedData = NSMutableData(length: data.count)! var compressedSize = data.count let result = compression_encode( compressedData.mutableBytes.assumingMemoryBound(to: UInt8.self), &compressedSize, sourceData.bytes.assumingMemoryBound(to: UInt8.self), data.count, nil, COMPRESSION_ZLIB ) guard result == COMPRESSION_STATUS_OK else { return nil } compressedData.length = compressedSize return compressedData as Data}Bibliothèque ZipFoundation (méthode recommandée)
ZipFoundation est une bibliothèque légère et open source pour travailler avec les archives ZIP en Swift. Elle prend en charge iOS, macOS, tvOS et watchOS. Installation via Swift Package Manager :
// Dans Package.swift ou via Xcodedependencies: [ .package(url: "https://github.com/weichsel/ZIPFoundation.git", from: "0.9.0")]Fonctionnalités principales de ZipFoundation :
- Création d'archives ZIP à partir de fichiers et de dossiers
- Extraction de fichiers individuels ou de l'archive entière
- Prise en charge des mots de passe (AES-256)
- Travail avec des flux pour les fichiers volumineux
- Compatibilité avec macOS et iOS
Exemple 1 : Création d'une archive ZIP
import ZIPFoundationimport Foundation
func createZip(from sourceURL: URL, to destinationURL: URL) throws { let fileManager = FileManager() // Créer une archive à partir d'un dossier try fileManager.zipItem(at: sourceURL, to: destinationURL) // Ou à partir d'un seul fichier // try fileManager.zipItem(at: sourceURL, to: destinationURL, // shouldKeepParent: false)}
// Utilisationlet documents = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!let sourceFolder = documents.appendingPathComponent("MyData")let archiveURL = documents.appendingPathComponent("backup.zip")
do { try createZip(from: sourceFolder, to: archiveURL) print("Archive créée : \\(archiveURL.path)")} catch { print("Erreur : \\(error)")}Exemple 2 : Décompression d'une archive ZIP
import ZIPFoundation
func unzipArchive(at sourceURL: URL, to destinationURL: URL) throws { let fileManager = FileManager() // Créer le dossier de destination s'il n'existe pas try fileManager.createDirectory(at: destinationURL, withIntermediateDirectories: true) // Décompresser try fileManager.unzipItem(at: sourceURL, to: destinationURL)}
// Utilisationlet archiveURL = documents.appendingPathComponent("backup.zip")let extractFolder = documents.appendingPathComponent("ExtractedData")
do { try unzipArchive(at: archiveURL, to: extractFolder) print("Décompression terminée")} catch { Aussi dans la bibliothèque
LeakCanary Kotlin : guide complet avec exemples
Surveillance des applications Java : outils et bonnes pratiques
ORM pour Rust : comparaison de Diesel, SeaORM, SQLx et exemples de code