العمل مع أرشيفات ZIP في Swift (iOS/macOS): دليل شامل

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

العمل مع أرشيفات ZIP في Swift (iOS/macOS)



يُعد ضغط البيانات وفك ضغطها من المهام الأساسية عند تطوير التطبيقات لنظامي iOS وmacOS. يظل تنسيق ZIP الطريقة الأكثر شيوعًا لتعبئة الملفات بفضل شموليته ودعمه المدمج في أنظمة تشغيل Apple. في هذه المقالة، سنستعرض طريقتين رئيسيتين للعمل مع أرشيفات ZIP في Swift: استخدام إطار العمل المدمج Foundation ومكتبة الطرف الثالث القوية Zip Foundation.



1. أدوات Foundation المدمجة (NSFileCoordinator + libz)



بدءًا من iOS 9 وmacOS 10.11، توفر Apple دعمًا محدودًا ولكنه كافٍ للمهام الأساسية لأرشيفات ZIP عبر الفئة NSFileCoordinator والمكتبة النظامية libz. ومع ذلك، تتطلب هذه الطريقة إدارة يدوية للتيارات (threads) ولا تناسب السيناريوهات المعقدة.



مثال: فك ضغط أرشيف ZIP باستخدام libz



import Foundationimport Compression

func unzipFile(at sourceURL: URL, to destinationURL: URL) throws { let sourceData = try Data(contentsOf: sourceURL) // استخدام أداة فك الضغط النظامية let decodedData = try sourceData.withUnsafeBytes { (ptr: UnsafeRawBufferPointer) -> Data in let sourcePtr = ptr.baseAddress!.assumingMemoryBound(to: UInt8.self) let sourceSize = sourceData.count // مخزن مؤقت للبيانات المفكوكة (عادةً أكبر من الأصل) 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) } // حفظ البيانات المفكوكة try decodedData.write(to: destinationURL, options: .atomic)}


قيود النهج المدمج:

  • لا يدعم الأرشيفات متعددة الملفات
  • لا يوجد دعم لكلمات المرور
  • يتطلب إدارة يدوية للمخازن المؤقتة
  • صعوبة معالجة الملفات الكبيرة


2. مكتبة Zip Foundation (الطريقة الموصى بها)



Zip Foundation هي مكتبة مفتوحة المصدر توفر واجهة برمجة تطبيقات بسيطة وأنيقة للعمل مع أرشيفات ZIP في Swift. تدعم:

  • إنشاء وفك ضغط الأرشيفات
  • العمل مع كلمات المرور (AES-256)
  • أشرطة التقدم عبر Combine أو الإغلاقات (closures)
  • المعالجة التدفقية للملفات الكبيرة
  • دعم macOS وiOS وwatchOS وtvOS


التثبيت عبر Swift Package Manager



// في ملف Package.swift أو عبر Xcode:dependencies: [    .package(url: "https://github.com/marmelroy/Zip.git", from: "2.1.0")]


مثال: إنشاء أرشيف ZIP



import Zip

func createZipArchive() { let fileManager = FileManager.default let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first! // جمع الملفات للأرشفة let file1 = documentsURL.appendingPathComponent("report.pdf") let file2 = documentsURL.appendingPathComponent("photo.jpg") let filesToZip = [file1, file2] // مسار الأرشيف المستقبلي let archiveURL = documentsURL.appendingPathComponent("backup.zip") do { // التقدم عبر الإغلاق try Zip.zipFiles(paths: filesToZip, zipFilePath: archiveURL, password: nil, progress: { (progress) in print("تقدم الأرشفة: \\(Int(progress * 100))%") }) print("تم إنشاء الأرشيف: \\(archiveURL.path)") } catch { print("خطأ في إنشاء الأرشيف: \\(error.localizedDescription)") }}


مثال: فك ضغط أرشيف مع

توصيات