Arbeiten mit ZIP/Archiven in Swift (iOS/macOS): vollständige Anleitung

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

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

Empfehlungen