├── Sources ├── install-ios-app │ ├── install-ios-app.h │ ├── ent.plist │ └── main.swift ├── SideloadKit │ ├── SideloadKit.swift │ ├── Utilities │ │ ├── ObjectiveC.swift │ │ ├── Shell.swift │ │ ├── SideloadIO.swift │ │ └── Bom.swift │ ├── Classes │ │ ├── IPA.swift │ │ ├── AppInfo.swift │ │ └── App.swift │ └── Structs │ │ ├── Entitlement.swift │ │ └── Entitlements.swift └── CSideloadKit │ ├── CSideloadKit.h │ └── CSideloadKit.c ├── m1-ios-sideloader.xcodeproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── IDEWorkspaceChecks.plist │ │ └── swiftpm │ │ └── Package.resolved └── project.pbxproj ├── README.md ├── LICENSE ├── .gitignore └── project.yml /Sources/install-ios-app/install-ios-app.h: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /Sources/SideloadKit/SideloadKit.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SideloadKit.swift 3 | // SideloadKit 4 | // 5 | // Created by Eric Rabil on 11/6/21. 6 | // 7 | 8 | import Foundation 9 | -------------------------------------------------------------------------------- /m1-ios-sideloader.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Sources/CSideloadKit/CSideloadKit.h: -------------------------------------------------------------------------------- 1 | // 2 | // CSideloadKit.h 3 | // CSideloadKit 4 | // 5 | // Created by Eric Rabil on 11/7/21. 6 | // 7 | 8 | #ifndef CSideloadKit_h 9 | #define CSideloadKit_h 10 | 11 | int convert(const char* path); 12 | 13 | #endif /* CSideloadKit_h */ 14 | -------------------------------------------------------------------------------- /m1-ios-sideloader.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Sources/install-ios-app/ent.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /m1-ios-sideloader.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved: -------------------------------------------------------------------------------- 1 | { 2 | "object": { 3 | "pins": [ 4 | { 5 | "package": "SwiftCLI", 6 | "repositoryURL": "https://github.com/jakeheis/SwiftCLI", 7 | "state": { 8 | "branch": null, 9 | "revision": "2e949055d9797c1a6bddcda0e58dada16cc8e970", 10 | "version": "6.0.3" 11 | } 12 | } 13 | ] 14 | }, 15 | "version": 1 16 | } 17 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # m1-ios-sideloader 2 | Sideload iOS apps regardless of security settings 3 | 4 | ## Notes 5 | - Does not support encrypted IPAs at this time - you can grab decrypted IPAs with a simple google search or off of a jailbroken iDevice, or via [yacd](https://github.com/DerekSelander/yacd) on on iOS 13.4.1 and lower, no jb required 6 | 7 | ## Usage 8 | 9 | ```shell 10 | install-ios-app ~/Downloads/Instagram.ipa /Applications/Instagram.app 11 | ``` 12 | 13 | ```shell 14 | # Alternative patching method if default isn't working well 15 | install-ios-app --vtool ~/Downloads/Instagram.ipa /Applications/Instagram.app 16 | ``` 17 | -------------------------------------------------------------------------------- /Sources/SideloadKit/Utilities/ObjectiveC.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ObjectiveC.swift 3 | // SideloadKit 4 | // 5 | // Created by Eric Rabil on 11/6/21. 6 | // 7 | 8 | import Foundation 9 | 10 | extension NSObjectProtocol { 11 | static func enumerateMethods(`static` staticMethods: Bool = false, _ iterator: (Method) throws -> ()) rethrows { 12 | var count: UInt32 = 0 13 | 14 | guard let methodList = class_copyMethodList(staticMethods ? object_getClass(self) : self, &count) else { 15 | return 16 | } 17 | 18 | for i in 0.. String { 12 | let process = Process() 13 | 14 | process.executableURL = URL(fileURLWithPath: binary) 15 | process.arguments = args 16 | 17 | let pipe = Pipe() 18 | process.standardOutput = pipe 19 | process.standardError = pipe 20 | 21 | try process.run() 22 | process.waitUntilExit() 23 | 24 | let output = try pipe.fileHandleForReading.readToEnd() ?? Data() 25 | 26 | return String(decoding: output, as: UTF8.self) 27 | } 28 | -------------------------------------------------------------------------------- /Sources/SideloadKit/Utilities/SideloadIO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SideloadIO.swift 3 | // SideloadKit 4 | // 5 | // Created by Eric Rabil on 11/6/21. 6 | // 7 | 8 | import Foundation 9 | 10 | /// Helpers for where to store working data 11 | internal class SideloadIO { 12 | static var documentDirectory: URL { 13 | FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("SideloadKit") 14 | } 15 | 16 | static var tempDirectory: URL { 17 | documentDirectory.appendingPathComponent("tmp") 18 | } 19 | 20 | static func allocateTempDirectory() throws -> URL { 21 | let workDir = SideloadIO.tempDirectory.appendingPathComponent(UUID().uuidString) 22 | 23 | try FileManager.default.createDirectory(at: workDir, withIntermediateDirectories: true, attributes: [:]) 24 | 25 | return workDir 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Eric Rabil 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Sources/SideloadKit/Classes/IPA.swift: -------------------------------------------------------------------------------- 1 | // 2 | // IPA.swift 3 | // SideloadKit 4 | // 5 | // Created by Eric Rabil on 11/6/21. 6 | // 7 | 8 | import Foundation 9 | 10 | public class IPA { 11 | public let url: URL 12 | public private(set) var workDir: URL? 13 | 14 | public init(url: URL) { 15 | self.url = url 16 | } 17 | 18 | public func allocateWorkDir() throws -> URL { 19 | if let workDir = workDir, FileManager.default.fileExists(atPath: workDir.path) { 20 | return workDir 21 | } 22 | 23 | let workDir = try SideloadIO.allocateTempDirectory() 24 | self.workDir = workDir 25 | 26 | return workDir 27 | } 28 | 29 | public func releaseWorkDir() throws { 30 | guard let workDir = workDir else { 31 | return 32 | } 33 | 34 | if FileManager.default.fileExists(atPath: workDir.path) { 35 | try FileManager.default.removeItem(at: workDir) 36 | } 37 | 38 | self.workDir = nil 39 | } 40 | 41 | public func unzip() throws -> App { 42 | let workDir = try allocateWorkDir() 43 | 44 | switch unzip_to_destination(url.path, workDir.path) { 45 | case .success: 46 | return try App(detectingAppNameInFolder: workDir.appendingPathComponent("Payload")) 47 | case let bomError: throw bomError 48 | } 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /Sources/SideloadKit/Structs/Entitlement.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Entitlement.swift 3 | // SideloadKit 4 | // 5 | // Created by Eric Rabil on 11/6/21. 6 | // 7 | 8 | import Foundation 9 | 10 | public enum Entitlement { 11 | case boolean(Bool) 12 | case strings([String]) 13 | case string(String) 14 | } 15 | 16 | extension Entitlement: Encodable { 17 | @_transparent private var encodable: Encodable { 18 | switch self { 19 | case .boolean(let boolValue): 20 | return boolValue 21 | case .strings(let stringsValue): 22 | return stringsValue 23 | case .string(let stringValue): 24 | return stringValue 25 | } 26 | } 27 | 28 | public func encode(to encoder: Encoder) throws { 29 | try encodable.encode(to: encoder) 30 | } 31 | } 32 | 33 | extension Entitlement: Decodable { 34 | public init(from decoder: Decoder) throws { 35 | let container = try decoder.singleValueContainer() 36 | 37 | do { 38 | self = .boolean(try container.decode(Bool.self)) 39 | } catch { 40 | do { 41 | self = .strings(try container.decode([String].self)) 42 | } catch { 43 | self = .string(try container.decode(String.self)) 44 | } 45 | } 46 | } 47 | } 48 | 49 | public extension Entitlement { 50 | static func parse(rawEntitlements: NSDictionary) -> [String: Entitlement] { 51 | var dictionary = [String: Entitlement](minimumCapacity: rawEntitlements.count) 52 | 53 | for (key, value) in rawEntitlements { 54 | switch value { 55 | case let boolean as Bool: 56 | dictionary[key as! String] = .boolean(boolean) 57 | case let array as [String]: 58 | dictionary[key as! String] = .strings(array) 59 | case let string as String: 60 | dictionary[key as! String] = .string(string) 61 | default: 62 | print("what") 63 | } 64 | } 65 | 66 | return dictionary 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /Sources/install-ios-app/main.swift: -------------------------------------------------------------------------------- 1 | // 2 | // main.swift 3 | // install-ios-app 4 | // 5 | // Created by Eric Rabil on 11/6/21. 6 | // 7 | 8 | import Foundation 9 | import SideloadKit 10 | import SwiftCLI 11 | 12 | class Installer: Command { 13 | let name = "install" 14 | 15 | @Param var src: String 16 | @Param var dst: String 17 | 18 | @Flag("-v", "--vtool") var vtoolPatch: Bool 19 | 20 | lazy var srcURL = URL(fileURLWithPath: src) 21 | lazy var dstURL = URL(fileURLWithPath: dst) 22 | 23 | func execute() throws { 24 | var app: App, ipa: IPA? 25 | 26 | if srcURL.pathExtension == "ipa" { 27 | // extract IPA 28 | ipa = IPA(url: srcURL) 29 | app = try ipa!.unzip() 30 | } else { 31 | app = App(url: srcURL) 32 | } 33 | 34 | let entitlements = try app.readEntitlements() 35 | 36 | let machos = try app.resolveValidMachOs() 37 | 38 | // modify all machos to make macos shut the hell up 39 | for macho in machos { 40 | if try app.isMachoEncrypted(atURL: macho) { 41 | print("Can't process encrypted files at this time, bye!") 42 | exit(-1) 43 | } 44 | 45 | if vtoolPatch { 46 | try app.overwriteVTool(atURL: macho) 47 | } else { 48 | _ = try app.masqueradeToSimulator(atURL: macho) 49 | } 50 | 51 | _ = try app.fakesign(macho) 52 | } 53 | 54 | // -rwxr-xr-x 55 | try app.setBinaryPosixPermissions(0o755) 56 | 57 | let info = try app.readInfo() 58 | info.assert(minimumVersion: 11.0) 59 | info[bool: "UIRequiresFullScreen"] = nil 60 | try info.write() 61 | 62 | try app.wrap(toLocation: dstURL) 63 | 64 | try App(url: dstURL).resign(withEntitlements: entitlements) 65 | 66 | // cleanup tempdir if we unzipped an ipa 67 | try ipa?.releaseWorkDir() 68 | } 69 | } 70 | 71 | CLI(singleCommand: Installer()).goAndExit() 72 | -------------------------------------------------------------------------------- /Sources/SideloadKit/Utilities/Bom.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Bom.swift 3 | // SideloadKit 4 | // 5 | // Bom.framework is an AppleInternal framework for working with a variety of archives. Apple's an asshole for not making it public. Thanks. 6 | // 7 | // Created by Eric Rabil on 11/6/21. 8 | // 9 | 10 | import Foundation 11 | 12 | typealias BOMCopier = OpaquePointer 13 | typealias BOMSys = OpaquePointer 14 | 15 | let BOMHandle = dlopen("/System/Library/PrivateFrameworks/Bom.framework/Bom", RTLD_LAZY) 16 | 17 | @_transparent func BOMFunction(_ name: UnsafePointer) -> T { 18 | unsafeBitCast(dlsym(BOMHandle, name), to: T.self) 19 | } 20 | 21 | let BomSys_default: @convention(c) () -> BOMSys = BOMFunction("BomSys_default") 22 | let BOMCopierNewWithSys: ( 23 | @convention(c) (BOMSys) -> BOMCopier 24 | ) = BOMFunction("BOMCopierNewWithSys") 25 | let BOMCopierFree: ( 26 | @convention(c) (BOMCopier) -> () 27 | ) = BOMFunction("BOMCopierFree") 28 | 29 | let kBOMCopierOptionExtractPKZipKey = "extractPKZip" 30 | 31 | let BOMCopierCopy: ( 32 | @convention(c) (_ copier: BOMCopier, _ fromObj: UnsafePointer, _ toOjb: UnsafePointer) -> CInt 33 | ) = BOMFunction("BOMCopierCopy") 34 | 35 | let BOMCopierCopyWithOptions: ( 36 | @convention(c) (_ copier: BOMCopier, _ fromObj: UnsafePointer, _ toObj: UnsafePointer, _ options: CFDictionary) -> CInt 37 | ) = BOMFunction("BOMCopierCopyWithOptions") 38 | 39 | enum BOMCopierReturn: CInt, Error { 40 | case invalidArgument = 22 41 | case error = -1 42 | case success = 0 43 | case genericError = 1 44 | case inefficient = 2 45 | case unsupportedArchive = 3 46 | case endOfArchive = 4 47 | } 48 | 49 | func unzip_to_destination(_ source: UnsafePointer, _ destination: UnsafePointer) -> BOMCopierReturn { 50 | let copier = BOMCopierNewWithSys(BomSys_default()) 51 | defer { BOMCopierFree(copier) } 52 | 53 | let rawBomCopierReturn = BOMCopierCopyWithOptions(copier, source, destination, [ 54 | "extractPKZip": kCFBooleanTrue 55 | ] as CFDictionary) 56 | 57 | return BOMCopierReturn(rawValue: rawBomCopierReturn)! 58 | } 59 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | ## User settings 6 | xcuserdata/ 7 | 8 | ## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) 9 | *.xcscmblueprint 10 | *.xccheckout 11 | 12 | ## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) 13 | build/ 14 | DerivedData/ 15 | *.moved-aside 16 | *.pbxuser 17 | !default.pbxuser 18 | *.mode1v3 19 | !default.mode1v3 20 | *.mode2v3 21 | !default.mode2v3 22 | *.perspectivev3 23 | !default.perspectivev3 24 | 25 | ## Obj-C/Swift specific 26 | *.hmap 27 | 28 | ## App packaging 29 | *.ipa 30 | *.dSYM.zip 31 | *.dSYM 32 | 33 | ## Playgrounds 34 | timeline.xctimeline 35 | playground.xcworkspace 36 | 37 | # Swift Package Manager 38 | # 39 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. 40 | # Packages/ 41 | # Package.pins 42 | # Package.resolved 43 | # *.xcodeproj 44 | # 45 | # Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata 46 | # hence it is not needed unless you have added a package configuration file to your project 47 | # .swiftpm 48 | 49 | .build/ 50 | 51 | # CocoaPods 52 | # 53 | # We recommend against adding the Pods directory to your .gitignore. However 54 | # you should judge for yourself, the pros and cons are mentioned at: 55 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 56 | # 57 | # Pods/ 58 | # 59 | # Add this line if you want to avoid checking in source code from the Xcode workspace 60 | # *.xcworkspace 61 | 62 | # Carthage 63 | # 64 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 65 | # Carthage/Checkouts 66 | 67 | Carthage/Build/ 68 | 69 | # Accio dependency management 70 | Dependencies/ 71 | .accio/ 72 | 73 | # fastlane 74 | # 75 | # It is recommended to not store the screenshots in the git repo. 76 | # Instead, use fastlane to re-generate the screenshots whenever they are needed. 77 | # For more information about the recommended setup visit: 78 | # https://docs.fastlane.tools/best-practices/source-control/#source-control 79 | 80 | fastlane/report.xml 81 | fastlane/Preview.html 82 | fastlane/screenshots/**/*.png 83 | fastlane/test_output 84 | 85 | # Code Injection 86 | # 87 | # After new code Injection tools there's a generated folder /iOSInjectionProject 88 | # https://github.com/johnno1962/injectionforxcode 89 | 90 | iOSInjectionProject/ 91 | -------------------------------------------------------------------------------- /Sources/SideloadKit/Structs/Entitlements.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Entitlements.swift 3 | // SideloadKit 4 | // 5 | // Created by Eric Rabil on 11/6/21. 6 | // 7 | 8 | import Foundation 9 | 10 | public struct Entitlements: Codable { 11 | public typealias RawStorage = [String: Entitlement] 12 | 13 | public var rawStorage: RawStorage 14 | 15 | public init(rawStorage: RawStorage) { 16 | self.rawStorage = rawStorage 17 | } 18 | 19 | public init(from decoder: Decoder) throws { 20 | rawStorage = try RawStorage(from: decoder) 21 | } 22 | 23 | public func encode(to encoder: Encoder) throws { 24 | try rawStorage.encode(to: encoder) 25 | } 26 | } 27 | 28 | public extension Entitlements { 29 | 30 | 31 | static func parse(rawEntitlements: NSDictionary) -> Entitlements { 32 | Entitlements(rawStorage: Entitlement.parse(rawEntitlements: rawEntitlements)) 33 | } 34 | 35 | static func read(fromURL url: URL) throws -> Entitlements { 36 | var error: NSError? 37 | let ent = AppSandboxEntitlementsCls.entitlementsForCodeAtURL(url as NSURL, error: &error) 38 | 39 | if let error = error { 40 | throw error 41 | } 42 | 43 | return Entitlements.parse(rawEntitlements: ent.allEntitlements()) 44 | } 45 | 46 | subscript (bool index: String) -> Bool? { 47 | guard case .boolean(let boolValue) = rawStorage[index] else { 48 | return nil 49 | } 50 | 51 | return boolValue 52 | } 53 | 54 | subscript (string index: String) -> String? { 55 | guard case .string(let stringValue) = rawStorage[index] else { 56 | return nil 57 | } 58 | 59 | return stringValue 60 | } 61 | 62 | subscript (strings index: String) -> [String]? { 63 | guard case .strings(let stringsValue) = rawStorage[index] else { 64 | return nil 65 | } 66 | 67 | return stringsValue 68 | } 69 | } 70 | 71 | // Private API that lets us copy the entitlements of an app 72 | @objc private protocol AppSandboxEntitlements: NSObjectProtocol { 73 | @objc static func entitlementsForCodeAtURL(_ url: NSURL, error: UnsafeMutablePointer) -> AppSandboxEntitlements 74 | @objc func allEntitlements() -> NSDictionary 75 | } 76 | 77 | private let AppSandboxEntitlementsCls: AppSandboxEntitlements.Type = { 78 | let handle = dlopen("/System/Library/PrivateFrameworks/AppSandbox.framework/AppSandbox", RTLD_NOW) 79 | defer { dlclose(handle) } 80 | 81 | return unsafeBitCast(NSClassFromString("AppSandboxEntitlements"), to: AppSandboxEntitlements.Type.self) 82 | }() 83 | -------------------------------------------------------------------------------- /project.yml: -------------------------------------------------------------------------------- 1 | name: m1-ios-sideloader 2 | fileGroups: 3 | - LICENSE 4 | - README.md 5 | - project.yml 6 | 7 | options: 8 | deploymentTarget: 9 | macOS: 12.0 10 | defaultConfig: Debug 11 | bundleIdPrefix: com.ericrabil 12 | createIntermediateGroups: true 13 | 14 | packages: 15 | SwiftCLI: 16 | url: https://github.com/jakeheis/SwiftCLI 17 | from: 6.0.3 18 | 19 | settings: 20 | base: 21 | AD_HOC_CODE_SIGNING_ALLOWED: YES 22 | FRAMEWORK_SEARCH_PATHS: $(PROJECT_DIR)/Frameworks 23 | CODE_SIGN_IDENTITY: "-" 24 | OTHER_SWIFT_FLAGS: "-Xcc -Wno-nullability-completeness -Xcc -Wno-incomplete-umbrella -Xcc -Wno-property-attribute-mismatch -Xcc -Wno-strict-prototypes -Xcc -Wno-arc-performSelector-leaks -Xcc -Wno-objc-protocol-method-implementation -Xcc -Wno-incomplete-umbrella -Xcc -Wno-visibility" 25 | WARNING_CFLAGS: 26 | - "-Wno-nullability-completeness" 27 | - "-Wno-incomplete-umbrella" 28 | - "-Wno-objc-protocol-method-implementation" 29 | - "-Wno-arc-performSelector-leaks" 30 | - "-Wno-strict-prototypes" 31 | - "-Wno-property-attribute-mismatch" 32 | - "-Wno-visibility" 33 | LD_RUNPATH_SEARCH_PATHS: 34 | - "$(inherited)" 35 | - "@executable_path/../Frameworks" 36 | - "@loader_path/Frameworks" 37 | SWIFT_VERSION: 5.5 38 | SKIP_INSTALL: YES 39 | SDKROOT: "" 40 | ALWAYS_SEARCH_USER_PATHS: NO 41 | GCC_OPTIMIZATION_LEVEL: 3 42 | ARCHS: 43 | - arm64 44 | VALID_ARCHS: "arm64" 45 | SUPPORTED_PLATFORMS: "macosx" 46 | ENABLE_HARDENED_RUNTIME: NO 47 | SYSTEM_FRAMEWORK_SEARCH_PATHS: 48 | - "$(inherited)" 49 | - "$(SDKROOT)$(SYSTEM_LIBRARY_DIR)/PrivateFrameworks" 50 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER: NO 51 | CODE_SIGNING_ALLOWED: YES 52 | configs: 53 | Debug: 54 | SWIFT_ACTIVE_COMPILATION_CONDITIONS: 55 | - DEBUG 56 | 57 | targets: 58 | # Core 59 | SideloadKit: 60 | group: Sources 61 | templates: 62 | - BLFramework 63 | sources: 64 | - Sources/SideloadKit 65 | dependencies: 66 | - target: CSideloadKit 67 | embed: false 68 | link: true 69 | CSideloadKit: 70 | group: Sources 71 | templates: 72 | - BLFramework 73 | sources: 74 | - Sources/CSideloadKit 75 | 76 | # Tools 77 | install-ios-app: 78 | group: Sources 79 | type: tool 80 | platform: macOS 81 | sources: 82 | - Sources/install-ios-app 83 | settings: 84 | base: 85 | CODE_SIGN_ENTITLEMENTS: Sources/install-ios-app/ent.plist 86 | CODE_SIGN_IDENTITY: "-" 87 | SWIFT_OBJC_BRIDGING_HEADER: Sources/install-ios-app/install-ios-app.h 88 | dependencies: 89 | - target: SideloadKit 90 | embed: true 91 | link: true 92 | - target: CSideloadKit 93 | embed: true 94 | link: true 95 | - package: SwiftCLI 96 | 97 | targetTemplates: 98 | BLFramework: 99 | type: framework 100 | platform: macOS 101 | settings: 102 | base: 103 | MACH_O_TYPE: staticlib 104 | DYLIB_INSTALL_NAME_BASE: "@rpath" 105 | DEFINES_MODULE: YES 106 | PRODUCT_NAME: "$(TARGET_NAME:c99extidentifier)" 107 | -------------------------------------------------------------------------------- /Sources/SideloadKit/Classes/AppInfo.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppInfo.swift 3 | // SideloadKit 4 | // 5 | // Created by Eric Rabil on 11/6/21. 6 | // 7 | 8 | import Foundation 9 | 10 | public class AppInfo { 11 | public enum AppInfoError: Error { 12 | case invalidRoot(Any) 13 | } 14 | 15 | public let url: URL 16 | fileprivate var rawStorage: NSMutableDictionary 17 | 18 | public init(contentsOf url: URL) throws { 19 | rawStorage = try NSMutableDictionary(contentsOf: url, error: ()) 20 | 21 | self.url = url 22 | } 23 | 24 | private init(url: URL, rawStorage: NSMutableDictionary) { 25 | self.url = url 26 | self.rawStorage = rawStorage 27 | } 28 | 29 | public func retargeted(toURL url: URL) -> AppInfo { 30 | AppInfo(url: url, rawStorage: rawStorage.mutableCopy() as! NSMutableDictionary) 31 | } 32 | } 33 | 34 | public extension AppInfo { 35 | /// Write an XML-serialized representation of this info to the given URL 36 | func write(toURL url: URL) throws { 37 | try rawStorage.write(to: url) 38 | } 39 | 40 | /// Overwrites the file this AppInfo was loaded from 41 | func write() throws { 42 | try write(toURL: url) 43 | } 44 | } 45 | 46 | // MARK: - Subscripting 47 | 48 | public extension AppInfo { 49 | subscript (string index: String) -> String? { 50 | get { 51 | rawStorage[index] as? String 52 | } 53 | set { 54 | rawStorage[index] = newValue 55 | } 56 | } 57 | 58 | subscript (object index: String) -> NSObject? { 59 | get { 60 | rawStorage[index] as? NSObject 61 | } 62 | set { 63 | rawStorage[index] = newValue 64 | } 65 | } 66 | 67 | subscript (dictionary index: String) -> NSMutableDictionary? { 68 | get { 69 | rawStorage[index] as? NSMutableDictionary 70 | } 71 | set { 72 | rawStorage[index] = newValue 73 | } 74 | } 75 | 76 | subscript (strings index: String) -> [String]? { 77 | get { 78 | rawStorage[index] as? [String] 79 | } 80 | set { 81 | rawStorage[index] = newValue 82 | } 83 | } 84 | 85 | subscript (array index: String) -> NSMutableArray? { 86 | get { 87 | rawStorage[index] as? NSMutableArray 88 | } 89 | set { 90 | rawStorage[index] = newValue 91 | } 92 | } 93 | 94 | subscript (numbers index: String) -> [NSNumber]? { 95 | get { 96 | rawStorage[index] as? [NSNumber] 97 | } 98 | set { 99 | rawStorage[index] = newValue 100 | } 101 | } 102 | 103 | subscript (ints index: String) -> [Int]? { 104 | get { 105 | rawStorage[index] as? [Int] 106 | } 107 | set { 108 | rawStorage[index] = newValue 109 | } 110 | } 111 | 112 | subscript (doubles index: String) -> [Double]? { 113 | get { 114 | rawStorage[index] as? [Double] 115 | } 116 | set { 117 | rawStorage[index] = newValue 118 | } 119 | } 120 | 121 | subscript (bool index: String) -> Bool? { 122 | get { 123 | rawStorage[index] as? Bool 124 | } 125 | set { 126 | rawStorage[index] = newValue 127 | } 128 | } 129 | } 130 | 131 | // MARK: - Frequent Fliers 132 | 133 | public extension AppInfo { 134 | var minimumOSVersion: String { 135 | get { 136 | self[string: "MinimumOSVersion"]! 137 | } 138 | set { 139 | self[string: "MinimumOSVersion"] = newValue 140 | } 141 | } 142 | 143 | var bundleName: String { 144 | self[string: "CFBundleName"]! 145 | } 146 | 147 | var displayName: String { 148 | self[string: "CFBundleDisplayName"]! 149 | } 150 | 151 | var bundleIdentifier: String { 152 | self[string: "CFBundleIdentifier"]! 153 | } 154 | 155 | var executableName: String { 156 | self[string: "CFBundleExecutable"]! 157 | } 158 | } 159 | 160 | // MARK: - Patching 161 | 162 | public extension AppInfo { 163 | func assert(minimumVersion: Double) { 164 | if Double(minimumOSVersion)! < 11.0 { 165 | minimumOSVersion = Int(minimumVersion).description 166 | } 167 | } 168 | } 169 | -------------------------------------------------------------------------------- /Sources/CSideloadKit/CSideloadKit.c: -------------------------------------------------------------------------------- 1 | // 2 | // CSideloadKit2.c 3 | // CSideloadKit 4 | // 5 | // Created by Eric Rabil on 11/7/21. 6 | // 7 | // Derived from https://gist.github.com/jhftss/729aea25511439dc34f0fdfa158be9b6 8 | // 9 | 10 | #include "CSideloadKit.h" 11 | 12 | #include 13 | #include 14 | #include 15 | #include 16 | 17 | #include 18 | #include 19 | #include 20 | 21 | #include 22 | #include 23 | 24 | #define READ_MAGIC(data) *(uint32_t*)data 25 | #define IS_FAT(magic) magic == FAT_MAGIC || magic == FAT_CIGAM 26 | #define SHOULD_SWAP_BYTES(magic) magic == MH_CIGAM || magic == MH_CIGAM_64 || magic == FAT_CIGAM 27 | #define PMOV(ptr, offset) (void*)((uintptr_t)ptr + offset) 28 | 29 | static struct { 30 | struct build_version_command cmd; 31 | struct build_tool_version tool_ver; 32 | } LC_SIMULATOR_COMMAND = { LC_BUILD_VERSION, 0x20, 6, 0xA0000, 0xE0500, 1, 3, 0x2610700}; 33 | 34 | static inline void read_macho(void* bytes, struct stat fileStat, cpu_type_t cpu_type, void** extractedMacho, off_t* extractedMachoSize) { 35 | if (IS_FAT(READ_MAGIC(bytes))) { 36 | bool swap = SHOULD_SWAP_BYTES(READ_MAGIC(bytes)); 37 | struct fat_header* header = (struct fat_header*)bytes; 38 | 39 | if (swap) { 40 | swap_fat_header(header, NXHostByteOrder()); 41 | } 42 | 43 | off_t arch_offset = (off_t) sizeof(struct fat_header); 44 | for (int i = 0; i < header->nfat_arch; i++) { 45 | struct fat_arch* arch = (struct fat_arch*)PMOV(bytes, arch_offset); 46 | 47 | if (swap) { 48 | swap_fat_arch(arch, 1, NXHostByteOrder()); 49 | } 50 | 51 | off_t mach_header_offset = (off_t)arch->offset; 52 | arch_offset += sizeof(struct fat_arch); 53 | 54 | if (arch->cputype == cpu_type) { 55 | *extractedMacho = PMOV(bytes, mach_header_offset); 56 | *extractedMachoSize = arch->size; 57 | } 58 | 59 | if (swap) { 60 | swap_fat_arch(arch, 1, NXHostByteOrder()); 61 | } 62 | } 63 | 64 | if (swap) { 65 | swap_fat_header(header, NXHostByteOrder()); 66 | } 67 | } else { 68 | *extractedMacho = bytes; 69 | *extractedMachoSize = fileStat.st_size; 70 | } 71 | } 72 | 73 | #define DIE(message, code) ({ perror(message); exit_code = code; goto end; }) 74 | int convert(const char* machOPath) { 75 | int exit_code = 0; 76 | int fileDescriptor = 0; 77 | struct stat fileStat; 78 | void* base = NULL; 79 | 80 | void* locatedMacho = NULL; 81 | off_t locatedMachoSize = 0; 82 | 83 | fileDescriptor = open(machOPath, O_RDONLY); 84 | if (fileDescriptor < 0) { 85 | DIE("open", 1); 86 | } 87 | 88 | if (fstat(fileDescriptor, &fileStat) < 0) { 89 | DIE("fstat", 2); 90 | } 91 | 92 | base = mmap(NULL, fileStat.st_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fileDescriptor, 0); 93 | if (base == MAP_FAILED) { 94 | DIE("nmap", 3); 95 | } 96 | 97 | read_macho(base, fileStat, CPU_TYPE_ARM64, &locatedMacho, &locatedMachoSize); 98 | if (locatedMacho == NULL) { 99 | DIE("read_macho", 5); 100 | } 101 | 102 | struct mach_header_64 *header = (struct mach_header_64 *)(locatedMacho); 103 | bool swap = SHOULD_SWAP_BYTES(READ_MAGIC(locatedMacho)); 104 | 105 | if (swap) { 106 | swap_mach_header_64(header, NXHostByteOrder()); 107 | } 108 | 109 | off_t load_commands_offset = sizeof(struct mach_header_64); 110 | struct load_command* command = (struct load_command*)(locatedMacho + load_commands_offset); 111 | 112 | uint32_t removedSize = 0, sizeofcmds = 0, numOfRemoved = 0, cmdsize = 0; 113 | bool found_build_version_command = false, removed = false; 114 | 115 | for (int i = 0; i < header->ncmds; i++) { 116 | sizeofcmds += cmdsize; 117 | command = (struct load_command*)(locatedMacho + load_commands_offset); 118 | load_commands_offset += command->cmdsize; 119 | removed = false; 120 | 121 | switch (command->cmd) { 122 | case LC_ENCRYPTION_INFO: 123 | case LC_ENCRYPTION_INFO_64: 124 | case LC_VERSION_MIN_IPHONEOS: 125 | removed = true; // mark the load command as removed 126 | removedSize += command->cmdsize; 127 | numOfRemoved += 1; 128 | printf("remove load command[0x%x] at offset:0x%llx\n", command->cmd, (mach_vm_address_t)command-(mach_vm_address_t)header); 129 | break; 130 | case LC_BUILD_VERSION: 131 | memcpy(command, &LC_SIMULATOR_COMMAND, sizeof(LC_SIMULATOR_COMMAND)); 132 | found_build_version_command = true; 133 | printf("patch build version command at offset:0x%llx\n", (mach_vm_address_t)command-(mach_vm_address_t)header); 134 | break; 135 | } 136 | 137 | cmdsize = command->cmdsize; // maybe overwrite, backup cmdsize 138 | if (removedSize && !removed) { // move forward with removedSize bytes. 139 | memcpy((char *)command-removedSize, command, cmdsize); 140 | } 141 | } 142 | 143 | if (!found_build_version_command) { // not found, then insert one 144 | memcpy((char *)command-removedSize, &LC_SIMULATOR_COMMAND, sizeof(LC_SIMULATOR_COMMAND)); 145 | removedSize -= sizeof(LC_SIMULATOR_COMMAND); 146 | numOfRemoved -= 1; 147 | } 148 | 149 | header->ncmds -= numOfRemoved; 150 | header->sizeofcmds -= removedSize; 151 | 152 | if (swap) { 153 | swap_mach_header_64(header, NXHostByteOrder()); 154 | } 155 | 156 | end: 157 | if (base) 158 | munmap(base, fileStat.st_size); 159 | if (fileDescriptor) 160 | close(fileDescriptor); 161 | 162 | return exit_code; 163 | } 164 | -------------------------------------------------------------------------------- /Sources/SideloadKit/Classes/App.swift: -------------------------------------------------------------------------------- 1 | // 2 | // App.swift 3 | // SideloadKit 4 | // 5 | // Created by Eric Rabil on 11/6/21. 6 | // 7 | 8 | import Foundation 9 | import Darwin.sys 10 | import CSideloadKit 11 | 12 | /// Represents an iOS-formatted .app bundle on the filesystem 13 | public class App { 14 | enum AppError: Error { 15 | case noCandidatesDetected 16 | } 17 | 18 | public let url: URL 19 | 20 | /// The entitlements for this app. Call readEntitlements to ensure you get a non-nil value. 21 | public private(set) var entitlements: Entitlements? 22 | 23 | /// Info.plist -- call readInfo to ensure you get a non-nil value 24 | public private(set) var info: AppInfo? 25 | 26 | /// All mach-o binaries within the app, including the executable itself. Call resolveValidMachOs to ensure a non-nil value. 27 | public private(set) var validMachOs: [URL]? 28 | 29 | /// Whether this app was created by unzipping from an IPA 30 | public var isTemporary: Bool { 31 | url.path.starts(with: SideloadIO.tempDirectory.path) 32 | } 33 | 34 | public init(url: URL) { 35 | self.url = url 36 | } 37 | 38 | /// Scans a folder for an app, and uses the first match. Throws if theres no apps in the folder. 39 | internal init(detectingAppNameInFolder folderURL: URL) throws { 40 | let contents = try FileManager.default.contentsOfDirectory(atPath: folderURL.path) 41 | 42 | var url: URL? 43 | 44 | for entry in contents { 45 | guard entry.hasSuffix(".app") else { 46 | continue 47 | } 48 | 49 | let entryURL = folderURL.appendingPathComponent(entry) 50 | var isDirectory: ObjCBool = false 51 | 52 | guard FileManager.default.fileExists(atPath: entryURL.path, isDirectory: &isDirectory), isDirectory.boolValue else { 53 | continue 54 | } 55 | 56 | url = entryURL 57 | break 58 | } 59 | 60 | guard let url = url else { 61 | throw AppError.noCandidatesDetected 62 | } 63 | 64 | self.url = url 65 | } 66 | 67 | /// Reads the entitlements from the app, or returns a cached value if it was already read. 68 | public func readEntitlements() throws -> Entitlements { 69 | if let entitlements = entitlements { 70 | return entitlements 71 | } 72 | 73 | let entitlements = (try? Entitlements.read(fromURL: url)) ?? Entitlements(rawStorage: [:]) 74 | self.entitlements = entitlements 75 | 76 | return entitlements 77 | } 78 | 79 | /// Reads the Info.plist from within the app, or returns a cached value if it was already read. 80 | public func readInfo() throws -> AppInfo { 81 | if let info = info { 82 | return info 83 | } 84 | 85 | let info = try AppInfo(contentsOf: url.appendingPathComponent("Info.plist")) 86 | self.info = info 87 | 88 | return info 89 | } 90 | } 91 | 92 | // MARK: - Mach-O 93 | 94 | private extension URL { 95 | // Wraps NSFileEnumerator since the geniuses at corelibs-foundation decided it should be completely untyped 96 | func enumerateContents(_ callback: (URL, URLResourceValues) throws -> ()) throws { 97 | guard let enumerator = FileManager.default.enumerator(at: self, includingPropertiesForKeys: [.isRegularFileKey], options: [.skipsHiddenFiles, .skipsPackageDescendants]) else { 98 | return 99 | } 100 | 101 | for case let fileURL as URL in enumerator { 102 | do { 103 | try callback(fileURL, fileURL.resourceValues(forKeys: [.isRegularFileKey, .fileSizeKey])) 104 | } 105 | } 106 | } 107 | } 108 | 109 | // You know, it'd be cool if Swift supported associated values. Unfortunately, fuck you. 110 | 111 | public extension App { 112 | /// Returns an array of URLs to MachO files within the app 113 | func resolveValidMachOs() throws -> [URL] { 114 | if let validMachOs = validMachOs { 115 | return validMachOs 116 | } 117 | 118 | var resolved: [URL] = [] 119 | 120 | try url.enumerateContents { url, attributes in 121 | guard attributes.isRegularFile == true, let fileSize = attributes.fileSize, fileSize > 4 else { 122 | return 123 | } 124 | 125 | if !url.pathExtension.isEmpty && url.pathExtension != "dylib" { 126 | return 127 | } 128 | 129 | let handle = try FileHandle(forReadingFrom: url) 130 | 131 | defer { 132 | try! handle.close() 133 | } 134 | 135 | guard let data = try handle.read(upToCount: 4) else { 136 | return 137 | } 138 | 139 | switch Array(data) { 140 | case [202, 254, 186, 190]: resolved.append(url) 141 | case [207, 250, 237, 254]: resolved.append(url) 142 | default: return 143 | } 144 | } 145 | 146 | validMachOs = resolved 147 | 148 | return resolved 149 | } 150 | } 151 | 152 | // MARK: - Compatibility overrides 153 | 154 | public extension App { 155 | func overwriteVTool(atURL url: URL) throws { 156 | _ = try shell( 157 | "/usr/bin/vtool", 158 | "-arch", "arm64", 159 | "-set-build-version", "maccatalyst", "10.0", "14.5", 160 | "-replace", "-output", 161 | url.path, url.path 162 | ) 163 | } 164 | 165 | /// Callout to C, because Swift's philosophy is that anything non-trivial should be verbose and ugly 166 | func masqueradeToSimulator(atURL url: URL) throws -> Bool { 167 | convert(url.path) == 0 168 | } 169 | 170 | /// Calls out to otool and scans for an encryption segment with cryptid 1 171 | func isMachoEncrypted(atURL url: URL) throws -> Bool { 172 | try shell( 173 | "/usr/bin/otool", 174 | "-l", url.path 175 | ).split(separator: "\n") 176 | .first(where: { $0.contains("LC_ENCRYPTION_INFO -A5") })?.contains("cryptid 1") ?? false 177 | } 178 | 179 | /// Equivalent to chmod -- setBinaryPosixPermissions(0o777) 180 | func setBinaryPosixPermissions(_ permissions: Int) throws { 181 | let info = try readInfo() 182 | 183 | let executablePath = url.appendingPathComponent(info.executableName) 184 | 185 | try FileManager.default.setAttributes([ 186 | .posixPermissions: permissions 187 | ], ofItemAtPath: executablePath.path) 188 | } 189 | } 190 | 191 | // MARK: - Signature 192 | 193 | public extension App { 194 | /// Wrapper for codesign, applies the given entitlements to the application and all of its contents 195 | func resign(withEntitlements entitlements: Entitlements) throws { 196 | let directory = try SideloadIO.allocateTempDirectory() 197 | defer { 198 | try! FileManager.default.removeItem(at: directory) 199 | } 200 | 201 | let entURL = directory.appendingPathComponent("entitlements.plist") 202 | let encoder = PropertyListEncoder() 203 | encoder.outputFormat = .xml 204 | 205 | try encoder.encode(entitlements).write(to: entURL) 206 | 207 | print(try shell("/usr/bin/codesign", "-fs-", url.path, "--deep", "--entitlements", entURL.path)) 208 | } 209 | } 210 | 211 | // MARK: - Wrapping 212 | 213 | public extension App { 214 | /// Generates a wrapper bundle for an iOS app that allows it to be launched from Finder and other macOS UIs 215 | func wrap(toLocation location: URL) throws { 216 | if FileManager.default.fileExists(atPath: location.path) { 217 | try FileManager.default.removeItem(at: location) 218 | } 219 | 220 | let wrapperURL = location.appendingPathComponent("Wrapper") 221 | let appDestination = wrapperURL.appendingPathComponent(url.lastPathComponent) 222 | 223 | try FileManager.default.createDirectory(at: location, withIntermediateDirectories: true, attributes: nil) 224 | try FileManager.default.createDirectory(at: wrapperURL, withIntermediateDirectories: true, attributes: nil) 225 | try FileManager.default.copyItem(at: url, to: appDestination) 226 | try FileManager.default.createSymbolicLink(atPath: location.appendingPathComponent("WrappedBundle").path, withDestinationPath: "Wrapper/".appending(url.lastPathComponent)) 227 | } 228 | } 229 | 230 | public extension App { 231 | /// Regular codesign, does not accept entitlements. Used to re-seal an app after you've modified it. 232 | func fakesign(_ url: URL) throws { 233 | _ = try shell("/usr/bin/codesign", "-fs-", url.path) 234 | } 235 | } 236 | -------------------------------------------------------------------------------- /m1-ios-sideloader.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 51; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 2C0FA9F30203DB8607D4088B /* IPA.swift in Sources */ = {isa = PBXBuildFile; fileRef = A6BF4A1F99022A3F1EEC0DBC /* IPA.swift */; }; 11 | 2EEAC32B7BF4E053F335350B /* Entitlements.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30DE7D3228B7E1C1EABB8131 /* Entitlements.swift */; }; 12 | 3052E1238454EF523545717D /* CSideloadKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = B53DD797D3DC54E3D644DE8D /* CSideloadKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 13 | 53322369CAF5F7240EDD3FE8 /* SwiftCLI in Frameworks */ = {isa = PBXBuildFile; productRef = 50EB45562C1361CCDE3495C6 /* SwiftCLI */; }; 14 | 53E91C57CA72B6F797930C90 /* SideloadKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F2965D7D2A3404BF89F922DF /* SideloadKit.framework */; }; 15 | 571DA9E26DF8900BA7CDC432 /* Bom.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F869B50CEDBFDB9A6523848 /* Bom.swift */; }; 16 | 57B2032A4F667D5453F8E5A6 /* CSideloadKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B53DD797D3DC54E3D644DE8D /* CSideloadKit.framework */; }; 17 | 650815F8AF7FC3CC48B8A48F /* App.swift in Sources */ = {isa = PBXBuildFile; fileRef = 126F2543AE5D51FC805E0B5D /* App.swift */; }; 18 | 6CBE0B23C99BAC9D5815BB67 /* AppInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = B01A3D3E8C96BEB4D4770ED7 /* AppInfo.swift */; }; 19 | 6D28D31FC2E6068C526FAD27 /* Shell.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA01091BEDCBB99385E19CFA /* Shell.swift */; }; 20 | 8E9B41A53CDAD8CEE9D87608 /* Entitlement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 563CB5FF1A4233D09ED03240 /* Entitlement.swift */; }; 21 | 93E4D90B237D4BE3CD8AFF3A /* SideloadKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = F2965D7D2A3404BF89F922DF /* SideloadKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 22 | BCF6D5C94DFB34FD68AA3AE9 /* CSideloadKit.c in Sources */ = {isa = PBXBuildFile; fileRef = CBB6EFE333B4212797B29FCB /* CSideloadKit.c */; }; 23 | BE494FFE9C0DA970A673BF87 /* CSideloadKit.h in Headers */ = {isa = PBXBuildFile; fileRef = C8485E86F495FED7D2C6C4DA /* CSideloadKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; 24 | C6956E08E550983AEBC0FC98 /* ent.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1AFA32977219C77A0E93D878 /* ent.plist */; }; 25 | CC95925D199BA29125471D53 /* ObjectiveC.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBF310ABCCDAA1D816D884DC /* ObjectiveC.swift */; }; 26 | D0A04B2A15E04A0E9397DF78 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = E78C0039EBFABBE3075D34B8 /* main.swift */; }; 27 | D1769F8D6D6ADDA3910E4CB8 /* SideloadKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = EF8DF60FFE8A698582B2095C /* SideloadKit.swift */; }; 28 | E0A9A7965DB0FD7765CB5091 /* SideloadIO.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC16ECEF5BB45E3023D173FD /* SideloadIO.swift */; }; 29 | E363ECF9657199D99B976010 /* CSideloadKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B53DD797D3DC54E3D644DE8D /* CSideloadKit.framework */; }; 30 | /* End PBXBuildFile section */ 31 | 32 | /* Begin PBXContainerItemProxy section */ 33 | 2086394166B7B49C3A95239C /* PBXContainerItemProxy */ = { 34 | isa = PBXContainerItemProxy; 35 | containerPortal = 6C9947B027166187A9142B2C /* Project object */; 36 | proxyType = 1; 37 | remoteGlobalIDString = 0A867F57EA6371137FD4D0A9; 38 | remoteInfo = CSideloadKit; 39 | }; 40 | 2F4D887B4AAD32EA2832A638 /* PBXContainerItemProxy */ = { 41 | isa = PBXContainerItemProxy; 42 | containerPortal = 6C9947B027166187A9142B2C /* Project object */; 43 | proxyType = 1; 44 | remoteGlobalIDString = 0A867F57EA6371137FD4D0A9; 45 | remoteInfo = CSideloadKit; 46 | }; 47 | 39924BB64B4A013C7B35AD64 /* PBXContainerItemProxy */ = { 48 | isa = PBXContainerItemProxy; 49 | containerPortal = 6C9947B027166187A9142B2C /* Project object */; 50 | proxyType = 1; 51 | remoteGlobalIDString = CE529ABF6999D344124F2A29; 52 | remoteInfo = SideloadKit; 53 | }; 54 | /* End PBXContainerItemProxy section */ 55 | 56 | /* Begin PBXCopyFilesBuildPhase section */ 57 | F50AF63AA8410CE9F81D6008 /* Embed Frameworks */ = { 58 | isa = PBXCopyFilesBuildPhase; 59 | buildActionMask = 2147483647; 60 | dstPath = ""; 61 | dstSubfolderSpec = 10; 62 | files = ( 63 | 93E4D90B237D4BE3CD8AFF3A /* SideloadKit.framework in Embed Frameworks */, 64 | 3052E1238454EF523545717D /* CSideloadKit.framework in Embed Frameworks */, 65 | ); 66 | name = "Embed Frameworks"; 67 | runOnlyForDeploymentPostprocessing = 0; 68 | }; 69 | /* End PBXCopyFilesBuildPhase section */ 70 | 71 | /* Begin PBXFileReference section */ 72 | 126F2543AE5D51FC805E0B5D /* App.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = App.swift; sourceTree = ""; }; 73 | 1AFA32977219C77A0E93D878 /* ent.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = ent.plist; sourceTree = ""; }; 74 | 30DE7D3228B7E1C1EABB8131 /* Entitlements.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Entitlements.swift; sourceTree = ""; }; 75 | 3B44ADC3B570B96F21C0BF1E /* project.yml */ = {isa = PBXFileReference; lastKnownFileType = text.yaml; path = project.yml; sourceTree = ""; }; 76 | 3F869B50CEDBFDB9A6523848 /* Bom.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Bom.swift; sourceTree = ""; }; 77 | 563CB5FF1A4233D09ED03240 /* Entitlement.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Entitlement.swift; sourceTree = ""; }; 78 | 59A7A98CC828707EAF6453DB /* LICENSE */ = {isa = PBXFileReference; path = LICENSE; sourceTree = ""; }; 79 | 6E809061EE7F8D03A9C1F98D /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 80 | 9883A5B97AFFF9576A56159B /* install-ios-app.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "install-ios-app.h"; sourceTree = ""; }; 81 | A6BF4A1F99022A3F1EEC0DBC /* IPA.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IPA.swift; sourceTree = ""; }; 82 | B01A3D3E8C96BEB4D4770ED7 /* AppInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppInfo.swift; sourceTree = ""; }; 83 | B53DD797D3DC54E3D644DE8D /* CSideloadKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CSideloadKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 84 | BBF310ABCCDAA1D816D884DC /* ObjectiveC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ObjectiveC.swift; sourceTree = ""; }; 85 | C8485E86F495FED7D2C6C4DA /* CSideloadKit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CSideloadKit.h; sourceTree = ""; }; 86 | CBB6EFE333B4212797B29FCB /* CSideloadKit.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = CSideloadKit.c; sourceTree = ""; }; 87 | D7E182B8895F15700630F5CA /* install-ios-app */ = {isa = PBXFileReference; includeInIndex = 0; path = "install-ios-app"; sourceTree = BUILT_PRODUCTS_DIR; }; 88 | E78C0039EBFABBE3075D34B8 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; }; 89 | EF8DF60FFE8A698582B2095C /* SideloadKit.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SideloadKit.swift; sourceTree = ""; }; 90 | F2965D7D2A3404BF89F922DF /* SideloadKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SideloadKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 91 | FA01091BEDCBB99385E19CFA /* Shell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Shell.swift; sourceTree = ""; }; 92 | FC16ECEF5BB45E3023D173FD /* SideloadIO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SideloadIO.swift; sourceTree = ""; }; 93 | /* End PBXFileReference section */ 94 | 95 | /* Begin PBXFrameworksBuildPhase section */ 96 | 9F5F7A1EEE9FEC02AEF83748 /* Frameworks */ = { 97 | isa = PBXFrameworksBuildPhase; 98 | buildActionMask = 2147483647; 99 | files = ( 100 | 57B2032A4F667D5453F8E5A6 /* CSideloadKit.framework in Frameworks */, 101 | ); 102 | runOnlyForDeploymentPostprocessing = 0; 103 | }; 104 | D77A361336208648EBAA907F /* Frameworks */ = { 105 | isa = PBXFrameworksBuildPhase; 106 | buildActionMask = 2147483647; 107 | files = ( 108 | 53E91C57CA72B6F797930C90 /* SideloadKit.framework in Frameworks */, 109 | E363ECF9657199D99B976010 /* CSideloadKit.framework in Frameworks */, 110 | 53322369CAF5F7240EDD3FE8 /* SwiftCLI in Frameworks */, 111 | ); 112 | runOnlyForDeploymentPostprocessing = 0; 113 | }; 114 | /* End PBXFrameworksBuildPhase section */ 115 | 116 | /* Begin PBXGroup section */ 117 | 01D0C51872A5043F9D0B98A5 /* Structs */ = { 118 | isa = PBXGroup; 119 | children = ( 120 | 563CB5FF1A4233D09ED03240 /* Entitlement.swift */, 121 | 30DE7D3228B7E1C1EABB8131 /* Entitlements.swift */, 122 | ); 123 | path = Structs; 124 | sourceTree = ""; 125 | }; 126 | 14370FE11F09939C669CF1F4 /* SideloadKit */ = { 127 | isa = PBXGroup; 128 | children = ( 129 | EF8DF60FFE8A698582B2095C /* SideloadKit.swift */, 130 | 761CF345A7845532C4053EBA /* Classes */, 131 | 01D0C51872A5043F9D0B98A5 /* Structs */, 132 | D24BE4E89A8F062CB060468D /* Utilities */, 133 | ); 134 | path = SideloadKit; 135 | sourceTree = ""; 136 | }; 137 | 1DEC82D25C5688EC03E57624 /* CSideloadKit */ = { 138 | isa = PBXGroup; 139 | children = ( 140 | CBB6EFE333B4212797B29FCB /* CSideloadKit.c */, 141 | C8485E86F495FED7D2C6C4DA /* CSideloadKit.h */, 142 | ); 143 | path = CSideloadKit; 144 | sourceTree = ""; 145 | }; 146 | 761CF345A7845532C4053EBA /* Classes */ = { 147 | isa = PBXGroup; 148 | children = ( 149 | 126F2543AE5D51FC805E0B5D /* App.swift */, 150 | B01A3D3E8C96BEB4D4770ED7 /* AppInfo.swift */, 151 | A6BF4A1F99022A3F1EEC0DBC /* IPA.swift */, 152 | ); 153 | path = Classes; 154 | sourceTree = ""; 155 | }; 156 | 791DE75457993487A188CF15 /* Products */ = { 157 | isa = PBXGroup; 158 | children = ( 159 | B53DD797D3DC54E3D644DE8D /* CSideloadKit.framework */, 160 | D7E182B8895F15700630F5CA /* install-ios-app */, 161 | F2965D7D2A3404BF89F922DF /* SideloadKit.framework */, 162 | ); 163 | name = Products; 164 | sourceTree = ""; 165 | }; 166 | 7BAEB6AEDEBEF0B7819153A4 /* Sources */ = { 167 | isa = PBXGroup; 168 | children = ( 169 | 1DEC82D25C5688EC03E57624 /* CSideloadKit */, 170 | B1AB9E51A5CC4F1CF1E71B7E /* install-ios-app */, 171 | 14370FE11F09939C669CF1F4 /* SideloadKit */, 172 | ); 173 | path = Sources; 174 | sourceTree = ""; 175 | }; 176 | B1AB9E51A5CC4F1CF1E71B7E /* install-ios-app */ = { 177 | isa = PBXGroup; 178 | children = ( 179 | 1AFA32977219C77A0E93D878 /* ent.plist */, 180 | 9883A5B97AFFF9576A56159B /* install-ios-app.h */, 181 | E78C0039EBFABBE3075D34B8 /* main.swift */, 182 | ); 183 | path = "install-ios-app"; 184 | sourceTree = ""; 185 | }; 186 | D24BE4E89A8F062CB060468D /* Utilities */ = { 187 | isa = PBXGroup; 188 | children = ( 189 | 3F869B50CEDBFDB9A6523848 /* Bom.swift */, 190 | BBF310ABCCDAA1D816D884DC /* ObjectiveC.swift */, 191 | FA01091BEDCBB99385E19CFA /* Shell.swift */, 192 | FC16ECEF5BB45E3023D173FD /* SideloadIO.swift */, 193 | ); 194 | path = Utilities; 195 | sourceTree = ""; 196 | }; 197 | E5B13164D3288873AE762FE9 = { 198 | isa = PBXGroup; 199 | children = ( 200 | 59A7A98CC828707EAF6453DB /* LICENSE */, 201 | 3B44ADC3B570B96F21C0BF1E /* project.yml */, 202 | 6E809061EE7F8D03A9C1F98D /* README.md */, 203 | 7BAEB6AEDEBEF0B7819153A4 /* Sources */, 204 | 791DE75457993487A188CF15 /* Products */, 205 | ); 206 | sourceTree = ""; 207 | }; 208 | /* End PBXGroup section */ 209 | 210 | /* Begin PBXHeadersBuildPhase section */ 211 | 8C9CD9787F3FEC22A07F85E0 /* Headers */ = { 212 | isa = PBXHeadersBuildPhase; 213 | buildActionMask = 2147483647; 214 | files = ( 215 | BE494FFE9C0DA970A673BF87 /* CSideloadKit.h in Headers */, 216 | ); 217 | runOnlyForDeploymentPostprocessing = 0; 218 | }; 219 | /* End PBXHeadersBuildPhase section */ 220 | 221 | /* Begin PBXNativeTarget section */ 222 | 0A867F57EA6371137FD4D0A9 /* CSideloadKit */ = { 223 | isa = PBXNativeTarget; 224 | buildConfigurationList = B5C2CB189CA6332C0C4A70F6 /* Build configuration list for PBXNativeTarget "CSideloadKit" */; 225 | buildPhases = ( 226 | 8C9CD9787F3FEC22A07F85E0 /* Headers */, 227 | 174C81DB94821BE98E2241A1 /* Sources */, 228 | ); 229 | buildRules = ( 230 | ); 231 | dependencies = ( 232 | ); 233 | name = CSideloadKit; 234 | productName = CSideloadKit; 235 | productReference = B53DD797D3DC54E3D644DE8D /* CSideloadKit.framework */; 236 | productType = "com.apple.product-type.framework"; 237 | }; 238 | CE529ABF6999D344124F2A29 /* SideloadKit */ = { 239 | isa = PBXNativeTarget; 240 | buildConfigurationList = 041CBC3FF04136DC0C2F7DCB /* Build configuration list for PBXNativeTarget "SideloadKit" */; 241 | buildPhases = ( 242 | D6803417CB78CA5C73571357 /* Sources */, 243 | 9F5F7A1EEE9FEC02AEF83748 /* Frameworks */, 244 | ); 245 | buildRules = ( 246 | ); 247 | dependencies = ( 248 | EEDA1EFACB7410F66951C866 /* PBXTargetDependency */, 249 | ); 250 | name = SideloadKit; 251 | productName = SideloadKit; 252 | productReference = F2965D7D2A3404BF89F922DF /* SideloadKit.framework */; 253 | productType = "com.apple.product-type.framework"; 254 | }; 255 | E72EB33F819840B98BFABC1D /* install-ios-app */ = { 256 | isa = PBXNativeTarget; 257 | buildConfigurationList = 0C1111094332B5D855EC3470 /* Build configuration list for PBXNativeTarget "install-ios-app" */; 258 | buildPhases = ( 259 | E61988C778436FC737E165B8 /* Sources */, 260 | D24FC8318D9F6F4D1012160F /* Resources */, 261 | D77A361336208648EBAA907F /* Frameworks */, 262 | F50AF63AA8410CE9F81D6008 /* Embed Frameworks */, 263 | ); 264 | buildRules = ( 265 | ); 266 | dependencies = ( 267 | F9A9F7A0A80534470174411F /* PBXTargetDependency */, 268 | 97841CAF6E43F051D1ECDA9B /* PBXTargetDependency */, 269 | ); 270 | name = "install-ios-app"; 271 | packageProductDependencies = ( 272 | 50EB45562C1361CCDE3495C6 /* SwiftCLI */, 273 | ); 274 | productName = "install-ios-app"; 275 | productReference = D7E182B8895F15700630F5CA /* install-ios-app */; 276 | productType = "com.apple.product-type.tool"; 277 | }; 278 | /* End PBXNativeTarget section */ 279 | 280 | /* Begin PBXProject section */ 281 | 6C9947B027166187A9142B2C /* Project object */ = { 282 | isa = PBXProject; 283 | attributes = { 284 | LastUpgradeCheck = 1200; 285 | TargetAttributes = { 286 | }; 287 | }; 288 | buildConfigurationList = 209D758B33182705E5BB89C7 /* Build configuration list for PBXProject "m1-ios-sideloader" */; 289 | compatibilityVersion = "Xcode 10.0"; 290 | developmentRegion = en; 291 | hasScannedForEncodings = 0; 292 | knownRegions = ( 293 | Base, 294 | en, 295 | ); 296 | mainGroup = E5B13164D3288873AE762FE9; 297 | packageReferences = ( 298 | 2A67603AF600FC2E9A28083B /* XCRemoteSwiftPackageReference "SwiftCLI" */, 299 | ); 300 | projectDirPath = ""; 301 | projectRoot = ""; 302 | targets = ( 303 | 0A867F57EA6371137FD4D0A9 /* CSideloadKit */, 304 | CE529ABF6999D344124F2A29 /* SideloadKit */, 305 | E72EB33F819840B98BFABC1D /* install-ios-app */, 306 | ); 307 | }; 308 | /* End PBXProject section */ 309 | 310 | /* Begin PBXResourcesBuildPhase section */ 311 | D24FC8318D9F6F4D1012160F /* Resources */ = { 312 | isa = PBXResourcesBuildPhase; 313 | buildActionMask = 2147483647; 314 | files = ( 315 | C6956E08E550983AEBC0FC98 /* ent.plist in Resources */, 316 | ); 317 | runOnlyForDeploymentPostprocessing = 0; 318 | }; 319 | /* End PBXResourcesBuildPhase section */ 320 | 321 | /* Begin PBXSourcesBuildPhase section */ 322 | 174C81DB94821BE98E2241A1 /* Sources */ = { 323 | isa = PBXSourcesBuildPhase; 324 | buildActionMask = 2147483647; 325 | files = ( 326 | BCF6D5C94DFB34FD68AA3AE9 /* CSideloadKit.c in Sources */, 327 | ); 328 | runOnlyForDeploymentPostprocessing = 0; 329 | }; 330 | D6803417CB78CA5C73571357 /* Sources */ = { 331 | isa = PBXSourcesBuildPhase; 332 | buildActionMask = 2147483647; 333 | files = ( 334 | 650815F8AF7FC3CC48B8A48F /* App.swift in Sources */, 335 | 6CBE0B23C99BAC9D5815BB67 /* AppInfo.swift in Sources */, 336 | 571DA9E26DF8900BA7CDC432 /* Bom.swift in Sources */, 337 | 8E9B41A53CDAD8CEE9D87608 /* Entitlement.swift in Sources */, 338 | 2EEAC32B7BF4E053F335350B /* Entitlements.swift in Sources */, 339 | 2C0FA9F30203DB8607D4088B /* IPA.swift in Sources */, 340 | CC95925D199BA29125471D53 /* ObjectiveC.swift in Sources */, 341 | 6D28D31FC2E6068C526FAD27 /* Shell.swift in Sources */, 342 | E0A9A7965DB0FD7765CB5091 /* SideloadIO.swift in Sources */, 343 | D1769F8D6D6ADDA3910E4CB8 /* SideloadKit.swift in Sources */, 344 | ); 345 | runOnlyForDeploymentPostprocessing = 0; 346 | }; 347 | E61988C778436FC737E165B8 /* Sources */ = { 348 | isa = PBXSourcesBuildPhase; 349 | buildActionMask = 2147483647; 350 | files = ( 351 | D0A04B2A15E04A0E9397DF78 /* main.swift in Sources */, 352 | ); 353 | runOnlyForDeploymentPostprocessing = 0; 354 | }; 355 | /* End PBXSourcesBuildPhase section */ 356 | 357 | /* Begin PBXTargetDependency section */ 358 | 97841CAF6E43F051D1ECDA9B /* PBXTargetDependency */ = { 359 | isa = PBXTargetDependency; 360 | target = 0A867F57EA6371137FD4D0A9 /* CSideloadKit */; 361 | targetProxy = 2086394166B7B49C3A95239C /* PBXContainerItemProxy */; 362 | }; 363 | EEDA1EFACB7410F66951C866 /* PBXTargetDependency */ = { 364 | isa = PBXTargetDependency; 365 | target = 0A867F57EA6371137FD4D0A9 /* CSideloadKit */; 366 | targetProxy = 2F4D887B4AAD32EA2832A638 /* PBXContainerItemProxy */; 367 | }; 368 | F9A9F7A0A80534470174411F /* PBXTargetDependency */ = { 369 | isa = PBXTargetDependency; 370 | target = CE529ABF6999D344124F2A29 /* SideloadKit */; 371 | targetProxy = 39924BB64B4A013C7B35AD64 /* PBXContainerItemProxy */; 372 | }; 373 | /* End PBXTargetDependency section */ 374 | 375 | /* Begin XCBuildConfiguration section */ 376 | 1334BBC123379E13DDA71DF2 /* Release */ = { 377 | isa = XCBuildConfiguration; 378 | buildSettings = { 379 | AD_HOC_CODE_SIGNING_ALLOWED = YES; 380 | ALWAYS_SEARCH_USER_PATHS = NO; 381 | ARCHS = ( 382 | arm64, 383 | ); 384 | CLANG_ANALYZER_NONNULL = YES; 385 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 386 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 387 | CLANG_CXX_LIBRARY = "libc++"; 388 | CLANG_ENABLE_MODULES = YES; 389 | CLANG_ENABLE_OBJC_ARC = YES; 390 | CLANG_ENABLE_OBJC_WEAK = YES; 391 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 392 | CLANG_WARN_BOOL_CONVERSION = YES; 393 | CLANG_WARN_COMMA = YES; 394 | CLANG_WARN_CONSTANT_CONVERSION = YES; 395 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 396 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 397 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 398 | CLANG_WARN_EMPTY_BODY = YES; 399 | CLANG_WARN_ENUM_CONVERSION = YES; 400 | CLANG_WARN_INFINITE_RECURSION = YES; 401 | CLANG_WARN_INT_CONVERSION = YES; 402 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 403 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 404 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 405 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 406 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO; 407 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 408 | CLANG_WARN_STRICT_PROTOTYPES = YES; 409 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 410 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 411 | CLANG_WARN_UNREACHABLE_CODE = YES; 412 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 413 | CODE_SIGNING_ALLOWED = YES; 414 | CODE_SIGN_IDENTITY = "-"; 415 | COPY_PHASE_STRIP = NO; 416 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 417 | ENABLE_HARDENED_RUNTIME = NO; 418 | ENABLE_NS_ASSERTIONS = NO; 419 | ENABLE_STRICT_OBJC_MSGSEND = YES; 420 | FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/Frameworks"; 421 | GCC_C_LANGUAGE_STANDARD = gnu11; 422 | GCC_NO_COMMON_BLOCKS = YES; 423 | GCC_OPTIMIZATION_LEVEL = 3; 424 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 425 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 426 | GCC_WARN_UNDECLARED_SELECTOR = YES; 427 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 428 | GCC_WARN_UNUSED_FUNCTION = YES; 429 | GCC_WARN_UNUSED_VARIABLE = YES; 430 | LD_RUNPATH_SEARCH_PATHS = ( 431 | "$(inherited)", 432 | "@executable_path/../Frameworks", 433 | "@loader_path/Frameworks", 434 | ); 435 | MACOSX_DEPLOYMENT_TARGET = 12.0; 436 | MTL_ENABLE_DEBUG_INFO = NO; 437 | MTL_FAST_MATH = YES; 438 | OTHER_SWIFT_FLAGS = "-Xcc -Wno-nullability-completeness -Xcc -Wno-incomplete-umbrella -Xcc -Wno-property-attribute-mismatch -Xcc -Wno-strict-prototypes -Xcc -Wno-arc-performSelector-leaks -Xcc -Wno-objc-protocol-method-implementation -Xcc -Wno-incomplete-umbrella -Xcc -Wno-visibility"; 439 | PRODUCT_NAME = "$(TARGET_NAME)"; 440 | SDKROOT = ""; 441 | SKIP_INSTALL = YES; 442 | SUPPORTED_PLATFORMS = macosx; 443 | SWIFT_COMPILATION_MODE = wholemodule; 444 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 445 | SWIFT_VERSION = 5.5; 446 | SYSTEM_FRAMEWORK_SEARCH_PATHS = ( 447 | "$(inherited)", 448 | "$(SDKROOT)$(SYSTEM_LIBRARY_DIR)/PrivateFrameworks", 449 | ); 450 | VALID_ARCHS = arm64; 451 | WARNING_CFLAGS = ( 452 | "-Wno-nullability-completeness", 453 | "-Wno-incomplete-umbrella", 454 | "-Wno-objc-protocol-method-implementation", 455 | "-Wno-arc-performSelector-leaks", 456 | "-Wno-strict-prototypes", 457 | "-Wno-property-attribute-mismatch", 458 | "-Wno-visibility", 459 | ); 460 | }; 461 | name = Release; 462 | }; 463 | 165912EBF747EDF965DCBD03 /* Debug */ = { 464 | isa = XCBuildConfiguration; 465 | buildSettings = { 466 | CODE_SIGN_IDENTITY = ""; 467 | COMBINE_HIDPI_IMAGES = YES; 468 | CURRENT_PROJECT_VERSION = 1; 469 | DEFINES_MODULE = YES; 470 | DYLIB_COMPATIBILITY_VERSION = 1; 471 | DYLIB_CURRENT_VERSION = 1; 472 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 473 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 474 | LD_RUNPATH_SEARCH_PATHS = ( 475 | "$(inherited)", 476 | "@executable_path/../Frameworks", 477 | ); 478 | MACH_O_TYPE = staticlib; 479 | PRODUCT_BUNDLE_IDENTIFIER = com.ericrabil.CSideloadKit; 480 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 481 | SDKROOT = macosx; 482 | SKIP_INSTALL = YES; 483 | VERSIONING_SYSTEM = "apple-generic"; 484 | }; 485 | name = Debug; 486 | }; 487 | 397FE2907379F7D235BE4248 /* Debug */ = { 488 | isa = XCBuildConfiguration; 489 | buildSettings = { 490 | CODE_SIGN_ENTITLEMENTS = "Sources/install-ios-app/ent.plist"; 491 | CODE_SIGN_IDENTITY = "-"; 492 | COMBINE_HIDPI_IMAGES = YES; 493 | LD_RUNPATH_SEARCH_PATHS = ( 494 | "$(inherited)", 495 | "@executable_path/../Frameworks", 496 | ); 497 | PRODUCT_BUNDLE_IDENTIFIER = "com.ericrabil.install-ios-app"; 498 | SDKROOT = macosx; 499 | SWIFT_OBJC_BRIDGING_HEADER = "Sources/install-ios-app/install-ios-app.h"; 500 | }; 501 | name = Debug; 502 | }; 503 | 5CF1038BF3B2A5FA152289C3 /* Release */ = { 504 | isa = XCBuildConfiguration; 505 | buildSettings = { 506 | CODE_SIGN_IDENTITY = ""; 507 | COMBINE_HIDPI_IMAGES = YES; 508 | CURRENT_PROJECT_VERSION = 1; 509 | DEFINES_MODULE = YES; 510 | DYLIB_COMPATIBILITY_VERSION = 1; 511 | DYLIB_CURRENT_VERSION = 1; 512 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 513 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 514 | LD_RUNPATH_SEARCH_PATHS = ( 515 | "$(inherited)", 516 | "@executable_path/../Frameworks", 517 | ); 518 | MACH_O_TYPE = staticlib; 519 | PRODUCT_BUNDLE_IDENTIFIER = com.ericrabil.SideloadKit; 520 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 521 | SDKROOT = macosx; 522 | SKIP_INSTALL = YES; 523 | VERSIONING_SYSTEM = "apple-generic"; 524 | }; 525 | name = Release; 526 | }; 527 | 766AFE751F3CDCFDF7F4B7BF /* Debug */ = { 528 | isa = XCBuildConfiguration; 529 | buildSettings = { 530 | AD_HOC_CODE_SIGNING_ALLOWED = YES; 531 | ALWAYS_SEARCH_USER_PATHS = NO; 532 | ARCHS = ( 533 | arm64, 534 | ); 535 | CLANG_ANALYZER_NONNULL = YES; 536 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 537 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 538 | CLANG_CXX_LIBRARY = "libc++"; 539 | CLANG_ENABLE_MODULES = YES; 540 | CLANG_ENABLE_OBJC_ARC = YES; 541 | CLANG_ENABLE_OBJC_WEAK = YES; 542 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 543 | CLANG_WARN_BOOL_CONVERSION = YES; 544 | CLANG_WARN_COMMA = YES; 545 | CLANG_WARN_CONSTANT_CONVERSION = YES; 546 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 547 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 548 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 549 | CLANG_WARN_EMPTY_BODY = YES; 550 | CLANG_WARN_ENUM_CONVERSION = YES; 551 | CLANG_WARN_INFINITE_RECURSION = YES; 552 | CLANG_WARN_INT_CONVERSION = YES; 553 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 554 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 555 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 556 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 557 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO; 558 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 559 | CLANG_WARN_STRICT_PROTOTYPES = YES; 560 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 561 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 562 | CLANG_WARN_UNREACHABLE_CODE = YES; 563 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 564 | CODE_SIGNING_ALLOWED = YES; 565 | CODE_SIGN_IDENTITY = "-"; 566 | COPY_PHASE_STRIP = NO; 567 | DEBUG_INFORMATION_FORMAT = dwarf; 568 | ENABLE_HARDENED_RUNTIME = NO; 569 | ENABLE_STRICT_OBJC_MSGSEND = YES; 570 | ENABLE_TESTABILITY = YES; 571 | FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/Frameworks"; 572 | GCC_C_LANGUAGE_STANDARD = gnu11; 573 | GCC_DYNAMIC_NO_PIC = NO; 574 | GCC_NO_COMMON_BLOCKS = YES; 575 | GCC_OPTIMIZATION_LEVEL = 3; 576 | GCC_PREPROCESSOR_DEFINITIONS = ( 577 | "$(inherited)", 578 | "DEBUG=1", 579 | ); 580 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 581 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 582 | GCC_WARN_UNDECLARED_SELECTOR = YES; 583 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 584 | GCC_WARN_UNUSED_FUNCTION = YES; 585 | GCC_WARN_UNUSED_VARIABLE = YES; 586 | LD_RUNPATH_SEARCH_PATHS = ( 587 | "$(inherited)", 588 | "@executable_path/../Frameworks", 589 | "@loader_path/Frameworks", 590 | ); 591 | MACOSX_DEPLOYMENT_TARGET = 12.0; 592 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 593 | MTL_FAST_MATH = YES; 594 | ONLY_ACTIVE_ARCH = YES; 595 | OTHER_SWIFT_FLAGS = "-Xcc -Wno-nullability-completeness -Xcc -Wno-incomplete-umbrella -Xcc -Wno-property-attribute-mismatch -Xcc -Wno-strict-prototypes -Xcc -Wno-arc-performSelector-leaks -Xcc -Wno-objc-protocol-method-implementation -Xcc -Wno-incomplete-umbrella -Xcc -Wno-visibility"; 596 | PRODUCT_NAME = "$(TARGET_NAME)"; 597 | SDKROOT = ""; 598 | SKIP_INSTALL = YES; 599 | SUPPORTED_PLATFORMS = macosx; 600 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = ( 601 | DEBUG, 602 | ); 603 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 604 | SWIFT_VERSION = 5.5; 605 | SYSTEM_FRAMEWORK_SEARCH_PATHS = ( 606 | "$(inherited)", 607 | "$(SDKROOT)$(SYSTEM_LIBRARY_DIR)/PrivateFrameworks", 608 | ); 609 | VALID_ARCHS = arm64; 610 | WARNING_CFLAGS = ( 611 | "-Wno-nullability-completeness", 612 | "-Wno-incomplete-umbrella", 613 | "-Wno-objc-protocol-method-implementation", 614 | "-Wno-arc-performSelector-leaks", 615 | "-Wno-strict-prototypes", 616 | "-Wno-property-attribute-mismatch", 617 | "-Wno-visibility", 618 | ); 619 | }; 620 | name = Debug; 621 | }; 622 | 85179A9F3ED6EE9262A175EF /* Release */ = { 623 | isa = XCBuildConfiguration; 624 | buildSettings = { 625 | CODE_SIGN_IDENTITY = ""; 626 | COMBINE_HIDPI_IMAGES = YES; 627 | CURRENT_PROJECT_VERSION = 1; 628 | DEFINES_MODULE = YES; 629 | DYLIB_COMPATIBILITY_VERSION = 1; 630 | DYLIB_CURRENT_VERSION = 1; 631 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 632 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 633 | LD_RUNPATH_SEARCH_PATHS = ( 634 | "$(inherited)", 635 | "@executable_path/../Frameworks", 636 | ); 637 | MACH_O_TYPE = staticlib; 638 | PRODUCT_BUNDLE_IDENTIFIER = com.ericrabil.CSideloadKit; 639 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 640 | SDKROOT = macosx; 641 | SKIP_INSTALL = YES; 642 | VERSIONING_SYSTEM = "apple-generic"; 643 | }; 644 | name = Release; 645 | }; 646 | 856827CA556C5E87BCC1456A /* Release */ = { 647 | isa = XCBuildConfiguration; 648 | buildSettings = { 649 | CODE_SIGN_ENTITLEMENTS = "Sources/install-ios-app/ent.plist"; 650 | CODE_SIGN_IDENTITY = "-"; 651 | COMBINE_HIDPI_IMAGES = YES; 652 | LD_RUNPATH_SEARCH_PATHS = ( 653 | "$(inherited)", 654 | "@executable_path/../Frameworks", 655 | ); 656 | PRODUCT_BUNDLE_IDENTIFIER = "com.ericrabil.install-ios-app"; 657 | SDKROOT = macosx; 658 | SWIFT_OBJC_BRIDGING_HEADER = "Sources/install-ios-app/install-ios-app.h"; 659 | }; 660 | name = Release; 661 | }; 662 | A795B38AB3BDB92CE4E2610C /* Debug */ = { 663 | isa = XCBuildConfiguration; 664 | buildSettings = { 665 | CODE_SIGN_IDENTITY = ""; 666 | COMBINE_HIDPI_IMAGES = YES; 667 | CURRENT_PROJECT_VERSION = 1; 668 | DEFINES_MODULE = YES; 669 | DYLIB_COMPATIBILITY_VERSION = 1; 670 | DYLIB_CURRENT_VERSION = 1; 671 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 672 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 673 | LD_RUNPATH_SEARCH_PATHS = ( 674 | "$(inherited)", 675 | "@executable_path/../Frameworks", 676 | ); 677 | MACH_O_TYPE = staticlib; 678 | PRODUCT_BUNDLE_IDENTIFIER = com.ericrabil.SideloadKit; 679 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 680 | SDKROOT = macosx; 681 | SKIP_INSTALL = YES; 682 | VERSIONING_SYSTEM = "apple-generic"; 683 | }; 684 | name = Debug; 685 | }; 686 | /* End XCBuildConfiguration section */ 687 | 688 | /* Begin XCConfigurationList section */ 689 | 041CBC3FF04136DC0C2F7DCB /* Build configuration list for PBXNativeTarget "SideloadKit" */ = { 690 | isa = XCConfigurationList; 691 | buildConfigurations = ( 692 | A795B38AB3BDB92CE4E2610C /* Debug */, 693 | 5CF1038BF3B2A5FA152289C3 /* Release */, 694 | ); 695 | defaultConfigurationIsVisible = 0; 696 | defaultConfigurationName = Debug; 697 | }; 698 | 0C1111094332B5D855EC3470 /* Build configuration list for PBXNativeTarget "install-ios-app" */ = { 699 | isa = XCConfigurationList; 700 | buildConfigurations = ( 701 | 397FE2907379F7D235BE4248 /* Debug */, 702 | 856827CA556C5E87BCC1456A /* Release */, 703 | ); 704 | defaultConfigurationIsVisible = 0; 705 | defaultConfigurationName = Debug; 706 | }; 707 | 209D758B33182705E5BB89C7 /* Build configuration list for PBXProject "m1-ios-sideloader" */ = { 708 | isa = XCConfigurationList; 709 | buildConfigurations = ( 710 | 766AFE751F3CDCFDF7F4B7BF /* Debug */, 711 | 1334BBC123379E13DDA71DF2 /* Release */, 712 | ); 713 | defaultConfigurationIsVisible = 0; 714 | defaultConfigurationName = Debug; 715 | }; 716 | B5C2CB189CA6332C0C4A70F6 /* Build configuration list for PBXNativeTarget "CSideloadKit" */ = { 717 | isa = XCConfigurationList; 718 | buildConfigurations = ( 719 | 165912EBF747EDF965DCBD03 /* Debug */, 720 | 85179A9F3ED6EE9262A175EF /* Release */, 721 | ); 722 | defaultConfigurationIsVisible = 0; 723 | defaultConfigurationName = Debug; 724 | }; 725 | /* End XCConfigurationList section */ 726 | 727 | /* Begin XCRemoteSwiftPackageReference section */ 728 | 2A67603AF600FC2E9A28083B /* XCRemoteSwiftPackageReference "SwiftCLI" */ = { 729 | isa = XCRemoteSwiftPackageReference; 730 | repositoryURL = "https://github.com/jakeheis/SwiftCLI"; 731 | requirement = { 732 | kind = upToNextMajorVersion; 733 | minimumVersion = 6.0.3; 734 | }; 735 | }; 736 | /* End XCRemoteSwiftPackageReference section */ 737 | 738 | /* Begin XCSwiftPackageProductDependency section */ 739 | 50EB45562C1361CCDE3495C6 /* SwiftCLI */ = { 740 | isa = XCSwiftPackageProductDependency; 741 | package = 2A67603AF600FC2E9A28083B /* XCRemoteSwiftPackageReference "SwiftCLI" */; 742 | productName = SwiftCLI; 743 | }; 744 | /* End XCSwiftPackageProductDependency section */ 745 | }; 746 | rootObject = 6C9947B027166187A9142B2C /* Project object */; 747 | } 748 | --------------------------------------------------------------------------------