Trabajo con archivos ZIP en Swift (iOS/macOS): guía completa

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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

Recommendations