Trabajo con archivos ZIP en Swift (iOS/macOS)
La compresión y descompresión de datos es una de las tareas clave al desarrollar aplicaciones para iOS y macOS. El formato ZIP sigue siendo la forma más popular de empaquetar archivos gracias a su versatilidad y soporte integrado en los sistemas operativos de Apple. En este artículo, veremos dos enfoques principales para trabajar con archivos ZIP en Swift: el uso del framework integrado Foundation y la potente biblioteca de terceros Zip Foundation.
1. Herramientas integradas de Foundation (NSFileCoordinator + libz)
A partir de iOS 9 y macOS 10.11, Apple proporciona soporte limitado pero suficiente para tareas básicas de ZIP a través de la clase NSFileCoordinator y la biblioteca del sistema libz. Sin embargo, este método requiere gestión manual de flujos y no es adecuado para escenarios complejos.
Ejemplo: descompresión de un archivo ZIP con libz
import Foundationimport Compression
func unzipFile(at sourceURL: URL, to destinationURL: URL) throws { let sourceData = try Data(contentsOf: sourceURL) // Usamos el descompresor del sistema let decodedData = try sourceData.withUnsafeBytes { (ptr: UnsafeRawBufferPointer) -> Data in let sourcePtr = ptr.baseAddress!.assumingMemoryBound(to: UInt8.self) let sourceSize = sourceData.count // Buffer para datos descomprimidos (generalmente mayor que el 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) } // Guardamos los datos descomprimidos try decodedData.write(to: destinationURL, options: .atomic)}Limitaciones del enfoque integrado:
- No hay soporte para archivos multifichero
- No hay manejo de contraseñas
- Requiere gestión manual de buffers
- Difícil manejar archivos grandes
2. Biblioteca Zip Foundation (método recomendado)
Zip Foundation es una biblioteca de código abierto que proporciona una API simple y elegante para trabajar con archivos ZIP en Swift. Soporta:
- Creación y descompresión de archivos
- Trabajo con contraseñas (AES-256)
- Barras de progreso mediante Combine o closures
- Procesamiento en flujo de archivos grandes
- Soporte para macOS, iOS, watchOS y tvOS
Instalación mediante Swift Package Manager
// En el archivo Package.swift o a través de Xcode:dependencies: [ .package(url: "https://github.com/marmelroy/Zip.git", from: "2.1.0")]Ejemplo: creación de un archivo ZIP
import Zip
func createZipArchive() { let fileManager = FileManager.default let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first! // Recolectamos los archivos para comprimir let file1 = documentsURL.appendingPathComponent("report.pdf") let file2 = documentsURL.appendingPathComponent("photo.jpg") let filesToZip = [file1, file2] // Ruta al futuro archivo let archiveURL = documentsURL.appendingPathComponent("backup.zip") do { // Progreso mediante closure try Zip.zipFiles(paths: filesToZip, zipFilePath: archiveURL, password: nil, progress: { (progress) in print("Progreso de compresión: \\(Int(progress * 100))%") }) print("Archivo creado: \\(archiveURL.path)") } catch { print("Error al crear el archivo: \\(error.localizedDescription)") }}Ejemplo: descompresión de un archivo con
También en la biblioteca
Validación de datos en Rust: revisión de bibliotecas y frameworks
Trabajo con CSV en PHP: biblioteca SplFileObject y funciones integradas
Cliente HTTP para C# (.NET): mejores bibliotecas para trabajar con solicitudes web
Vision para Swift: guía completa con ejemplos prácticos
Trabajo con Apache Kafka en Java: guía completa para desarrolladores