Swiftpack.co - trilemma-dev/EmbeddedPropertyList as Swift Package

Swiftpack.co is a collection of thousands of indexed Swift packages. Search packages.
See all packages published by trilemma-dev.
trilemma-dev/EmbeddedPropertyList 2.0.2
Read property lists embedded inside of Mach-O executables (commonly Command Line Tools)
⭐️ 6
🕓 1 week ago
macOS
.package(url: "https://github.com/trilemma-dev/EmbeddedPropertyList.git", from: "2.0.2")

Using this framework you can read property lists embedded inside of a running executable as well as those of executables stored on disk. These types of executables are often Command Line Tools. Built-in support is provided for reading both embedded info and launchd property lists. Custom property list types can also be specified.

To see a runnable sample app using this framework, check out SwiftAuthorizationSample.

Usage

Property lists are returned as Data instances. Usually you'll want to deserialize using one of:

Example — Read Internal, Create Decodable

When running inside an executable, decode a launchd property list into a custom Decodable struct:

struct LaunchdPropertyList: Decodable {
    let machServices: [String : Bool]
    let label: String
    
    private enum CodingKeys: String, CodingKey {
        case machServices = "MachServices"
        case label = "Label"
    }
}

let data = try EmbeddedPropertyListReader.launchd.readInternal()
let plist = try PropertyListDecoder().decode(LaunchdPropertyList.self, from: data)

Example — Read External, Create NSDictionary

For an external executable, deserialize an info property list as an NSDictionary:

let executableURL = URL(fileUrlWithPath: <# path here #>)
let data = try EmbeddedPropertyListReader.info.readExternal(from: executableURL)
let plist = try PropertyListSerialization.propertyList(from: data,
                                                       options: .mutableContainersAndLeaves,
                                                       format: nil) as? NSDictionary

Example — Create Decodable Using BundleVersion

Decode an info property list, using BundleVersion to decode the CFBundleVersion entry:

struct InfoPropertyList: Decodable {
    let bundleVersion: BundleVersion
    let bundleIdentifier: String
    
    private enum CodingKeys: String, CodingKey {
        case bundleVersion = "CFBundleVersion"
        case bundleIdentifier = "CFBundleIdentifier"
    }
}

let data = try EmbeddedPropertyListReader.info.readInternal()
let plist = try PropertyListDecoder().decode(InfoPropertyList.self, from: data)

GitHub

link
Stars: 6
Last commit: 1 week ago
jonrohan Something's broken? Yell at me @ptrpavlik. Praise and feedback (and money) is also welcome.

Release Notes

2.0.2
1 week ago
  • Fixes a bug where BundleVersion could be initialized with values ending in a period; this did not match CFBundleVersion semantics. Values such as 1.2. now correctly fail to initialize.

Swiftpack is being maintained by Petr Pavlik | @ptrpavlik | @swiftpackco | API | Analytics