├── 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 |
--------------------------------------------------------------------------------