Travailler avec les archives ZIP en Swift (iOS/macOS)
La compression et la décompression de données sont des tâches clés lors du développement d'applications pour iOS et macOS. Le format ZIP reste la méthode d'emballage de fichiers la plus populaire grâce à sa polyvalence et à sa prise en charge intégrée dans les systèmes d'exploitation Apple. Dans cet article, nous examinerons deux approches principales pour travailler avec les archives ZIP en Swift : l'utilisation du framework intégré Foundation et la puissante bibliothèque tierce Zip Foundation.
1. Outils intégrés Foundation (NSFileCoordinator + libz)
Depuis iOS 9 et macOS 10.11, Apple fournit une prise en charge limitée mais suffisante pour les tâches de base des ZIP via la classe NSFileCoordinator et la bibliothèque système libz. Cependant, cette méthode nécessite une gestion manuelle des flux et ne convient pas aux scénarios complexes.
Exemple : extraction d'une archive ZIP avec libz
import Foundationimport Compression
func unzipFile(at sourceURL: URL, to destinationURL: URL) throws { let sourceData = try Data(contentsOf: sourceURL) // Utilisation du décompresseur système let decodedData = try sourceData.withUnsafeBytes { (ptr: UnsafeRawBufferPointer) -> Data in let sourcePtr = ptr.baseAddress!.assumingMemoryBound(to: UInt8.self) let sourceSize = sourceData.count // Tampon pour les données décompressées (généralement plus grand que l'original) let bufferSize = sourceSize * 4 var buffer = Data(count: bufferSize) let decodedSize = buffer.withUnsafeMutableBytes { (destPtr: UnsafeMutableRawBufferPointer) -> Int in let dest = destPtr.baseAddress!.assumingMemoryBound(to: UInt8.self) return compression_decode_buffer(dest, bufferSize, sourcePtr, sourceSize, nil, COMPRESSION_ZLIB) } return buffer.prefix(decodedSize) } // Sauvegarde des données décompressées try decodedData.write(to: destinationURL, options: .atomic)}Limitations de l'approche intégrée :
- Pas de prise en charge des archives multi-fichiers
- Absence de gestion des mots de passe
- Gestion manuelle des tampons requise
- Difficile de traiter les gros fichiers
2. Bibliothèque Zip Foundation (méthode recommandée)
Zip Foundation est une bibliothèque open-source qui fournit une API simple et élégante pour travailler avec les archives ZIP en Swift. Elle prend en charge :
- Création et extraction d'archives
- Gestion des mots de passe (AES-256)
- Barres de progression via Combine ou closures
- Traitement en flux des gros fichiers
- Prise en charge de macOS, iOS, watchOS et tvOS
Installation via Swift Package Manager
// Dans le fichier Package.swift ou via Xcode :dependencies: [ .package(url: "https://github.com/marmelroy/Zip.git", from: "2.1.0")]Exemple : création d'une archive ZIP
import Zip
func createZipArchive() { let fileManager = FileManager.default let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first! // Collecte des fichiers à archiver let file1 = documentsURL.appendingPathComponent("report.pdf") let file2 = documentsURL.appendingPathComponent("photo.jpg") let filesToZip = [file1, file2] // Chemin vers la future archive let archiveURL = documentsURL.appendingPathComponent("backup.zip") do { // Progression via closure try Zip.zipFiles(paths: filesToZip, zipFilePath: archiveURL, password: nil, progress: { (progress) in print("Progression de l'archivage : \\(Int(progress * 100))%") }) print("Archive créée : \\(archiveURL.path)") } catch { print("Erreur lors de la création de l'archive : \\(error.localizedDescription)") }}Exemple : extraction d'une archive avec
Aussi dans la bibliothèque
FluentValidation pour C# (.NET) : guide complet avec exemples
Kotlinx.serialization et Valiktor : validation de données en Kotlin
Planificateur de tâches en Go (Golang) : cron, gocron et robfig/cron