Read property lists embedded inside of Mach-O executables (commonly Command Line Tools)

What's New


  • Fixed issue with reading external property lists for fat (universal) binaries

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.


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: CodingKey, String {
        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 Version

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

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

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


  • Swift Tools 5.5.0
View More Packages from this Author


  • None
Last updated: Wed Oct 27 2021 15:24:37 GMT-0500 (GMT-05:00)