Trabalho com arquivos ZIP em Swift (iOS/macOS)
A compressão e descompressão de dados é uma das tarefas essenciais no desenvolvimento de aplicativos para iOS e macOS. O formato ZIP continua sendo a forma mais popular de empacotar arquivos devido à sua versatilidade e suporte nativo nos sistemas operacionais da Apple. Neste artigo, abordaremos duas abordagens principais para trabalhar com arquivos ZIP em Swift: o uso do framework nativo Foundation e a poderosa biblioteca de terceiros Zip Foundation.
1. Recursos nativos do Foundation (NSFileCoordinator + libz)
A partir do iOS 9 e macOS 10.11, a Apple oferece suporte limitado, mas suficiente para tarefas básicas, ao ZIP através da classe NSFileCoordinator e da biblioteca do sistema libz. No entanto, esse método requer gerenciamento manual de fluxos e não é adequado para cenários complexos.
Exemplo: descompactação de arquivo ZIP com libz
import Foundationimport Compression
func unzipFile(at sourceURL: URL, to destinationURL: URL) throws { let sourceData = try Data(contentsOf: sourceURL) // Usamos o descompressor do sistema let decodedData = try sourceData.withUnsafeBytes { (ptr: UnsafeRawBufferPointer) -> Data in let sourcePtr = ptr.baseAddress!.assumingMemoryBound(to: UInt8.self) let sourceSize = sourceData.count // Buffer para dados descompactados (geralmente maior que o 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) } // Salvamos os dados descompactados try decodedData.write(to: destinationURL, options: .atomic)}Limitações da abordagem nativa:
- Sem suporte para arquivos com múltiplos arquivos
- Sem suporte a senhas
- Requer gerenciamento manual de buffers
- Difícil processar arquivos grandes
2. Biblioteca Zip Foundation (forma recomendada)
Zip Foundation é uma biblioteca open-source que oferece uma API simples e elegante para trabalhar com arquivos ZIP em Swift. Ela suporta:
- Criação e descompactação de arquivos
- Trabalho com senhas (AES-256)
- Barras de progresso via Combine ou closures
- Processamento em fluxo de arquivos grandes
- Suporte para macOS, iOS, watchOS e tvOS
Instalação via Swift Package Manager
// No arquivo Package.swift ou via Xcode:dependencies: [ .package(url: "https://github.com/marmelroy/Zip.git", from: "2.1.0")]Exemplo: criação de arquivo ZIP
import Zip
func createZipArchive() { let fileManager = FileManager.default let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first! // Coletamos os arquivos para arquivar let file1 = documentsURL.appendingPathComponent("report.pdf") let file2 = documentsURL.appendingPathComponent("photo.jpg") let filesToZip = [file1, file2] // Caminho para o futuro arquivo let archiveURL = documentsURL.appendingPathComponent("backup.zip") do { // Progresso via closure try Zip.zipFiles(paths: filesToZip, zipFilePath: archiveURL, password: nil, progress: { (progress) in print("Progresso da arquivação: \\(Int(progress * 100))%") }) print("Arquivo criado: \\(archiveURL.path)") } catch { print("Erro ao criar arquivo: \\(error.localizedDescription)") }}Exemplo: descompactação de arquivo com
Também na biblioteca
Validação de dados em PHP: guia e ferramentas
ORM para JavaScript (Node.js): comparação entre Sequelize, TypeORM, Prisma
Programação Reativa em Go (Golang): bibliotecas, padrões e exemplos
Monitoramento de aplicações Kotlin: visão geral de ferramentas e bibliotecas
Geração de PDF em JavaScript (Node.js): bibliotecas e ferramentas