ZipPinch

1.4.0

Remote access to files inside a ZIP file for macOS, iOS and watchOS.
buh/ZipPinch

What's New

2023-10-12T17:27:23Z

Main update

The default decompressor moved to ZIPEntry as a static closure:

ZIPEntry.decompress = { data in
    // ... a custom decompression
}

Other changes

  • ZIPProgress.callback as @Sendable
  • Added labels for ZIP entries data: (entry: ZIPEntry, data: Data)

ZipPinch cover

ZipPinch is an extension for URLSession to work with zip files remotely. It reads the contents of a zip file without downloading it itself and decompresses the desired files.

Imagine that you need remote access to several files (different kinds of assets: pictures, fonts, etc.). And these files can be changed and added to. Perhaps these files are grouped, for example, by locale and your app needs assets for a particular locale. In a good way you need a server solution that returns some JSON with a description of available resources. For example, you can use any PaaS, but ZipPinch offers a much simpler solution.

It makes a request to a remote ZIP archive and returns its structure with the file size and date of file modification. Free hosting for your zip files is not hard to find. Files in an uncompressed archive will essentially be downloaded as is and no time will be spent on unzipping.

Screenshots from the Demo app: Hubble

Requirements

  • Swift 5.6+
  • macOS 12+
  • iOS 15+
  • watchOS 8+

Installation

  1. In Xcode go to FileAdd Packages...
  2. Search for the link below and click Add Package
https://github.com/buh/ZipPinch.git
  1. Select to which target you want to add it and select Add Package

Usage

Getting started

  1. First you need to create an instance of URLSession. Then make a request for the contents via a direct URL to your ZIP file.
let urlSession = URLSession(configuration: .default)
let entries = try await urlSession.zipEntries(from: url)

Note

You can also add a URLSessionTaskDelegate or use a customised URLRequest.

  1. Download the data of an entry:
let data = try await urlSession.zipEntryData(entry, from: url)
  1. Use the data to initiate an image or other types.

Check out the Hubble demo app to view selected images from the archive taken by The Hubble Space Telescope.

Download with progress

To download with showing the progress, a ZIPProgress object must be specified:

let data = try await urlSession.zipEntryData(entry, from: url, progress: .init() { progressValue in
    Task { @MainActor in
        self.progress = progressValue
    }
})

Download folder

  1. Converting entries to a tree hierarchy with folders and enrties:
let entries = try await urlSession.zipEntries(from: url)
let rootFolder = entries.rootFolder()
  1. Recursively load folder and subfolder entries:
// folderData: [(entry: ZIPEntry, data: Data)]
let folderData = try await urlSession.zipFolderData(folder, from: url)
  1. The same, but with the overall progress:
// folderData: [(entry: ZIPEntry, data: Data)]
let folderData = try await urlSession.zipFolderData(folder, from: url, progress: .init() { progressValue in
    Task { @MainActor in
        self.progress = progressValue
    }
})

Features

  • Custom URLRequest
  • Task management with URLSessionTaskDelegate
  • Support for a custom decompressor
  • ZIP 64-bit support
  • Tracking the downloading progress
  • Demo for iPhone/iPad/macOS.
  • ZIP entries as a tree of Folders/Files.
  • Dowload a folder.

ZIP file format specification sources

Support

You can buy me a coffee here ☕️

License

ZipPinch is available under the MIT license

Description

  • Swift Tools 5.6.0
View More Packages from this Author

Dependencies

  • None
Last updated: Mon Apr 29 2024 04:02:27 GMT-0900 (Hawaii-Aleutian Daylight Time)