Arbeiten mit ZIP-Archiven in Swift (iOS/macOS)
Datenkomprimierung und -entpackung sind eine der Kernaufgaben bei der Entwicklung von Apps für iOS und macOS. Das ZIP-Format bleibt aufgrund seiner Vielseitigkeit und der integrierten Unterstützung in den Betriebssystemen von Apple die beliebteste Methode zum Verpacken von Dateien. In diesem Artikel betrachten wir zwei Hauptansätze für die Arbeit mit ZIP-Archiven in Swift: die Verwendung des integrierten Frameworks Foundation und der leistungsstarken Drittanbieter-Bibliothek Zip Foundation.
1. Integrierte Foundation-Mittel (NSFileCoordinator + libz)
Seit iOS 9 und macOS 10.11 bietet Apple eine begrenzte, aber für grundlegende Aufgaben ausreichende Unterstützung für ZIP über die Klasse NSFileCoordinator und die Systembibliothek libz. Diese Methode erfordert jedoch eine manuelle Thread-Verwaltung und ist für komplexe Szenarien nicht geeignet.
Beispiel: Entpacken eines ZIP-Archivs mit libz
import Foundationimport Compression
func unzipFile(at sourceURL: URL, to destinationURL: URL) throws { let sourceData = try Data(contentsOf: sourceURL) // Verwenden des systemeigenen Dekompressors let decodedData = try sourceData.withUnsafeBytes { (ptr: UnsafeRawBufferPointer) -> Data in let sourcePtr = ptr.baseAddress!.assumingMemoryBound(to: UInt8.self) let sourceSize = sourceData.count // Puffer für entpackte Daten (normalerweise größer als das 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) } // Speichern der entpackten Daten try decodedData.write(to: destinationURL, options: .atomic)}Einschränkungen des integrierten Ansatzes:
- Keine Unterstützung für Multi-Datei-Archive
- Keine Arbeit mit Passwörtern
- Manuelle Pufferverwaltung erforderlich
- Schwierige Handhabung großer Dateien
2. Bibliothek Zip Foundation (empfohlene Methode)
Zip Foundation ist eine Open-Source-Bibliothek, die eine einfache und elegante API für die Arbeit mit ZIP-Archiven in Swift bietet. Sie unterstützt:
- Erstellen und Entpacken von Archiven
- Arbeit mit Passwörtern (AES-256)
- Fortschrittsbalken über Combine oder Closures
- Streaming-Verarbeitung großer Dateien
- Unterstützung für macOS, iOS, watchOS und tvOS
Installation über Swift Package Manager
// In der Datei Package.swift oder über Xcode:dependencies: [ .package(url: "https://github.com/marmelroy/Zip.git", from: "2.1.0")]Beispiel: Erstellen eines ZIP-Archivs
import Zip
func createZipArchive() { let fileManager = FileManager.default let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first! // Dateien für die Archivierung sammeln let file1 = documentsURL.appendingPathComponent("report.pdf") let file2 = documentsURL.appendingPathComponent("photo.jpg") let filesToZip = [file1, file2] // Pfad zum zukünftigen Archiv let archiveURL = documentsURL.appendingPathComponent("backup.zip") do { // Fortschritt über Closure try Zip.zipFiles(paths: filesToZip, zipFilePath: archiveURL, password: nil, progress: { (progress) in print("Archivierungsfortschritt: \\(Int(progress * 100))%") }) print("Archiv erstellt: \\(archiveURL.path)") } catch { print("Fehler beim Erstellen des Archivs: \\(error.localizedDescription)") }}Beispiel: Entpacken eines Archivs mit
Auch in der Bibliothek
Zod — leistungsstarke Bibliothek zur Datenvalidierung in TypeScript
JWT-Token in Swift: Arbeiten mit JSON Web Token auf iOS/macOS
Markdown-Verarbeitung in Rust: Bibliotheken, Parser und Werkzeuge