diff --git a/.gitignore b/.gitignore index cc76d321..69c9c6eb 100644 --- a/.gitignore +++ b/.gitignore @@ -5,11 +5,13 @@ # Xcode # +## CocoaPods Pods/ ## Build generated build/ DerivedData + archive.xcarchive ## Various settings *.pbxuser @@ -21,6 +23,7 @@ archive.xcarchive *.perspectivev3 !default.perspectivev3 xcuserdata + ## Other *.xccheckout *.moved-aside diff --git a/.gitmodules b/.gitmodules index 3272e236..c97da843 100644 --- a/.gitmodules +++ b/.gitmodules @@ -19,3 +19,8 @@ [submodule "Dependencies/libfragmentzip"] path = Dependencies/libfragmentzip url = https://github.com/SideStore/libfragmentzip.git + +[submodule "AltSign"] + path = Dependencies/AltSign + url = https://github.com/rileytestut/AltSign.git + branch = marketplace diff --git a/AltBackup/Assets.xcassets/Background.colorset/Contents.json b/AltBackup/Assets.xcassets/Background.colorset/Contents.json index 262221ad..8251d696 100644 --- a/AltBackup/Assets.xcassets/Background.colorset/Contents.json +++ b/AltBackup/Assets.xcassets/Background.colorset/Contents.json @@ -5,9 +5,9 @@ "color-space" : "srgb", "components" : { "alpha" : "1.000", - "blue" : "175", - "green" : "4", - "red" : "115" + "blue" : "0.518", + "green" : "0.502", + "red" : "0.004" } }, "idiom" : "universal" @@ -23,9 +23,9 @@ "color-space" : "srgb", "components" : { "alpha" : "1.000", - "blue" : "150", - "green" : "3", - "red" : "99" + "blue" : "0.404", + "green" : "0.322", + "red" : "0.008" } }, "idiom" : "universal" diff --git a/AltBackup/Info.plist b/AltBackup/Info.plist index c40c1c3c..de9d0f78 100644 --- a/AltBackup/Info.plist +++ b/AltBackup/Info.plist @@ -5,7 +5,6 @@ ALTAppGroups group.$(APP_GROUP_IDENTIFIER) - group.com.SideStore.SideStore ALTBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) diff --git a/AltJIT/AltJIT-Bridging-Header.h b/AltJIT/AltJIT-Bridging-Header.h deleted file mode 100644 index 2f15d05e..00000000 --- a/AltJIT/AltJIT-Bridging-Header.h +++ /dev/null @@ -1,7 +0,0 @@ -// -// Use this file to import your target's public headers that you would like to expose to Swift. -// - -// Shared -#import "ALTWrappedError.h" -#import "NSError+ALTServerError.h" diff --git a/AltJIT/AltJIT.swift b/AltJIT/AltJIT.swift deleted file mode 100644 index cc73f33b..00000000 --- a/AltJIT/AltJIT.swift +++ /dev/null @@ -1,18 +0,0 @@ -// -// AltJIT.swift -// AltJIT -// -// Created by Riley Testut on 8/29/23. -// Copyright © 2023 Riley Testut. All rights reserved. -// - -import OSLog -import ArgumentParser - -@main -struct AltJIT: AsyncParsableCommand -{ - static let configuration = CommandConfiguration(commandName: "altjit", - abstract: "Enable JIT for sideloaded apps.", - subcommands: [EnableJIT.self, MountDisk.self]) -} diff --git a/AltJIT/Commands/EnableJIT.swift b/AltJIT/Commands/EnableJIT.swift deleted file mode 100644 index 1e5647a1..00000000 --- a/AltJIT/Commands/EnableJIT.swift +++ /dev/null @@ -1,455 +0,0 @@ -// -// EnableJIT.swift -// AltPackage -// -// Created by Riley Testut on 8/29/23. -// Copyright © 2023 Riley Testut. All rights reserved. -// - -import Foundation -import OSLog -import RegexBuilder - -import ArgumentParser - -struct EnableJIT: PythonCommand -{ - static let configuration = CommandConfiguration(commandName: "enable", abstract: "Enable JIT for a specific app on your device.") - - @Argument(help: "The name or PID of the app to enable JIT for.", transform: AppProcess.init) - var process: AppProcess - - @Option(help: "Your iOS device's UDID.") - var udid: String - - @Option(name: .shortAndLong, help: "Number of seconds to wait when connecting to an iOS device before operation is cancelled.") - var timeout: TimeInterval = 90.0 - - // PythonCommand - var pythonPath: String? - - mutating func run() async throws - { - // Use local variables to fix "escaping autoclosure captures mutating self parameter" compiler error. - let process = self.process - let udid = self.udid - - do - { - do - { - Logger.main.info("Enabling JIT for \(process, privacy: .private(mask: .hash)) on device \(udid, privacy: .private(mask: .hash))...") - - try await self.prepare() - - let rsdTunnel = try await self.startRSDTunnel() - defer { rsdTunnel.process.terminate() } - print("Connected to device \(self.udid)!", rsdTunnel) - - let port = try await self.startDebugServer(rsdTunnel: rsdTunnel) - print("Started debugserver on port \(port).") - - print("Attaching debugger...") - let lldb = try await self.attachDebugger(ipAddress: rsdTunnel.ipAddress, port: port) - defer { lldb.terminate() } - print("Attached debugger to \(process).") - - try await self.detachDebugger(lldb) - print("Detached debugger from \(process).") - - print("✅ Successfully enabled JIT for \(process) on device \(udid)!") - } - catch let error as ProcessError - { - if let output = error.output - { - print(output) - } - - throw error - } - } - catch - { - print("❌ Unable to enable JIT for \(process) on device \(udid).") - print(error.localizedDescription) - - Logger.main.error("Failed to enable JIT for \(process, privacy: .private(mask: .hash)) on device \(udid, privacy: .private(mask: .hash)). \(error, privacy: .public)") - - throw ExitCode.failure - } - } -} - -private extension EnableJIT -{ - func startRSDTunnel() async throws -> RemoteServiceDiscoveryTunnel - { - do - { - Logger.main.info("Starting RSD tunnel with timeout: \(self.timeout)") - - let process = try Process.launch(.python3, arguments: ["-u", "-m", "pymobiledevice3", "remote", "start-quic-tunnel", "--udid", self.udid], environment: self.processEnvironment) - - do - { - let rsdTunnel = try await withTimeout(seconds: self.timeout) { - let regex = Regex { - "--rsd" - - OneOrMore(.whitespace) - - Capture { - OneOrMore(.anyGraphemeCluster) - } - - OneOrMore(.whitespace) - - TryCapture { - OneOrMore(.digit) - } transform: { match in - Int(match) - } - } - - for try await line in process.outputLines - { - if let match = line.firstMatch(of: regex) - { - let rsdTunnel = RemoteServiceDiscoveryTunnel(ipAddress: String(match.1), port: match.2, process: process) - return rsdTunnel - } - } - - throw ProcessError.unexpectedOutput(executableURL: .python3, output: process.output) - } - - // MUST close standardOutput in order to stream output later. - process.stopOutput() - - return rsdTunnel - } - catch is TimedOutError - { - process.terminate() - - let error = ProcessError.timedOut(executableURL: .python3, output: process.output) - throw error - } - catch - { - process.terminate() - throw error - } - } - catch let error as NSError - { - let localizedFailure = NSLocalizedString("Could not connect to device \(self.udid).", comment: "") - throw error.withLocalizedFailure(localizedFailure) - } - } - - func startDebugServer(rsdTunnel: RemoteServiceDiscoveryTunnel) async throws -> Int - { - do - { - Logger.main.info("Starting debugserver with timeout: \(self.timeout)") - - return try await withTimeout(seconds: self.timeout) { - let arguments = ["-u", "-m", "pymobiledevice3", "developer", "debugserver", "start-server"] + rsdTunnel.commandArguments - - let output = try await Process.launchAndWait(.python3, arguments: arguments, environment: self.processEnvironment) - - let port = Reference(Int.self) - let regex = Regex { - "connect://" - - OneOrMore(.anyGraphemeCluster, .eager) - - ":" - - TryCapture(as: port) { - OneOrMore(.digit) - } transform: { match in - Int(match) - } - } - - if let match = output.firstMatch(of: regex) - { - return match[port] - } - - throw ProcessError.unexpectedOutput(executableURL: .python3, output: output) - } - } - catch let error as NSError - { - let localizedFailure = NSLocalizedString("Could not start debugserver on device \(self.udid).", comment: "") - throw error.withLocalizedFailure(localizedFailure) - } - } - - func attachDebugger(ipAddress: String, port: Int) async throws -> Process - { - do - { - Logger.main.info("Attaching debugger...") - - let processID: Int - - switch self.process - { - case .pid(let pid): processID = pid - case .name(let name): - guard let pid = try await self.getPID(for: name) else { throw JITError.processNotRunning(self.process) } - processID = pid - } - - let process = try Process.launch(.lldb, environment: self.processEnvironment) - - do - { - try await withThrowingTaskGroup(of: Void.self) { taskGroup in - - // // Throw error if program terminates. - // taskGroup.addTask { - // try await withCheckedThrowingContinuation { continuation in - // process.terminationHandler = { process in - // Task { - // // Should NEVER be called unless an error occurs. - // continuation.resume(throwing: ProcessError.terminated(executableURL: .lldb, exitCode: process.terminationStatus, output: process.output)) - // } - // } - // } - // } - - taskGroup.addTask { - do - { - try await self.sendDebuggerCommand("platform select remote-ios", to: process, timeout: 5) { - ChoiceOf { - "SDK Roots:" - "unable to locate SDK" - } - } - - let ipAddress = "[\(ipAddress)]" - let connectCommand = "process connect connect://\(ipAddress):\(port)" - try await self.sendDebuggerCommand(connectCommand, to: process, timeout: 10) - - try await self.sendDebuggerCommand("settings set target.memory-module-load-level minimal", to: process, timeout: 5) - - let attachCommand = "attach -p \(processID)" - let failureMessage = "attach failed" - let output = try await self.sendDebuggerCommand(attachCommand, to: process, timeout: 120) { - - ChoiceOf { - failureMessage - - Regex { - "Process " - OneOrMore(.digit) - " stopped" - } - } - } - - if output.contains(failureMessage) - { - throw ProcessError.failed(executableURL: .lldb, exitCode: -1, output: process.output) - } - } - catch is TimedOutError - { - let error = ProcessError.timedOut(executableURL: .lldb, output: process.output) - throw error - } - } - - // Wait until first child task returns - _ = try await taskGroup.next()! - - // Cancel remaining tasks - taskGroup.cancelAll() - } - - return process - } - catch - { - process.terminate() - throw error - } - } - catch let error as NSError - { - let localizedFailure = String(format: NSLocalizedString("Could not attach debugger to %@.", comment: ""), self.process.description) - throw error.withLocalizedFailure(localizedFailure) - } - } - - func detachDebugger(_ process: Process) async throws - { - do - { - Logger.main.info("Detaching debugger...") - - try await withThrowingTaskGroup(of: Void.self) { taskGroup in - -// // Throw error if program terminates. -// taskGroup.addTask { -// try await withCheckedThrowingContinuation { continuation in -// process.terminationHandler = { process in -// if process.terminationStatus == 0 -// { -// continuation.resume() -// } -// else -// { -// continuation.resume(throwing: ProcessError.terminated(executableURL: .lldb, exitCode: process.terminationStatus, output: process.output)) -// } -// } -// } -// } - - taskGroup.addTask { - do - { - try await self.sendDebuggerCommand("c", to: process, timeout: 10) { - "Process " - OneOrMore(.digit) - " resuming" - } - - try await self.sendDebuggerCommand("detach", to: process, timeout: 10) { - "Process " - OneOrMore(.digit) - " detached" - } - } - catch is TimedOutError - { - let error = ProcessError.timedOut(executableURL: .lldb, output: process.output) - throw error - } - } - - // Wait until first child task returns - _ = try await taskGroup.next()! - - // Cancel remaining tasks - taskGroup.cancelAll() - } - } - catch let error as NSError - { - let localizedFailure = NSLocalizedString("Could not detach debugger from \(self.process).", comment: "") - throw error.withLocalizedFailure(localizedFailure) - } - } -} - -private extension EnableJIT -{ - func getPID(for name: String) async throws -> Int? - { - Logger.main.info("Retrieving PID for \(name, privacy: .private(mask: .hash))...") - - let arguments = ["-m", "pymobiledevice3", "processes", "pgrep", name, "--udid", self.udid] - let output = try await Process.launchAndWait(.python3, arguments: arguments, environment: self.processEnvironment) - - let regex = Regex { - "INFO" - - OneOrMore(.whitespace) - - TryCapture { - OneOrMore(.digit) - } transform: { match in - Int(match) - } - - OneOrMore(.whitespace) - - name - } - - if let match = output.firstMatch(of: regex) - { - Logger.main.info("\(name, privacy: .private(mask: .hash)) PID is \(match.1)") - return match.1 - } - - return nil - } - - @discardableResult - func sendDebuggerCommand(_ command: String, to process: Process, timeout: TimeInterval, - @RegexComponentBuilder regex: @escaping () -> (some RegexComponent)? = { Optional>.none }) async throws -> String - { - guard let inputPipe = process.standardInput as? Pipe else { preconditionFailure("`process` must have a Pipe as its standardInput") } - defer { - inputPipe.fileHandleForWriting.writeabilityHandler = nil - } - - let initialOutput = process.output - - let data = (command + "\n").data(using: .utf8)! // Will always succeed. - Logger.main.info("Sending lldb command: \(command, privacy: .public)") - - let output = try await withTimeout(seconds: timeout) { - // Wait until process is ready to receive input. - try await withCheckedThrowingContinuation { continuation in - inputPipe.fileHandleForWriting.writeabilityHandler = { fileHandle in - inputPipe.fileHandleForWriting.writeabilityHandler = nil - - let result = Result { try fileHandle.write(contentsOf: data) } - continuation.resume(with: result) - } - } - - // Wait until we receive at least one line of output. - for try await _ in process.outputLines - { - break - } - - // Keep waiting until output doesn't change. - // If regex is provided, we keep waiting until a match is found. - var previousOutput = process.output - while true - { - try await Task.sleep(for: .seconds(0.2)) - - let output = process.output - if output == previousOutput - { - guard let regex = regex() else { - // No regex, so break as soon as output stops changing. - break - } - - if output.contains(regex) - { - // Found a match, so exit while loop. - break - } - else - { - // Output hasn't changed, but regex does not match (yet). - continue - } - } - - previousOutput = output - } - - return previousOutput - } - - // Subtract initialOutput from output to get just this command's output. - let commandOutput = output.replacingOccurrences(of: initialOutput, with: "") - return commandOutput - } -} diff --git a/AltJIT/Commands/MountDisk.swift b/AltJIT/Commands/MountDisk.swift deleted file mode 100644 index 802feabb..00000000 --- a/AltJIT/Commands/MountDisk.swift +++ /dev/null @@ -1,75 +0,0 @@ -// -// MountDisk.swift -// AltPackage -// -// Created by Riley Testut on 8/31/23. -// Copyright © 2023 Riley Testut. All rights reserved. -// - -import Foundation -import OSLog - -import ArgumentParser - -typealias MountError = MountErrorCode.Error -enum MountErrorCode: Int, ALTErrorEnum -{ - case alreadyMounted - - var errorFailureReason: String { - switch self - { - case .alreadyMounted: return NSLocalizedString("A personalized Developer Disk is already mounted.", comment: "") - } - } -} - -struct MountDisk: PythonCommand -{ - static let configuration = CommandConfiguration(commandName: "mount", abstract: "Mount a personalized developer disk image onto an iOS device.") - - @Option(help: "The iOS device's UDID.") - var udid: String - - // PythonCommand - var pythonPath: String? - - mutating func run() async throws - { - do - { - print("Mounting personalized developer disk...") - - try await self.prepare() - - let output = try await Process.launchAndWait(.python3, arguments: ["-m", "pymobiledevice3", "mounter", "auto-mount", "--udid", self.udid]) - if !output.contains("DeveloperDiskImage") - { - throw ProcessError.unexpectedOutput(executableURL: .python3, output: output) - } - - if output.contains("already mounted") - { - throw MountError(.alreadyMounted) - } - - print("✅ Successfully mounted personalized Developer Disk!") - } - catch let error as MountError where error.code == .alreadyMounted - { - // Prepend ⚠️ since this is not really an error. - let localizedDescription = "⚠️ " + error.localizedDescription - print(localizedDescription) - - throw ExitCode.success - } - catch - { - // Output failure message first before error. - print("❌ Unable to mount personalized Developer Disk.") - print(error.localizedDescription) - - throw ExitCode.failure - } - } -} diff --git a/AltJIT/Extensions/Logger+AltJIT.swift b/AltJIT/Extensions/Logger+AltJIT.swift deleted file mode 100644 index b8453141..00000000 --- a/AltJIT/Extensions/Logger+AltJIT.swift +++ /dev/null @@ -1,16 +0,0 @@ -// -// Logger+AltJIT.swift -// AltJIT -// -// Created by Riley Testut on 8/29/23. -// Copyright © 2023 Riley Testut. All rights reserved. -// - -import OSLog - -public extension Logger -{ - static let altjitSubsystem = Bundle.main.bundleIdentifier! - - static let main = Logger(subsystem: altjitSubsystem, category: "AltJIT") -} diff --git a/AltJIT/Extensions/Task+Timeout.swift b/AltJIT/Extensions/Task+Timeout.swift deleted file mode 100644 index 33f448f3..00000000 --- a/AltJIT/Extensions/Task+Timeout.swift +++ /dev/null @@ -1,57 +0,0 @@ -// -// Task+Timeout.swift -// AltPackage -// -// Created by Riley Testut on 8/31/23. -// Copyright © 2023 Riley Testut. All rights reserved. -// -// Based heavily on https://forums.swift.org/t/running-an-async-task-with-a-timeout/49733/13 -// - -import Foundation - -struct TimedOutError: LocalizedError -{ - var duration: TimeInterval - - public var errorDescription: String? { - //TODO: Change pluralization for 1 second. - let errorDescription = String(format: NSLocalizedString("The task timed out after %@ seconds.", comment: ""), self.duration.formatted()) - return errorDescription - } -} - -/// -/// Execute an operation in the current task subject to a timeout. -/// -/// - Parameters: -/// - seconds: The duration in seconds `operation` is allowed to run before timing out. -/// - operation: The async operation to perform. -/// - Returns: Returns the result of `operation` if it completed in time. -/// - Throws: Throws ``TimedOutError`` if the timeout expires before `operation` completes. -/// If `operation` throws an error before the timeout expires, that error is propagated to the caller. -func withTimeout(seconds: TimeInterval, file: StaticString = #file, line: Int = #line, operation: @escaping @Sendable () async throws -> R) async throws -> R -{ - return try await withThrowingTaskGroup(of: R.self) { group in - let deadline = Date(timeIntervalSinceNow: seconds) - - // Start actual work. - group.addTask { - return try await operation() - } - // Start timeout child task. - group.addTask { - let interval = deadline.timeIntervalSinceNow - if interval > 0 { - try await Task.sleep(for: .seconds(interval)) - } - try Task.checkCancellation() - // We’ve reached the timeout. - throw TimedOutError(duration: seconds) - } - // First finished child task wins, cancel the other task. - let result = try await group.next()! - group.cancelAll() - return result - } -} diff --git a/AltJIT/Extensions/URL+Tools.swift b/AltJIT/Extensions/URL+Tools.swift deleted file mode 100644 index 364be414..00000000 --- a/AltJIT/Extensions/URL+Tools.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// URL+Tools.swift -// AltJIT -// -// Created by Riley Testut on 9/3/23. -// Copyright © 2023 Riley Testut. All rights reserved. -// - -import Foundation - -extension URL -{ - static let python3 = URL(fileURLWithPath: "/usr/bin/python3") - static let lldb = URL(fileURLWithPath: "/usr/bin/lldb") -} diff --git a/AltJIT/Types/PythonCommand.swift b/AltJIT/Types/PythonCommand.swift deleted file mode 100644 index 0f493e71..00000000 --- a/AltJIT/Types/PythonCommand.swift +++ /dev/null @@ -1,58 +0,0 @@ -// -// PythonCommand.swift -// AltJIT -// -// Created by Riley Testut on 9/6/23. -// Copyright © 2023 Riley Testut. All rights reserved. -// - -import ArgumentParser - -protocol PythonCommand: AsyncParsableCommand -{ - var pythonPath: String? { get set } -} - -extension PythonCommand -{ - var processEnvironment: [String: String] { - var environment = ProcessInfo.processInfo.environment - - if let pythonPath - { - environment["PYTHONPATH"] = pythonPath - } - - return environment - } - - mutating func prepare() async throws - { - let pythonPath = try await self.readPythonPath() - self.pythonPath = pythonPath.path(percentEncoded: false) - } -} - -private extension PythonCommand -{ - func readPythonPath() async throws -> URL - { - let processOutput: String - - do - { - processOutput = try await Process.launchAndWait(.python3, arguments: ["-m", "site", "--user-site"]) - } - catch let error as ProcessError where error.exitCode == 2 - { - // Ignore exit code 2. - guard let output = error.output else { throw error } - processOutput = output - } - - let sanitizedOutput = processOutput.trimmingCharacters(in: .whitespacesAndNewlines) - - let pythonURL = URL(filePath: sanitizedOutput) - return pythonURL - } -} diff --git a/AltJIT/Types/RemoteServiceDiscoveryTunnel.swift b/AltJIT/Types/RemoteServiceDiscoveryTunnel.swift deleted file mode 100644 index 545b91db..00000000 --- a/AltJIT/Types/RemoteServiceDiscoveryTunnel.swift +++ /dev/null @@ -1,41 +0,0 @@ -// -// RemoteServiceDiscoveryTunnel.swift -// AltJIT -// -// Created by Riley Testut on 9/3/23. -// Copyright © 2023 Riley Testut. All rights reserved. -// - -import Foundation - -final class RemoteServiceDiscoveryTunnel -{ - let ipAddress: String - let port: Int - - let process: Process - - var commandArguments: [String] { - ["--rsd", self.ipAddress, String(self.port)] - } - - init(ipAddress: String, port: Int, process: Process) - { - self.ipAddress = ipAddress - self.port = port - - self.process = process - } - - deinit - { - self.process.terminate() - } -} - -extension RemoteServiceDiscoveryTunnel: CustomStringConvertible -{ - var description: String { - "\(self.ipAddress) \(self.port)" - } -} diff --git a/AltServer/Anisette Data/AnisetteError.swift b/AltServer/Anisette Data/AnisetteError.swift deleted file mode 100644 index 997029bc..00000000 --- a/AltServer/Anisette Data/AnisetteError.swift +++ /dev/null @@ -1,51 +0,0 @@ -// -// AnisetteError.swift -// AltServer -// -// Created by Riley Testut on 9/13/23. -// Copyright © 2023 Riley Testut. All rights reserved. -// - -import Foundation - -extension AnisetteError -{ - enum Code: Int, ALTErrorCode - { - typealias Error = AnisetteError - - case aosKitFailure - case missingValue - } - - static func aosKitFailure(file: String = #fileID, line: UInt = #line) -> AnisetteError { - AnisetteError(code: .aosKitFailure, sourceFile: file, sourceLine: line) - } - - static func missingValue(_ value: String?, file: String = #fileID, line: UInt = #line) -> AnisetteError { - AnisetteError(code: .missingValue, value: value, sourceFile: file, sourceLine: line) - } -} - -struct AnisetteError: ALTLocalizedError -{ - var code: Code - var errorTitle: String? - var errorFailure: String? - - @UserInfoValue - var value: String? - - var sourceFile: String? - var sourceLine: UInt? - - var errorFailureReason: String { - switch self.code - { - case .aosKitFailure: return NSLocalizedString("AltServer could not retrieve anisette data from AOSKit.", comment: "") - case .missingValue: - let valueName = self.value.map { "anisette data value “\($0)”" } ?? NSLocalizedString("anisette data values.", comment: "") - return String(format: NSLocalizedString("AltServer could not retrieve %@.", comment: ""), valueName) - } - } -} diff --git a/AltServer/Extensions/Logger+AltServer.swift b/AltServer/Extensions/Logger+AltServer.swift deleted file mode 100644 index 37df6c4e..00000000 --- a/AltServer/Extensions/Logger+AltServer.swift +++ /dev/null @@ -1,16 +0,0 @@ -// -// Logger+AltServer.swift -// AltStore -// -// Created by Riley Testut on 9/6/23. -// Copyright © 2023 Riley Testut. All rights reserved. -// - -import OSLog - -extension Logger -{ - static let altserverSubsystem = Bundle.main.bundleIdentifier! - - static let main = Logger(subsystem: altserverSubsystem, category: "AltServer") -} diff --git a/AltServer/Extensions/Process+STPrivilegedTask.swift b/AltServer/Extensions/Process+STPrivilegedTask.swift deleted file mode 100644 index 04cc573c..00000000 --- a/AltServer/Extensions/Process+STPrivilegedTask.swift +++ /dev/null @@ -1,71 +0,0 @@ -// -// Process+STPrivilegedTask.swift -// AltServer -// -// Created by Riley Testut on 8/22/23. -// Copyright © 2023 Riley Testut. All rights reserved. -// - -import Foundation -import Security -import OSLog - -import STPrivilegedTask - -extension Process -{ - class func runAsAdmin(_ program: String, arguments: [String], authorization: AuthorizationRef? = nil) throws -> AuthorizationRef? - { - var launchPath = "/usr/bin/" + program - if !FileManager.default.fileExists(atPath: launchPath) - { - launchPath = "/bin/" + program - } - - if !FileManager.default.fileExists(atPath: launchPath) - { - launchPath = program - } - - Logger.main.info("Launching admin process: \(launchPath, privacy: .public)") - - let task = STPrivilegedTask() - task.launchPath = launchPath - task.arguments = arguments - task.freeAuthorizationWhenDone = false - - let errorCode: OSStatus - - if let authorization = authorization - { - errorCode = task.launch(withAuthorization: authorization) - } - else - { - errorCode = task.launch() - } - - let executableURL = URL(fileURLWithPath: launchPath) - guard errorCode == 0 else { throw ProcessError.failed(executableURL: executableURL, exitCode: errorCode, output: nil) } - - task.waitUntilExit() - - Logger.main.info("Admin process \(launchPath, privacy: .public) terminated with exit code \(task.terminationStatus, privacy: .public).") - - guard task.terminationStatus == 0 else { - let executableURL = URL(fileURLWithPath: launchPath) - - let outputData = task.outputFileHandle.readDataToEndOfFile() - if let outputString = String(data: outputData, encoding: .utf8), !outputString.isEmpty - { - throw ProcessError.failed(executableURL: executableURL, exitCode: task.terminationStatus, output: outputString) - } - else - { - throw ProcessError.failed(executableURL: executableURL, exitCode: task.terminationStatus, output: nil) - } - } - - return task.authorization - } -} diff --git a/AltServer/Extensions/ProcessInfo+Device.swift b/AltServer/Extensions/ProcessInfo+Device.swift deleted file mode 100644 index 70e2c74a..00000000 --- a/AltServer/Extensions/ProcessInfo+Device.swift +++ /dev/null @@ -1,54 +0,0 @@ -// -// ProcessInfo+Device.swift -// AltServer -// -// Created by Riley Testut on 9/13/23. -// Copyright © 2023 Riley Testut. All rights reserved. -// - -import Foundation -import RegexBuilder - -extension ProcessInfo -{ - var deviceModel: String? { - let service = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("IOPlatformExpertDevice")) - defer { - IOObjectRelease(service) - } - - guard - let modelData = IORegistryEntryCreateCFProperty(service, "model" as CFString, kCFAllocatorDefault, 0).takeRetainedValue() as? Data, - let cDeviceModel = String(data: modelData, encoding: .utf8)?.cString(using: .utf8) // Remove trailing NULL character - else { return nil } - - let deviceModel = String(cString: cDeviceModel) - return deviceModel - } - - var operatingSystemBuildVersion: String? { - let osVersionString = ProcessInfo.processInfo.operatingSystemVersionString - let buildVersion: String? - - if #available(macOS 13, *), let match = osVersionString.firstMatch(of: Regex { - "(Build " - Capture { - OneOrMore(.anyNonNewline) - } - ")" - }) - { - buildVersion = String(match.1) - } - else if let build = osVersionString.split(separator: " ").last?.dropLast() - { - buildVersion = String(build) - } - else - { - buildVersion = nil - } - - return buildVersion - } -} diff --git a/AltServer/JIT/JITManager.swift b/AltServer/JIT/JITManager.swift deleted file mode 100644 index e9450eeb..00000000 --- a/AltServer/JIT/JITManager.swift +++ /dev/null @@ -1,192 +0,0 @@ -// -// JITManager.swift -// AltServer -// -// Created by Riley Testut on 8/30/23. -// Copyright © 2023 Riley Testut. All rights reserved. -// - -import RegexBuilder - -import AltSign - -private extension URL -{ - static let python3 = URL(fileURLWithPath: "/usr/bin/python3") - static let altjit = Bundle.main.executableURL!.deletingLastPathComponent().appendingPathComponent("altjit") -} - -class JITManager -{ - static let shared = JITManager() - - private let diskManager = DeveloperDiskManager() - - private var authorization: AuthorizationRef? - - private init() - { - } - - func prepare(_ device: ALTDevice) async throws - { - let isMounted = try await ALTDeviceManager.shared.isDeveloperDiskImageMounted(for: device) - guard !isMounted else { return } - - if #available(macOS 13, *), device.osVersion.majorVersion >= 17 - { - // iOS 17+ - try await self.installPersonalizedDeveloperDisk(onto: device) - } - else - { - try await self.installDeveloperDisk(onto: device) - } - } - - func enableUnsignedCodeExecution(process: AppProcess, device: ALTDevice) async throws - { - try await self.prepare(device) - - if #available(macOS 13, *), device.osVersion.majorVersion >= 17 - { - // iOS 17+ - try await self.enableModernUnsignedCodeExecution(process: process, device: device) - } - else - { - try await self.enableLegacyUnsignedCodeExecution(process: process, device: device) - } - } -} - -private extension JITManager -{ - func installDeveloperDisk(onto device: ALTDevice) async throws - { - try await withCheckedThrowingContinuation { (continuation: CheckedContinuation) in - self.diskManager.downloadDeveloperDisk(for: device) { (result) in - switch result - { - case .failure(let error): continuation.resume(throwing: error) - case .success((let diskFileURL, let signatureFileURL)): - ALTDeviceManager.shared.installDeveloperDiskImage(at: diskFileURL, signatureURL: signatureFileURL, to: device) { (success, error) in - switch Result(success, error) - { - case .failure(let error as ALTServerError) where error.code == .incompatibleDeveloperDisk: - self.diskManager.setDeveloperDiskCompatible(false, with: device) - continuation.resume(throwing: error) - - case .failure(let error): - // Don't mark developer disk as incompatible because it probably failed for a different reason. - continuation.resume(throwing: error) - - case .success: - self.diskManager.setDeveloperDiskCompatible(true, with: device) - continuation.resume() - } - } - } - } - } - } - - func enableLegacyUnsignedCodeExecution(process: AppProcess, device: ALTDevice) async throws - { - let connection = try await ALTDeviceManager.shared.startDebugConnection(to: device) - - switch process - { - case .name(let name): try await connection.enableUnsignedCodeExecutionForProcess(withName: name) - case .pid(let pid): try await connection.enableUnsignedCodeExecutionForProcess(withID: pid) - } - } -} - -@available(macOS 13, *) -private extension JITManager -{ - func installPersonalizedDeveloperDisk(onto device: ALTDevice) async throws - { - do - { - _ = try await Process.launchAndWait(.altjit, arguments: ["mount", "--udid", device.identifier]) - } - catch - { - try self.processAltJITError(error) - } - } - - func enableModernUnsignedCodeExecution(process: AppProcess, device: ALTDevice) async throws - { - do - { - if self.authorization == nil - { - // runAsAdmin() only returns authorization if the process completes successfully, - // so we request authorization for a command that can't fail, then re-use it for the failable command below. - self.authorization = try Process.runAsAdmin("echo", arguments: ["altstore"], authorization: self.authorization) - } - - var arguments = ["enable"] - switch process - { - case .name(let name): arguments.append(name) - case .pid(let pid): arguments.append(String(pid)) - } - arguments += ["--udid", device.identifier] - - if let timeout = UserDefaults.standard.altJITTimeout - { - arguments += ["--timeout", String(timeout)] - } - - self.authorization = try Process.runAsAdmin(URL.altjit.path, arguments: arguments, authorization: self.authorization) - } - catch - { - try self.processAltJITError(error) - } - } - - func processAltJITError(_ error: some Error) throws - { - do - { - throw error - } - catch let error as ProcessError where error.code == .failed - { - guard let output = error.output else { throw error } - - let dependencyNotFoundRegex = Regex { - "No module named" - - OneOrMore(.whitespace) - - Capture { - OneOrMore(.anyNonNewline) - } - } - - let deviceNotFoundRegex = Regex { - "Device is not connected" - } - - if let match = output.firstMatch(of: dependencyNotFoundRegex) - { - let dependency = String(match.1) - throw JITError.dependencyNotFound(dependency) - } - else if output.contains(deviceNotFoundRegex) - { - throw ALTServerError(.deviceNotFound, userInfo: [ - NSLocalizedRecoverySuggestionErrorKey: NSLocalizedString("Your device must be plugged into your computer to enable JIT on iOS 17 or later.", comment: "") - ]) - } - - throw error - } - } -} diff --git a/AltStore.xcodeproj/project.pbxproj b/AltStore.xcodeproj/project.pbxproj index 117aeb3e..591e3c58 100644 --- a/AltStore.xcodeproj/project.pbxproj +++ b/AltStore.xcodeproj/project.pbxproj @@ -3,12 +3,11 @@ archiveVersion = 1; classes = { }; - objectVersion = 55; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ 03F06CD52942C27E001C4D68 /* Bundle+AltStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF1E314122A05D4C00370A3C /* Bundle+AltStore.swift */; }; - 0E05025A2BEC83C500879B5C /* OperatingSystemVersion+Comparable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E0502592BEC83C500879B5C /* OperatingSystemVersion+Comparable.swift */; }; 0E05025C2BEC947000879B5C /* String+SideStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E05025B2BEC947000879B5C /* String+SideStore.swift */; }; 0E13E5862CC8F55900E9C0DF /* ProcessInfo+SideStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E13E5852CC8F55900E9C0DF /* ProcessInfo+SideStore.swift */; }; 0E1A1F912AE36A9700364CAD /* bytearray.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E1A1F902AE36A9600364CAD /* bytearray.c */; }; @@ -47,20 +46,24 @@ 0EE7FDC92BE8D07400D1E390 /* NSError+AltStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF6C336124197D700034FD24 /* NSError+AltStore.swift */; }; 0EE7FDCB2BE8D12B00D1E390 /* ALTLocalizedError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE7FDC32BE8BC7900D1E390 /* ALTLocalizedError.swift */; }; 0EE7FDCD2BE9124400D1E390 /* ErrorDetailsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE7FDCC2BE9124400D1E390 /* ErrorDetailsViewController.swift */; }; - 19104D952909BAEA00C49C7B /* libimobiledevice.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BF45872B2298D31600BD7491 /* libimobiledevice.a */; }; 19104DB52909C06D00C49C7B /* EmotionalDamage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19104DB42909C06D00C49C7B /* EmotionalDamage.swift */; }; 19104DBC2909C4E500C49C7B /* libEmotionalDamage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 19104DB22909C06C00C49C7B /* libEmotionalDamage.a */; }; 191E5FB4290A5DA0001A3B7C /* libminimuxer.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 191E5FAB290A5D92001A3B7C /* libminimuxer.a */; }; - 191E5FDC290AFA5C001A3B7C /* OpenSSL in Frameworks */ = {isa = PBXBuildFile; productRef = 191E5FDB290AFA5C001A3B7C /* OpenSSL */; }; 19B9B7452845E6DF0076EF69 /* SelectTeamViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19B9B7442845E6DF0076EF69 /* SelectTeamViewController.swift */; }; - 4879A95F2861046500FC1BBD /* AltSign in Frameworks */ = {isa = PBXBuildFile; productRef = 4879A95E2861046500FC1BBD /* AltSign */; }; - 4879A9622861049C00FC1BBD /* OpenSSL in Frameworks */ = {isa = PBXBuildFile; productRef = 4879A9612861049C00FC1BBD /* OpenSSL */; }; - 9922FFEC29B501C50020F868 /* Starscream in Frameworks */ = {isa = PBXBuildFile; productRef = 9922FFEB29B501C50020F868 /* Starscream */; }; - 99C4EF4D2979132100CB538D /* SemanticVersion in Frameworks */ = {isa = PBXBuildFile; productRef = 99C4EF4C2979132100CB538D /* SemanticVersion */; }; + 3D9D12C92BFBC6DBF27A29DF /* Pods_AltStoreCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9932E27A2170D2226ABFA4B6 /* Pods_AltStoreCore.framework */; }; + 946A01BDDC0C453B8AA95668 /* Pods_SideStore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 941BDBA6EC0212BC1DCBA3F9 /* Pods_SideStore.framework */; }; 99F87D0529D8B4E200B40039 /* minimuxer-helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9961EC2D29BE9F2E00AF2C6F /* minimuxer-helpers.swift */; }; 99F87D1829D8E4C900B40039 /* SwiftBridgeCore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99F87D1629D8E4C900B40039 /* SwiftBridgeCore.swift */; }; 99F87D1929D8E4C900B40039 /* minimuxer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99F87D1729D8E4C900B40039 /* minimuxer.swift */; }; A800F7042CE28E3800208744 /* View+AltWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = A800F7032CE28E2F00208744 /* View+AltWidget.swift */; }; + A82067842D03DC0600645C0D /* OperatingSystemVersion+Comparable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5708416292448DA00D42D34 /* OperatingSystemVersion+Comparable.swift */; }; + A82067C42D03E0DE00645C0D /* SemanticVersion in Frameworks */ = {isa = PBXBuildFile; productRef = A82067C32D03E0DE00645C0D /* SemanticVersion */; }; + A8A74EEC2D03F55C001B5CFD /* AltSign-Static in Frameworks */ = {isa = PBXBuildFile; productRef = A8A74EEB2D03F55C001B5CFD /* AltSign-Static */; }; + A8FD915E2D046F5200322782 /* UserInfoValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8FD915D2D046F5200322782 /* UserInfoValue.swift */; }; + A8FD915F2D046F5200322782 /* UserInfoValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8FD915D2D046F5200322782 /* UserInfoValue.swift */; }; + A8FD91602D046F5200322782 /* UserInfoValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8FD915D2D046F5200322782 /* UserInfoValue.swift */; }; + A8FD91652D046FE900322782 /* OpenSSL in Frameworks */ = {isa = PBXBuildFile; productRef = 191E5FDB290AFA5C001A3B7C /* OpenSSL */; }; + A8FD917B2D0472DD00322782 /* DeprecatedAPIs.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8FD917A2D0472DD00322782 /* DeprecatedAPIs.swift */; }; B3146ED2284F581E00BBC3FD /* Roxas.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B3146ECD284F580500BBC3FD /* Roxas.framework */; }; B33FFBA8295F8E98002259E6 /* libfragmentzip.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B343F894295F7F9B002B1159 /* libfragmentzip.a */; }; B33FFBAA295F8F78002259E6 /* preboard.c in Sources */ = {isa = PBXBuildFile; fileRef = B33FFBA9295F8F78002259E6 /* preboard.c */; }; @@ -78,18 +81,16 @@ B343F884295F7C5D002B1159 /* utils.c in Sources */ = {isa = PBXBuildFile; fileRef = B343F87A295F7C5D002B1159 /* utils.c */; }; B343F885295F7C5D002B1159 /* tlv.c in Sources */ = {isa = PBXBuildFile; fileRef = B343F87B295F7C5D002B1159 /* tlv.c */; }; B376FE3E29258C8900E18883 /* OSLog+SideStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = B376FE3D29258C8900E18883 /* OSLog+SideStore.swift */; }; - B39575F5284F29E20080B4FF /* Roxas.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B39575F4284F29E20080B4FF /* Roxas.framework */; }; B39F16132918D7C5002E9404 /* Consts.swift in Sources */ = {isa = PBXBuildFile; fileRef = B39F16122918D7C5002E9404 /* Consts.swift */; }; B39F16152918D7DA002E9404 /* Consts+Proxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = B39F16142918D7DA002E9404 /* Consts+Proxy.swift */; }; - B3C395F1284F2DE700DA9E2F /* KeychainAccess in Frameworks */ = {isa = PBXBuildFile; productRef = B3C395F0284F2DE700DA9E2F /* KeychainAccess */; }; - B3C395F4284F35DD00DA9E2F /* Nuke in Frameworks */ = {isa = PBXBuildFile; productRef = B3C395F3284F35DD00DA9E2F /* Nuke */; }; - B3C395F7284F362400DA9E2F /* AppCenterAnalytics in Frameworks */ = {isa = PBXBuildFile; productRef = B3C395F6284F362400DA9E2F /* AppCenterAnalytics */; }; - B3C395F9284F362400DA9E2F /* AppCenterCrashes in Frameworks */ = {isa = PBXBuildFile; productRef = B3C395F8284F362400DA9E2F /* AppCenterCrashes */; }; B3EE16B62925E27D00B3B1F5 /* AnisetteManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3EE16B52925E27D00B3B1F5 /* AnisetteManager.swift */; }; BD4513AB2C6FA98C0052BCC0 /* AppExtensionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD4513AA2C6FA98C0052BCC0 /* AppExtensionView.swift */; }; BF02419622F2199300129732 /* RefreshAttemptsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF02419522F2199300129732 /* RefreshAttemptsViewController.swift */; }; BF08858322DE795100DE9F1E /* MyAppsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF08858222DE795100DE9F1E /* MyAppsViewController.swift */; }; BF08858522DE7EC800DE9F1E /* UpdateCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF08858422DE7EC800DE9F1E /* UpdateCollectionViewCell.swift */; }; + BF088D332501A4FF008082D9 /* OpenSSL.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF088D322501A4FF008082D9 /* OpenSSL.xcframework */; }; + BF088D342501A4FF008082D9 /* OpenSSL.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = BF088D322501A4FF008082D9 /* OpenSSL.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + BF088D382501A833008082D9 /* OpenSSL.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF088D322501A4FF008082D9 /* OpenSSL.xcframework */; }; BF0C4EBD22A1BD8B009A2DD7 /* AppManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF0C4EBC22A1BD8B009A2DD7 /* AppManager.swift */; }; BF0DCA662433BDF500E3A595 /* AnalyticsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF0DCA652433BDF500E3A595 /* AnalyticsManager.swift */; }; BF10EB34248730750055E6DB /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF10EB33248730750055E6DB /* main.swift */; }; @@ -108,8 +109,6 @@ BF3D64B022E8D4B800E9056B /* AppContentViewControllerCells.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF3D64AF22E8D4B800E9056B /* AppContentViewControllerCells.swift */; }; BF41B806233423AE00C593A3 /* TabBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF41B805233423AE00C593A3 /* TabBarController.swift */; }; BF41B808233433C100C593A3 /* LoadingState.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF41B807233433C100C593A3 /* LoadingState.swift */; }; - BF42345A25101C35006D1EB2 /* WidgetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF42345825101C1D006D1EB2 /* WidgetView.swift */; }; - BF42345C251024B0006D1EB2 /* AltSign-Static in Frameworks */ = {isa = PBXBuildFile; productRef = BF42345B251024B0006D1EB2 /* AltSign-Static */; }; BF42345D25102688006D1EB2 /* OpenSSL.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF088D322501A4FF008082D9 /* OpenSSL.xcframework */; }; BF44EEF0246B08BA002A52F2 /* BackupController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF44EEEF246B08BA002A52F2 /* BackupController.swift */; }; BF44EEFC246B4550002A52F2 /* RemoveAppOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF44EEFB246B4550002A52F2 /* RemoveAppOperation.swift */; }; @@ -264,7 +263,6 @@ BFAECC5E2501B0BF00528F27 /* CFNotificationName+AltStore.h in Headers */ = {isa = PBXBuildFile; fileRef = BF718BC723C919CC00A89F2D /* CFNotificationName+AltStore.h */; settings = {ATTRIBUTES = (Public, ); }; }; BFAECC5F2501B0BF00528F27 /* ALTConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = BFD52BD222A06EFB000B7ED1 /* ALTConstants.h */; settings = {ATTRIBUTES = (Public, ); }; }; BFAECC602501B0BF00528F27 /* NSError+ALTServerError.h in Headers */ = {isa = PBXBuildFile; fileRef = BF1E314822A060F400370A3C /* NSError+ALTServerError.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BFB39B5C252BC10E00D1BE50 /* Managed.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFB39B5B252BC10E00D1BE50 /* Managed.swift */; }; BFB4323F22DE852000B7F8BC /* UpdateCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BFB4323E22DE852000B7F8BC /* UpdateCollectionViewCell.xib */; }; BFB6B21E231870160022A802 /* NewsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFB6B21D231870160022A802 /* NewsViewController.swift */; }; BFB6B220231870B00022A802 /* NewsCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFB6B21F231870B00022A802 /* NewsCollectionViewCell.swift */; }; @@ -307,16 +305,6 @@ BFE60742231B07E6002B0E8E /* SettingsHeaderFooterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFE60741231B07E6002B0E8E /* SettingsHeaderFooterView.swift */; }; BFE6325A22A83BEB00F30809 /* Authentication.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = BFE6325922A83BEB00F30809 /* Authentication.storyboard */; }; BFE6326C22A86FF300F30809 /* AuthenticationOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFE6326B22A86FF300F30809 /* AuthenticationOperation.swift */; }; - BFE972E3260A8B2700D0BDAC /* NSError+libimobiledevice.mm in Sources */ = {isa = PBXBuildFile; fileRef = BFE972E2260A8B2700D0BDAC /* NSError+libimobiledevice.mm */; }; - BFECAC7F24FD950B0077C41F /* CodableError.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFD44605241188C300EAB90A /* CodableError.swift */; }; - BFECAC8024FD950B0077C41F /* ConnectionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF18BFF22485828200DD5981 /* ConnectionManager.swift */; }; - BFECAC8124FD950B0077C41F /* ALTServerError+Conveniences.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFF767CB2489AB5C0097E58C /* ALTServerError+Conveniences.swift */; }; - BFECAC8224FD950B0077C41F /* ServerProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF1E3128229F474900370A3C /* ServerProtocol.swift */; }; - BFECAC8324FD950B0077C41F /* NetworkConnection.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFF767CD2489ABE90097E58C /* NetworkConnection.swift */; }; - BFECAC8424FD950B0077C41F /* ALTConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = BF718BD723C93DB700A89F2D /* ALTConstants.m */; }; - BFECAC8524FD950B0077C41F /* Connection.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF18BFF624858BDE00DD5981 /* Connection.swift */; }; - BFECAC8624FD950B0077C41F /* Result+Conveniences.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFBAC8852295C90300587369 /* Result+Conveniences.swift */; }; - BFECAC8724FD950B0077C41F /* Bundle+AltStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF1E314122A05D4C00370A3C /* Bundle+AltStore.swift */; }; BFECAC8824FD950E0077C41F /* CodableError.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFD44605241188C300EAB90A /* CodableError.swift */; }; BFECAC8924FD950E0077C41F /* ConnectionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF18BFF22485828200DD5981 /* ConnectionManager.swift */; }; BFECAC8A24FD950E0077C41F /* ALTServerError+Conveniences.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFF767CB2489AB5C0097E58C /* ALTServerError+Conveniences.swift */; }; @@ -339,7 +327,6 @@ BFF0B69A2322D7D0007A79E1 /* UIScreen+CompactHeight.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFF0B6992322D7D0007A79E1 /* UIScreen+CompactHeight.swift */; }; BFF435D8255CBDAB00DD724F /* ALTApplication+AltStoreApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFF435D7255CBDAB00DD724F /* ALTApplication+AltStoreApp.swift */; }; BFF615A82510042B00484D3B /* AltStoreCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF66EE7E2501AE50007EE018 /* AltStoreCore.framework */; }; - BFF7C9342578492100E55F36 /* ALTAnisetteData.m in Sources */ = {isa = PBXBuildFile; fileRef = BFB49AA823834CF900D542D9 /* ALTAnisetteData.m */; }; D50107EC2ADF2E1A0069F2A1 /* AddSourceTextFieldCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D50107EB2ADF2E1A0069F2A1 /* AddSourceTextFieldCell.swift */; }; D5084CCC2B1EA80100C02160 /* FeaturedComponents.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5084CCB2B1EA80100C02160 /* FeaturedComponents.swift */; }; D513F6162A12CE4E0061EAA1 /* SourceError.swift in Sources */ = {isa = PBXBuildFile; fileRef = D571ADCD2A02FA7400B24B63 /* SourceError.swift */; }; @@ -351,29 +338,20 @@ D5177B0D2A26944600270065 /* AltStore12ToAltStore13.xcmappingmodel in Sources */ = {isa = PBXBuildFile; fileRef = D5177B0C2A26944600270065 /* AltStore12ToAltStore13.xcmappingmodel */; }; D5185B802AE1E51B00646E33 /* AltStore13ToAltStore14.xcmappingmodel in Sources */ = {isa = PBXBuildFile; fileRef = D5185B7F2AE1E51B00646E33 /* AltStore13ToAltStore14.xcmappingmodel */; }; D5185B822AE1E71D00646E33 /* Source13To14MigrationPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5185B812AE1E71D00646E33 /* Source13To14MigrationPolicy.swift */; }; - D5189C012A01BC6800F44625 /* UserInfoValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5189C002A01BC6800F44625 /* UserInfoValue.swift */; }; - D5189C022A01BC6800F44625 /* UserInfoValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5189C002A01BC6800F44625 /* UserInfoValue.swift */; }; D519AD46292D665B004B12F9 /* Managed.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFB39B5B252BC10E00D1BE50 /* Managed.swift */; }; - D51AD27E29356B7B00967AAA /* ALTWrappedError.h in Headers */ = {isa = PBXBuildFile; fileRef = D51AD27C29356B7B00967AAA /* ALTWrappedError.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D51AD27F29356B7B00967AAA /* ALTWrappedError.m in Sources */ = {isa = PBXBuildFile; fileRef = D51AD27D29356B7B00967AAA /* ALTWrappedError.m */; }; - D51AD28029356B8000967AAA /* ALTWrappedError.m in Sources */ = {isa = PBXBuildFile; fileRef = D51AD27D29356B7B00967AAA /* ALTWrappedError.m */; }; D51E83822B8692DF0092FC61 /* AltStore16ToAltStore17.xcmappingmodel in Sources */ = {isa = PBXBuildFile; fileRef = D51E83812B8692DF0092FC61 /* AltStore16ToAltStore17.xcmappingmodel */; }; D52A2F972ACB40F700BDF8E3 /* Logger+AltStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = D52A2F962ACB40F700BDF8E3 /* Logger+AltStore.swift */; }; D52B4ABF2AF183F0005991C3 /* WebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D52B4ABE2AF183F0005991C3 /* WebViewController.swift */; }; D52C08EE28AEC37A006C4AE5 /* AppVersion.swift in Sources */ = {isa = PBXBuildFile; fileRef = D52C08ED28AEC37A006C4AE5 /* AppVersion.swift */; }; D52C8F012AFC144C00CA0BDD /* FeaturedViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D52C8F002AFC144C00CA0BDD /* FeaturedViewController.swift */; }; D52C8F032AFC56F000CA0BDD /* StoreCategory.swift in Sources */ = {isa = PBXBuildFile; fileRef = D52C8F022AFC56F000CA0BDD /* StoreCategory.swift */; }; - D52DD35E2AAA89A600A7F2B6 /* AltSign-Dynamic in Frameworks */ = {isa = PBXBuildFile; productRef = D52DD35D2AAA89A600A7F2B6 /* AltSign-Dynamic */; }; D52EF2BE2A0594550096C377 /* AppDetailCollectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D52EF2BD2A0594550096C377 /* AppDetailCollectionViewController.swift */; }; D533E8B72727841800A9B5DD /* libAppleArchive.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = D533E8B62727841800A9B5DD /* libAppleArchive.tbd */; settings = {ATTRIBUTES = (Weak, ); }; }; D533E8BE2727BBF800A9B5DD /* libcurl.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D533E8BD2727BBF800A9B5DD /* libcurl.a */; }; - D537C8592AA94D94009A1E08 /* altjit in Embed AltJIT */ = {isa = PBXBuildFile; fileRef = D5FB7A132AA284BE00EF863D /* altjit */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; - D537C85B2AA9507A009A1E08 /* libcorecrypto.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = D537C85A2AA95066009A1E08 /* libcorecrypto.tbd */; platformFilters = (macos, ); }; D5390C3C2AC3A43900D17E62 /* AddSourceViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5390C3B2AC3A43900D17E62 /* AddSourceViewController.swift */; }; D53D84022A2158FC00543C3B /* Permissions.plist in Resources */ = {isa = PBXBuildFile; fileRef = D53D84012A2158FC00543C3B /* Permissions.plist */; }; D54058B92A1D6269008CCC58 /* AppPermissionProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = D54058B82A1D6269008CCC58 /* AppPermissionProtocol.swift */; }; D54058BB2A1D8FE3008CCC58 /* UIColor+AltStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = D54058BA2A1D8FE3008CCC58 /* UIColor+AltStore.swift */; }; - D540E93828EE1BDE000F1B0F /* ErrorDetailsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D540E93728EE1BDE000F1B0F /* ErrorDetailsViewController.swift */; }; D5418F172AD740890014ABD6 /* AppScreenshotCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5418F162AD740890014ABD6 /* AppScreenshotCollectionViewCell.swift */; }; D54DED1428CBC44B008B27A0 /* ErrorLogTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D54DED1328CBC44B008B27A0 /* ErrorLogTableViewCell.swift */; }; D552B1D82A042A740066216F /* AppPermissionsCard.swift in Sources */ = {isa = PBXBuildFile; fileRef = D552B1D72A042A740066216F /* AppPermissionsCard.swift */; }; @@ -384,15 +362,10 @@ D557A4832AE85DB7007D0DCF /* PledgeReward.swift in Sources */ = {isa = PBXBuildFile; fileRef = D557A4822AE85DB7007D0DCF /* PledgeReward.swift */; }; D557A4852AE88227007D0DCF /* PledgeTier.swift in Sources */ = {isa = PBXBuildFile; fileRef = D557A4842AE88227007D0DCF /* PledgeTier.swift */; }; D561AF822B21669400BF59C6 /* VerifyAppPledgeOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D561AF812B21669400BF59C6 /* VerifyAppPledgeOperation.swift */; }; - D561B2EB28EF5A4F006752E4 /* AltSign-Dynamic in Frameworks */ = {isa = PBXBuildFile; productRef = D561B2EA28EF5A4F006752E4 /* AltSign-Dynamic */; }; - D561B2ED28EF5A4F006752E4 /* AltSign-Dynamic in Embed Frameworks */ = {isa = PBXBuildFile; productRef = D561B2EA28EF5A4F006752E4 /* AltSign-Dynamic */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; D56915072AD5E91B00A2B747 /* Regex+Permissions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D56915052AD5D75B00A2B747 /* Regex+Permissions.swift */; }; - D56915092AD5F3E800A2B747 /* AltTests+Sources.swift in Sources */ = {isa = PBXBuildFile; fileRef = D56915082AD5F3E800A2B747 /* AltTests+Sources.swift */; }; D569A5042AF9BC5F00A4CB8B /* ReviewPermissionsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D569A5032AF9BC5F00A4CB8B /* ReviewPermissionsViewController.swift */; }; D56D21402B7D9942007641C5 /* AltAppIconsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D56D213F2B7D9942007641C5 /* AltAppIconsViewController.swift */; }; D56D21422B7D9C41007641C5 /* AltIcons.plist in Resources */ = {isa = PBXBuildFile; fileRef = D56D21412B7D9C41007641C5 /* AltIcons.plist */; }; - D5708417292448DA00D42D34 /* OperatingSystemVersion+Comparable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5708416292448DA00D42D34 /* OperatingSystemVersion+Comparable.swift */; }; - D570841A2924680D00D42D34 /* OperatingSystemVersion+Comparable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5708416292448DA00D42D34 /* OperatingSystemVersion+Comparable.swift */; }; D571ADD02A02FC7200B24B63 /* ALTAppPermission.swift in Sources */ = {isa = PBXBuildFile; fileRef = D571ADCF2A02FC7200B24B63 /* ALTAppPermission.swift */; }; D5728CA72A0D79D30014E73C /* OptionalProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5728CA62A0D79D30014E73C /* OptionalProtocol.swift */; }; D5753A622B279F1900090456 /* AltStore14ToAltStore15.xcmappingmodel in Sources */ = {isa = PBXBuildFile; fileRef = D5753A612B279F1900090456 /* AltStore14ToAltStore15.xcmappingmodel */; }; @@ -404,12 +377,8 @@ D57F2C9126E0070200B9FA39 /* EnableJITOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D57F2C9026E0070200B9FA39 /* EnableJITOperation.swift */; }; D57F2C9426E01BC700B9FA39 /* UIDevice+Vibration.swift in Sources */ = {isa = PBXBuildFile; fileRef = D57F2C9326E01BC700B9FA39 /* UIDevice+Vibration.swift */; }; D57FE84428C7DB7100216002 /* ErrorLogViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D57FE84328C7DB7100216002 /* ErrorLogViewController.swift */; }; - D58032EE2AB241D100878F5E /* AnisetteError.swift in Sources */ = {isa = PBXBuildFile; fileRef = D58032ED2AB241D100878F5E /* AnisetteError.swift */; }; - D58032F02AB2429D00878F5E /* ProcessInfo+Device.swift in Sources */ = {isa = PBXBuildFile; fileRef = D58032EF2AB2429D00878F5E /* ProcessInfo+Device.swift */; }; - D586D39B28EF58B0000E101F /* AltTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D586D39A28EF58B0000E101F /* AltTests.swift */; }; D58916FE28C7C55C00E39C8B /* LoggedError.swift in Sources */ = {isa = PBXBuildFile; fileRef = D58916FD28C7C55C00E39C8B /* LoggedError.swift */; }; D5893F802A1419E800E767CD /* NSManagedObjectContext+Conveniences.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5893F7E2A14183200E767CD /* NSManagedObjectContext+Conveniences.swift */; }; - D58D5F2E26DFE68E00E55E38 /* LaunchAtLogin in Frameworks */ = {isa = PBXBuildFile; productRef = D58D5F2D26DFE68E00E55E38 /* LaunchAtLogin */; }; D59162AB29BA60A9005CBF47 /* SourceHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D59162AA29BA60A9005CBF47 /* SourceHeaderView.swift */; }; D59162AD29BA616A005CBF47 /* SourceHeaderView.xib in Resources */ = {isa = PBXBuildFile; fileRef = D59162AC29BA616A005CBF47 /* SourceHeaderView.xib */; }; D5927D6629DCC89000D6898E /* UINavigationBarAppearance+TintColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5927D6529DCC89000D6898E /* UINavigationBarAppearance+TintColor.swift */; }; @@ -417,46 +386,26 @@ D5935AED29C39DE300C157EF /* SourceComponents.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5935AEC29C39DE300C157EF /* SourceComponents.swift */; }; D5935AEF29C3B23600C157EF /* Sources.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D5935AEE29C3B23600C157EF /* Sources.storyboard */; }; D593F1942717749A006E82DE /* PatchAppOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D593F1932717749A006E82DE /* PatchAppOperation.swift */; }; - D59A6B7B2AA91B8E00F61259 /* PythonCommand.swift in Sources */ = {isa = PBXBuildFile; fileRef = D59A6B7A2AA91B8E00F61259 /* PythonCommand.swift */; }; - D59A6B7F2AA9226C00F61259 /* AppProcess.swift in Sources */ = {isa = PBXBuildFile; fileRef = D59A6B7D2AA9226C00F61259 /* AppProcess.swift */; }; - D59A6B822AA92D1C00F61259 /* Process+Conveniences.swift in Sources */ = {isa = PBXBuildFile; fileRef = D59A6B802AA92D1C00F61259 /* Process+Conveniences.swift */; }; - D59A6B842AA932F700F61259 /* Logger+AltServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D59A6B832AA932F700F61259 /* Logger+AltServer.swift */; }; D5A0537329B91DB400997551 /* SourceDetailContentViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5A0537229B91DB400997551 /* SourceDetailContentViewController.swift */; }; - D5A1D2E42AA50EB60066CACC /* JITError.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5A1D2E32AA50EB60066CACC /* JITError.swift */; }; - D5A1D2E92AA512940066CACC /* RemoteServiceDiscoveryTunnel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5A1D2E82AA512940066CACC /* RemoteServiceDiscoveryTunnel.swift */; }; - D5A1D2EB2AA513410066CACC /* URL+Tools.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5A1D2EA2AA513410066CACC /* URL+Tools.swift */; }; - D5A1D2EC2AA51D490066CACC /* ProcessError.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5FB7A1B2AA284ED00EF863D /* ProcessError.swift */; }; - D5A2193429B14F94002229FC /* DeprecatedAPIs.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5A2193329B14F94002229FC /* DeprecatedAPIs.swift */; }; - D5A299862AAB9E4E00A3988D /* Process+Conveniences.swift in Sources */ = {isa = PBXBuildFile; fileRef = D59A6B802AA92D1C00F61259 /* Process+Conveniences.swift */; }; - D5A299872AAB9E4E00A3988D /* ProcessError.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5FB7A1B2AA284ED00EF863D /* ProcessError.swift */; }; - D5A299882AAB9E4E00A3988D /* JITError.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5A1D2E32AA50EB60066CACC /* JITError.swift */; }; - D5A299892AAB9E5900A3988D /* AppProcess.swift in Sources */ = {isa = PBXBuildFile; fileRef = D59A6B7D2AA9226C00F61259 /* AppProcess.swift */; }; D5A645212AF591980047D980 /* UTType+AltStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5A645202AF591980047D980 /* UTType+AltStore.swift */; }; D5A645232AF5B5C50047D980 /* PatreonAPI+Responses.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5A645222AF5B5C50047D980 /* PatreonAPI+Responses.swift */; }; D5A645252AF5BC7F0047D980 /* UserAccount.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5A645242AF5BC7F0047D980 /* UserAccount.swift */; }; D5ACE84528E3B8450021CAB9 /* ClearAppCacheOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5ACE84428E3B8450021CAB9 /* ClearAppCacheOperation.swift */; }; D5B6F6A92AD75D01007EED5A /* ProcessInfo+Previews.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5B6F6A82AD75D01007EED5A /* ProcessInfo+Previews.swift */; }; D5B6F6AB2AD76541007EED5A /* PreviewAppScreenshotsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5B6F6AA2AD76541007EED5A /* PreviewAppScreenshotsViewController.swift */; }; - D5BA9E9B2A9FE1E8007C0661 /* JITManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5BA9E9A2A9FE1E8007C0661 /* JITManager.swift */; }; D5C0E7672AD9C75900530CA4 /* AppCardCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5C0E7662AD9C75900530CA4 /* AppCardCollectionViewCell.swift */; }; - D5C8ACDB2A956B2B00669F92 /* Process+STPrivilegedTask.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5C8ACDA2A956B2B00669F92 /* Process+STPrivilegedTask.swift */; }; D5CA0C4B280E141900469595 /* ManagedPatron.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5CA0C4A280E141900469595 /* ManagedPatron.swift */; }; D5CA0C4E280E249E00469595 /* AltStore9ToAltStore10.xcmappingmodel in Sources */ = {isa = PBXBuildFile; fileRef = D5CA0C4D280E249E00469595 /* AltStore9ToAltStore10.xcmappingmodel */; }; D5CD805D29CA2C1E00E591B0 /* HeaderContentViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5CD805C29CA2C1E00E591B0 /* HeaderContentViewController.swift */; }; D5CD805F29CA755E00E591B0 /* SourceDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5CD805E29CA755E00E591B0 /* SourceDetailViewController.swift */; }; D5CE309C2B4C946300DB8151 /* AltStore15ToAltStore16.xcmappingmodel in Sources */ = {isa = PBXBuildFile; fileRef = D5CE309B2B4C946300DB8151 /* AltStore15ToAltStore16.xcmappingmodel */; }; - D5CF568C2A0D8EEC006D93E2 /* VerificationError.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5CF56812A0D83F9006D93E2 /* VerificationError.swift */; }; D5DAE0962804DF430034D8D4 /* UpdatePatronsOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5DAE0952804DF430034D8D4 /* UpdatePatronsOperation.swift */; }; - D5DB145A28F9DC5A00A8F606 /* ALTLocalizedError.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5DB145828F9DC1000A8F606 /* ALTLocalizedError.swift */; }; - D5DB145B28F9DC5C00A8F606 /* ALTLocalizedError.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5DB145828F9DC1000A8F606 /* ALTLocalizedError.swift */; }; D5DB81642B0410BC003F5F8B /* AppSorting.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5DB81632B0410BC003F5F8B /* AppSorting.swift */; }; D5E1E7C128077DE90016FC96 /* UpdateKnownSourcesOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5E1E7C028077DE90016FC96 /* UpdateKnownSourcesOperation.swift */; }; D5E3FB9828FDFAD90034B72C /* NSError+AltStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF6C336124197D700034FD24 /* NSError+AltStore.swift */; }; D5F2F6A92720B7C20081CCF5 /* PatchViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5F2F6A82720B7C20081CCF5 /* PatchViewController.swift */; }; D5F48B4829CCF21B002B52A4 /* AltStore+Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5F48B4729CCF21B002B52A4 /* AltStore+Async.swift */; }; D5F48B4C29CD0C48002B52A4 /* AsyncManaged.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5F48B4929CD0B67002B52A4 /* AsyncManaged.swift */; }; - D5F5AF2E28FDD2EC00C938F5 /* TestErrors.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5F5AF2D28FDD2EC00C938F5 /* TestErrors.swift */; }; - D5F5AF7D28ECEA990067C736 /* ErrorDetailsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5F5AF7C28ECEA990067C736 /* ErrorDetailsViewController.swift */; }; D5F9821D2AB900060045751F /* AppScreenshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5F9821C2AB900060045751F /* AppScreenshot.swift */; }; D5F982212AB910180045751F /* AppScreenshotsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5F982202AB910180045751F /* AppScreenshotsViewController.swift */; }; D5F99A1828D11DB500476A16 /* AltStore10ToAltStore11.xcmappingmodel in Sources */ = {isa = PBXBuildFile; fileRef = D5F99A1728D11DB500476A16 /* AltStore10ToAltStore11.xcmappingmodel */; }; @@ -464,30 +413,12 @@ D5FB28EC2ADDF68D00A1C337 /* UIFontDescriptor+Bold.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5FB28EB2ADDF68D00A1C337 /* UIFontDescriptor+Bold.swift */; }; D5FB28EE2ADDF89800A1C337 /* KnownSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5893F812A141E4900E767CD /* KnownSource.swift */; }; D5FB7A0E2AA25A4E00EF863D /* Previews.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D5FB7A0D2AA25A4E00EF863D /* Previews.xcassets */; }; - D5FB7A212AA284ED00EF863D /* EnableJIT.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5FB7A1A2AA284ED00EF863D /* EnableJIT.swift */; }; - D5FB7A242AA284ED00EF863D /* Logger+AltJIT.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5FB7A1D2AA284ED00EF863D /* Logger+AltJIT.swift */; }; - D5FB7A252AA284ED00EF863D /* AltJIT.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5FB7A1E2AA284ED00EF863D /* AltJIT.swift */; }; - D5FB7A262AA284ED00EF863D /* MountDisk.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5FB7A1F2AA284ED00EF863D /* MountDisk.swift */; }; - D5FB7A272AA284ED00EF863D /* Task+Timeout.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5FB7A202AA284ED00EF863D /* Task+Timeout.swift */; }; - D5FB7A2A2AA2854100EF863D /* ALTLocalizedError.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5DB145828F9DC1000A8F606 /* ALTLocalizedError.swift */; }; - D5FB7A2B2AA2854400EF863D /* UserInfoValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5189C002A01BC6800F44625 /* UserInfoValue.swift */; }; - D5FB7A2E2AA2859400EF863D /* ArgumentParser in Frameworks */ = {isa = PBXBuildFile; productRef = D5FB7A2D2AA2859400EF863D /* ArgumentParser */; }; - D5FB7A312AA28A2900EF863D /* NSError+AltStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF6C336124197D700034FD24 /* NSError+AltStore.swift */; }; - D5FB7A322AA28A4000EF863D /* ALTWrappedError.m in Sources */ = {isa = PBXBuildFile; fileRef = D51AD27D29356B7B00967AAA /* ALTWrappedError.m */; }; - D5FB7A392AA28D8300EF863D /* NSError+ALTServerError.m in Sources */ = {isa = PBXBuildFile; fileRef = BF1E314922A060F400370A3C /* NSError+ALTServerError.m */; }; D5FD4EC52A952EAD0097BEE8 /* AltWidgetBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5FD4EC42A952EAD0097BEE8 /* AltWidgetBundle.swift */; }; D5FD4EC92A9530C00097BEE8 /* AppSnapshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5FD4EC82A9530C00097BEE8 /* AppSnapshot.swift */; }; D5FD4ECB2A9532960097BEE8 /* DatabaseManager+Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5FD4ECA2A9532960097BEE8 /* DatabaseManager+Async.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 19104D932909BADB00C49C7B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFD247622284B9A500981D42 /* Project object */; - proxyType = 1; - remoteGlobalIDString = BF45872A2298D31600BD7491; - remoteInfo = libimobiledevice; - }; 19104DB92909C0F200C49C7B /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFD247622284B9A500981D42 /* Project object */; @@ -607,13 +538,6 @@ remoteGlobalIDString = BF66EE7D2501AE50007EE018; remoteInfo = AltStoreCore; }; - D537C8562AA94D4A009A1E08 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFD247622284B9A500981D42 /* Project object */; - proxyType = 1; - remoteGlobalIDString = D5FB7A122AA284BE00EF863D; - remoteInfo = AltJIT; - }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -624,12 +548,13 @@ dstSubfolderSpec = 10; files = ( BF1614F2250822F100767AEA /* Roxas.framework in Embed Frameworks */, + BF088D342501A4FF008082D9 /* OpenSSL.xcframework in Embed Frameworks */, BF66EE862501AE50007EE018 /* AltStoreCore.framework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; - BF98917B250AABF4002ACF50 /* Embed App Extensions */ = { + BF98917B250AABF4002ACF50 /* Embed Foundation Extensions */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; @@ -640,58 +565,6 @@ name = "Embed Foundation Extensions"; runOnlyForDeploymentPostprocessing = 0; }; - BFF7C910257844C900E55F36 /* Embed XPC Services */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = "$(CONTENTS_FOLDER_PATH)/XPCServices"; - dstSubfolderSpec = 16; - files = ( - BFF7C90F257844C900E55F36 /* AltXPC.xpc in Embed XPC Services */, - ); - name = "Embed XPC Services"; - runOnlyForDeploymentPostprocessing = 0; - }; - D52DD3602AAA89A700A7F2B6 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; - D537C8582AA94D60009A1E08 /* Embed AltJIT */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 6; - files = ( - D537C8592AA94D94009A1E08 /* altjit in Embed AltJIT */, - ); - name = "Embed AltJIT"; - runOnlyForDeploymentPostprocessing = 0; - }; - D561B2EC28EF5A4F006752E4 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - D561B2ED28EF5A4F006752E4 /* AltSign-Dynamic in Embed Frameworks */, - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; - D5FB7A112AA284BE00EF863D /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = /usr/share/man/man1/; - dstSubfolderSpec = 0; - files = ( - ); - runOnlyForDeploymentPostprocessing = 1; - }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ @@ -743,10 +616,17 @@ 19104DB42909C06D00C49C7B /* EmotionalDamage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmotionalDamage.swift; sourceTree = ""; }; 191E5FAB290A5D92001A3B7C /* libminimuxer.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libminimuxer.a; sourceTree = BUILT_PRODUCTS_DIR; }; 19B9B7442845E6DF0076EF69 /* SelectTeamViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectTeamViewController.swift; sourceTree = ""; }; + 6D1CADCE97AF931337C66730 /* Pods-AltStoreCore.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AltStoreCore.release.xcconfig"; path = "Target Support Files/Pods-AltStoreCore/Pods-AltStoreCore.release.xcconfig"; sourceTree = ""; }; + 941BDBA6EC0212BC1DCBA3F9 /* Pods_SideStore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_SideStore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 9932E27A2170D2226ABFA4B6 /* Pods_AltStoreCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_AltStoreCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9961EC2D29BE9F2E00AF2C6F /* minimuxer-helpers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "minimuxer-helpers.swift"; path = "Dependencies/minimuxer/minimuxer-helpers.swift"; sourceTree = SOURCE_ROOT; }; 99F87D1629D8E4C900B40039 /* SwiftBridgeCore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SwiftBridgeCore.swift; path = Dependencies/minimuxer/SwiftBridgeCore.swift; sourceTree = SOURCE_ROOT; }; 99F87D1729D8E4C900B40039 /* minimuxer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = minimuxer.swift; path = Dependencies/minimuxer/minimuxer.swift; sourceTree = SOURCE_ROOT; }; + 9ACEAECC253184BCA8E3E068 /* Pods-SideStore.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SideStore.release.xcconfig"; path = "Target Support Files/Pods-SideStore/Pods-SideStore.release.xcconfig"; sourceTree = ""; }; A800F7032CE28E2F00208744 /* View+AltWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+AltWidget.swift"; sourceTree = ""; }; + A8FD915B2D046EF100322782 /* ProcessError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProcessError.swift; sourceTree = ""; }; + A8FD915D2D046F5200322782 /* UserInfoValue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserInfoValue.swift; sourceTree = ""; }; + A8FD917A2D0472DD00322782 /* DeprecatedAPIs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeprecatedAPIs.swift; sourceTree = ""; }; B3146EC6284F580500BBC3FD /* Roxas.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Roxas.xcodeproj; path = Dependencies/Roxas/Roxas.xcodeproj; sourceTree = ""; }; B33FFBA9295F8F78002259E6 /* preboard.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = preboard.c; path = src/preboard.c; sourceTree = ""; }; B33FFBAB295F8F98002259E6 /* companion_proxy.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = companion_proxy.c; path = src/companion_proxy.c; sourceTree = ""; }; @@ -764,7 +644,6 @@ B343F87B295F7C5D002B1159 /* tlv.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = tlv.c; sourceTree = ""; }; B343F886295F7F9B002B1159 /* libfragmentzip.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = libfragmentzip.xcodeproj; path = Dependencies/libfragmentzip/libfragmentzip.xcodeproj; sourceTree = ""; }; B376FE3D29258C8900E18883 /* OSLog+SideStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "OSLog+SideStore.swift"; sourceTree = ""; }; - B39575F4284F29E20080B4FF /* Roxas.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Roxas.framework; sourceTree = BUILT_PRODUCTS_DIR; }; B39F16122918D7C5002E9404 /* Consts.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Consts.swift; sourceTree = ""; }; B39F16142918D7DA002E9404 /* Consts+Proxy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Consts+Proxy.swift"; sourceTree = ""; }; B3C39606284F4C8400DA9E2F /* CodeSigning.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = CodeSigning.xcconfig; sourceTree = ""; }; @@ -779,6 +658,7 @@ BF02419522F2199300129732 /* RefreshAttemptsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RefreshAttemptsViewController.swift; sourceTree = ""; }; BF08858222DE795100DE9F1E /* MyAppsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyAppsViewController.swift; sourceTree = ""; }; BF08858422DE7EC800DE9F1E /* UpdateCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdateCollectionViewCell.swift; sourceTree = ""; }; + BF088D322501A4FF008082D9 /* OpenSSL.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = OpenSSL.xcframework; path = Dependencies/AltSign/Dependencies/OpenSSL/Frameworks/OpenSSL.xcframework; sourceTree = ""; }; BF0C4EBC22A1BD8B009A2DD7 /* AppManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppManager.swift; sourceTree = ""; }; BF0DCA652433BDF500E3A595 /* AnalyticsManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnalyticsManager.swift; sourceTree = ""; }; BF10EB33248730750055E6DB /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; }; @@ -960,11 +840,6 @@ BF9ABA4A22DD137F008935CF /* NavigationBar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NavigationBar.swift; sourceTree = ""; }; BF9ABA4C22DD16DE008935CF /* PillButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PillButton.swift; sourceTree = ""; }; BFA8172A23C5633D001B5953 /* FetchAnisetteDataOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchAnisetteDataOperation.swift; sourceTree = ""; }; - BFAD678C25E0649500D4C4D1 /* ALTDebugConnection.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ALTDebugConnection.h; sourceTree = ""; }; - BFAD678D25E0649500D4C4D1 /* ALTDebugConnection.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = ALTDebugConnection.mm; sourceTree = ""; }; - BFAD679525E064D400D4C4D1 /* ALTDebugConnection+Private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ALTDebugConnection+Private.h"; sourceTree = ""; }; - BFAD67A225E0854500D4C4D1 /* DeveloperDiskManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeveloperDiskManager.swift; sourceTree = ""; }; - BFB364592325985F00CD0EB1 /* FindServerOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FindServerOperation.swift; sourceTree = ""; }; BFB39B5B252BC10E00D1BE50 /* Managed.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Managed.swift; sourceTree = ""; }; BFB4323E22DE852000B7F8BC /* UpdateCollectionViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = UpdateCollectionViewCell.xib; sourceTree = ""; }; BFB6B21D231870160022A802 /* NewsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewsViewController.swift; sourceTree = ""; }; @@ -1027,12 +902,8 @@ BFF435D7255CBDAB00DD724F /* ALTApplication+AltStoreApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ALTApplication+AltStoreApp.swift"; sourceTree = ""; }; BFF767CB2489AB5C0097E58C /* ALTServerError+Conveniences.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ALTServerError+Conveniences.swift"; sourceTree = ""; }; BFF767CD2489ABE90097E58C /* NetworkConnection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkConnection.swift; sourceTree = ""; }; - BFF7C906257844C900E55F36 /* AltXPCProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AltXPCProtocol.h; sourceTree = ""; }; BFF7EC4C25081E9300BDE521 /* AltStore 8.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "AltStore 8.xcdatamodel"; sourceTree = ""; }; BFFCFA45248835530077BFCE /* AltDaemon.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = AltDaemon.entitlements; sourceTree = ""; }; - D52C08ED28AEC37A006C4AE5 /* AppVersion.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppVersion.swift; sourceTree = ""; }; - D52E988928D002D30032BE6B /* AltStore 11.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "AltStore 11.xcdatamodel"; sourceTree = ""; }; - C9EEAA842DA87A88A870053B /* Pods_AltStore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_AltStore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D50107EB2ADF2E1A0069F2A1 /* AddSourceTextFieldCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddSourceTextFieldCell.swift; sourceTree = ""; }; D5084CCB2B1EA80100C02160 /* FeaturedComponents.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeaturedComponents.swift; sourceTree = ""; }; D5144BA72B8684EF00738A5C /* Icons.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Icons.xcassets; sourceTree = ""; }; @@ -1043,9 +914,6 @@ D5185B7E2AE1E35200646E33 /* AltStore 14.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "AltStore 14.xcdatamodel"; sourceTree = ""; }; D5185B7F2AE1E51B00646E33 /* AltStore13ToAltStore14.xcmappingmodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcmappingmodel; path = AltStore13ToAltStore14.xcmappingmodel; sourceTree = ""; }; D5185B812AE1E71D00646E33 /* Source13To14MigrationPolicy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Source13To14MigrationPolicy.swift; sourceTree = ""; }; - D5189C002A01BC6800F44625 /* UserInfoValue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserInfoValue.swift; sourceTree = ""; }; - D51AD27C29356B7B00967AAA /* ALTWrappedError.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ALTWrappedError.h; sourceTree = ""; }; - D51AD27D29356B7B00967AAA /* ALTWrappedError.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ALTWrappedError.m; sourceTree = ""; }; D51E83802B86926B0092FC61 /* AltStore 17.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "AltStore 17.xcdatamodel"; sourceTree = ""; }; D51E83812B8692DF0092FC61 /* AltStore16ToAltStore17.xcmappingmodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcmappingmodel; path = AltStore16ToAltStore17.xcmappingmodel; sourceTree = ""; }; D52A2F962ACB40F700BDF8E3 /* Logger+AltStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Logger+AltStore.swift"; sourceTree = ""; }; @@ -1064,7 +932,6 @@ D53D84012A2158FC00543C3B /* Permissions.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Permissions.plist; sourceTree = ""; }; D54058B82A1D6269008CCC58 /* AppPermissionProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppPermissionProtocol.swift; sourceTree = ""; }; D54058BA2A1D8FE3008CCC58 /* UIColor+AltStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIColor+AltStore.swift"; sourceTree = ""; }; - D540E93728EE1BDE000F1B0F /* ErrorDetailsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorDetailsViewController.swift; sourceTree = ""; }; D5418F162AD740890014ABD6 /* AppScreenshotCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppScreenshotCollectionViewCell.swift; sourceTree = ""; }; D54DED1328CBC44B008B27A0 /* ErrorLogTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorLogTableViewCell.swift; sourceTree = ""; }; D552B1D72A042A740066216F /* AppPermissionsCard.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppPermissionsCard.swift; sourceTree = ""; }; @@ -1095,7 +962,6 @@ D57F2C9026E0070200B9FA39 /* EnableJITOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EnableJITOperation.swift; sourceTree = ""; }; D57F2C9326E01BC700B9FA39 /* UIDevice+Vibration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIDevice+Vibration.swift"; sourceTree = ""; }; D57FE84328C7DB7100216002 /* ErrorLogViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorLogViewController.swift; sourceTree = ""; }; - D58032ED2AB241D100878F5E /* AnisetteError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnisetteError.swift; sourceTree = ""; }; D58032EF2AB2429D00878F5E /* ProcessInfo+Device.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ProcessInfo+Device.swift"; sourceTree = ""; }; D581822C2A218A140087965B /* AltStore 13.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "AltStore 13.xcdatamodel"; sourceTree = ""; }; D586D39828EF58B0000E101F /* AltTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AltTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -1111,22 +977,16 @@ D5935AEC29C39DE300C157EF /* SourceComponents.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceComponents.swift; sourceTree = ""; }; D5935AEE29C3B23600C157EF /* Sources.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Sources.storyboard; sourceTree = ""; }; D593F1932717749A006E82DE /* PatchAppOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PatchAppOperation.swift; sourceTree = ""; }; - D59A6B7A2AA91B8E00F61259 /* PythonCommand.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PythonCommand.swift; sourceTree = ""; }; D59A6B7D2AA9226C00F61259 /* AppProcess.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppProcess.swift; sourceTree = ""; }; D59A6B802AA92D1C00F61259 /* Process+Conveniences.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Process+Conveniences.swift"; sourceTree = ""; }; D59A6B832AA932F700F61259 /* Logger+AltServer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Logger+AltServer.swift"; sourceTree = ""; }; D5A0537229B91DB400997551 /* SourceDetailContentViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceDetailContentViewController.swift; sourceTree = ""; }; - D5A1D2E32AA50EB60066CACC /* JITError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JITError.swift; sourceTree = ""; }; - D5A1D2E82AA512940066CACC /* RemoteServiceDiscoveryTunnel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoteServiceDiscoveryTunnel.swift; sourceTree = ""; }; - D5A1D2EA2AA513410066CACC /* URL+Tools.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "URL+Tools.swift"; sourceTree = ""; }; - D5A2193329B14F94002229FC /* DeprecatedAPIs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeprecatedAPIs.swift; sourceTree = ""; }; D5A645202AF591980047D980 /* UTType+AltStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UTType+AltStore.swift"; sourceTree = ""; }; D5A645222AF5B5C50047D980 /* PatreonAPI+Responses.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PatreonAPI+Responses.swift"; sourceTree = ""; }; D5A645242AF5BC7F0047D980 /* UserAccount.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserAccount.swift; sourceTree = ""; }; D5ACE84428E3B8450021CAB9 /* ClearAppCacheOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClearAppCacheOperation.swift; sourceTree = ""; }; D5B6F6A82AD75D01007EED5A /* ProcessInfo+Previews.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ProcessInfo+Previews.swift"; sourceTree = ""; }; D5B6F6AA2AD76541007EED5A /* PreviewAppScreenshotsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreviewAppScreenshotsViewController.swift; sourceTree = ""; }; - D5BA9E9A2A9FE1E8007C0661 /* JITManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JITManager.swift; sourceTree = ""; }; D5C0E7662AD9C75900530CA4 /* AppCardCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppCardCollectionViewCell.swift; sourceTree = ""; }; D5C8ACDA2A956B2B00669F92 /* Process+STPrivilegedTask.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Process+STPrivilegedTask.swift"; sourceTree = ""; }; D5CA0C4A280E141900469595 /* ManagedPatron.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ManagedPatron.swift; sourceTree = ""; }; @@ -1138,33 +998,23 @@ D5CE309B2B4C946300DB8151 /* AltStore15ToAltStore16.xcmappingmodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcmappingmodel; path = AltStore15ToAltStore16.xcmappingmodel; sourceTree = ""; }; D5CF56812A0D83F9006D93E2 /* VerificationError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VerificationError.swift; sourceTree = ""; }; D5DAE0952804DF430034D8D4 /* UpdatePatronsOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdatePatronsOperation.swift; sourceTree = ""; }; - D5DB145828F9DC1000A8F606 /* ALTLocalizedError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ALTLocalizedError.swift; sourceTree = ""; }; D5DB81632B0410BC003F5F8B /* AppSorting.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppSorting.swift; sourceTree = ""; }; D5E1E7C028077DE90016FC96 /* UpdateKnownSourcesOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdateKnownSourcesOperation.swift; sourceTree = ""; }; D5F2F6A82720B7C20081CCF5 /* PatchViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PatchViewController.swift; sourceTree = ""; }; D5F48B4729CCF21B002B52A4 /* AltStore+Async.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AltStore+Async.swift"; sourceTree = ""; }; D5F48B4929CD0B67002B52A4 /* AsyncManaged.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AsyncManaged.swift; sourceTree = ""; }; D5F5AF2D28FDD2EC00C938F5 /* TestErrors.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestErrors.swift; sourceTree = ""; }; - D5F5AF7C28ECEA990067C736 /* ErrorDetailsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorDetailsViewController.swift; sourceTree = ""; }; D5F9821C2AB900060045751F /* AppScreenshot.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppScreenshot.swift; sourceTree = ""; }; D5F982202AB910180045751F /* AppScreenshotsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppScreenshotsViewController.swift; sourceTree = ""; }; D5F99A1728D11DB500476A16 /* AltStore10ToAltStore11.xcmappingmodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcmappingmodel; path = AltStore10ToAltStore11.xcmappingmodel; sourceTree = ""; }; D5F99A1928D12B1400476A16 /* StoreApp10ToStoreApp11Policy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreApp10ToStoreApp11Policy.swift; sourceTree = ""; }; D5FB28EB2ADDF68D00A1C337 /* UIFontDescriptor+Bold.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIFontDescriptor+Bold.swift"; sourceTree = ""; }; D5FB7A0D2AA25A4E00EF863D /* Previews.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Previews.xcassets; sourceTree = ""; }; - D5FB7A132AA284BE00EF863D /* altjit */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = altjit; sourceTree = BUILT_PRODUCTS_DIR; }; - D5FB7A1A2AA284ED00EF863D /* EnableJIT.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = EnableJIT.swift; path = AltJIT/Commands/EnableJIT.swift; sourceTree = SOURCE_ROOT; }; - D5FB7A1B2AA284ED00EF863D /* ProcessError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ProcessError.swift; path = Shared/Errors/ProcessError.swift; sourceTree = SOURCE_ROOT; }; - D5FB7A1D2AA284ED00EF863D /* Logger+AltJIT.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "Logger+AltJIT.swift"; path = "AltJIT/Extensions/Logger+AltJIT.swift"; sourceTree = SOURCE_ROOT; }; - D5FB7A1E2AA284ED00EF863D /* AltJIT.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AltJIT.swift; path = AltJIT/AltJIT.swift; sourceTree = SOURCE_ROOT; }; - D5FB7A1F2AA284ED00EF863D /* MountDisk.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MountDisk.swift; path = AltJIT/Commands/MountDisk.swift; sourceTree = SOURCE_ROOT; }; - D5FB7A202AA284ED00EF863D /* Task+Timeout.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "Task+Timeout.swift"; path = "AltJIT/Extensions/Task+Timeout.swift"; sourceTree = SOURCE_ROOT; }; - D5FB7A382AA28AC700EF863D /* AltJIT-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "AltJIT-Bridging-Header.h"; path = "AltJIT/AltJIT-Bridging-Header.h"; sourceTree = SOURCE_ROOT; }; D5FD4EC42A952EAD0097BEE8 /* AltWidgetBundle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AltWidgetBundle.swift; sourceTree = ""; }; D5FD4EC82A9530C00097BEE8 /* AppSnapshot.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppSnapshot.swift; sourceTree = ""; }; D5FD4ECA2A9532960097BEE8 /* DatabaseManager+Async.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DatabaseManager+Async.swift"; sourceTree = ""; }; - EA79A60285C6AF5848AA16E9 /* Pods-AltStore.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AltStore.debug.xcconfig"; path = "Target Support Files/Pods-AltStore/Pods-AltStore.debug.xcconfig"; sourceTree = ""; }; - FC3822AB1C4CF1D4CDF7445D /* Pods_AltServer.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_AltServer.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + E0041AC42492DA27A05E35DF /* Pods-SideStore.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SideStore.debug.xcconfig"; path = "Target Support Files/Pods-SideStore/Pods-SideStore.debug.xcconfig"; sourceTree = ""; }; + E9547974791D7384C45A57D7 /* Pods-AltStoreCore.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AltStoreCore.debug.xcconfig"; path = "Target Support Files/Pods-AltStoreCore/Pods-AltStoreCore.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -1189,7 +1039,8 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 191E5FDC290AFA5C001A3B7C /* OpenSSL in Frameworks */, + A8FD91652D046FE900322782 /* OpenSSL in Frameworks */, + BF088D382501A833008082D9 /* OpenSSL.xcframework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1212,10 +1063,10 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B3C395F1284F2DE700DA9E2F /* KeychainAccess in Frameworks */, - 99C4EF4D2979132100CB538D /* SemanticVersion in Frameworks */, - 4879A95F2861046500FC1BBD /* AltSign in Frameworks */, - B39575F5284F29E20080B4FF /* Roxas.framework in Frameworks */, + BF42345D25102688006D1EB2 /* OpenSSL.xcframework in Frameworks */, + A8A74EEC2D03F55C001B5CFD /* AltSign-Static in Frameworks */, + 3D9D12C92BFBC6DBF27A29DF /* Pods_AltStoreCore.framework in Frameworks */, + A82067C42D03E0DE00645C0D /* SemanticVersion in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1234,35 +1085,13 @@ B33FFBA8295F8E98002259E6 /* libfragmentzip.a in Frameworks */, 191E5FB4290A5DA0001A3B7C /* libminimuxer.a in Frameworks */, 19104DBC2909C4E500C49C7B /* libEmotionalDamage.a in Frameworks */, - 19104D952909BAEA00C49C7B /* libimobiledevice.a in Frameworks */, B3146ED2284F581E00BBC3FD /* Roxas.framework in Frameworks */, D533E8B72727841800A9B5DD /* libAppleArchive.tbd in Frameworks */, - B3C395F9284F362400DA9E2F /* AppCenterCrashes in Frameworks */, - 9922FFEC29B501C50020F868 /* Starscream in Frameworks */, D533E8BE2727BBF800A9B5DD /* libcurl.a in Frameworks */, - 4879A9622861049C00FC1BBD /* OpenSSL in Frameworks */, - B3C395F4284F35DD00DA9E2F /* Nuke in Frameworks */, BF1614F1250822F100767AEA /* Roxas.framework in Frameworks */, - B3C395F7284F362400DA9E2F /* AppCenterAnalytics in Frameworks */, + BF088D332501A4FF008082D9 /* OpenSSL.xcframework in Frameworks */, BF66EE852501AE50007EE018 /* AltStoreCore.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - D586D39528EF58B0000E101F /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - D561B2EB28EF5A4F006752E4 /* AltSign-Dynamic in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - D5FB7A102AA284BE00EF863D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - D52DD35E2AAA89A600A7F2B6 /* AltSign-Dynamic in Frameworks */, - D537C85B2AA9507A009A1E08 /* libcorecrypto.tbd in Frameworks */, - D5FB7A2E2AA2859400EF863D /* ArgumentParser in Frameworks */, + 946A01BDDC0C453B8AA95668 /* Pods_SideStore.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1272,6 +1101,8 @@ 0EE7FDBF2BE8BBBF00D1E390 /* Errors */ = { isa = PBXGroup; children = ( + A8FD915D2D046F5200322782 /* UserInfoValue.swift */, + A8FD915B2D046EF100322782 /* ProcessError.swift */, 0EE7FDC32BE8BC7900D1E390 /* ALTLocalizedError.swift */, 0EE7FDC02BE8BC2100D1E390 /* ALTWrappedError.m */, 0EE7FDC22BE8BC4200D1E390 /* ALTWrappedError.h */, @@ -1282,8 +1113,6 @@ 19104DB32909C06D00C49C7B /* EmotionalDamage */ = { isa = PBXGroup; children = ( - BF0241A922F29CCD00129732 /* UserDefaults+AltServer.swift */, - BF541C0A25E5A5FA00CD46B2 /* FileManager+URLs.swift */, D5C8ACDA2A956B2B00669F92 /* Process+STPrivilegedTask.swift */, D59A6B832AA932F700F61259 /* Logger+AltServer.swift */, D58032EF2AB2429D00878F5E /* ProcessInfo+Device.swift */, @@ -1429,7 +1258,6 @@ BF718BD723C93DB700A89F2D /* ALTConstants.m */, BF18BFFF2485A75F00DD5981 /* Server Protocol */, BFF767CF2489AC240097E58C /* Connections */, - BFF7C92D2578464D00E55F36 /* XPC */, 0EE7FDBF2BE8BBBF00D1E390 /* Errors */, BFF767C32489A6800097E58C /* Extensions */, BFF767C42489A6980097E58C /* Categories */, @@ -1441,8 +1269,8 @@ BF3D648922E79A7700E9056B /* Types */ = { isa = PBXGroup; children = ( + A8FD917A2D0472DD00322782 /* DeprecatedAPIs.swift */, BF41B807233433C100C593A3 /* LoadingState.swift */, - D5A2193329B14F94002229FC /* DeprecatedAPIs.swift */, ); path = Types; sourceTree = ""; @@ -1460,28 +1288,6 @@ path = "App Detail"; sourceTree = ""; }; - BF45868E229872EA00BD7491 /* AltServer */ = { - isa = PBXGroup; - children = ( - BF45868F229872EA00BD7491 /* AppDelegate.swift */, - BF458695229872EA00BD7491 /* Main.storyboard */, - BFAD67A225E0854500D4C4D1 /* DeveloperDiskManager.swift */, - BFF0394A25F0551600BE607D /* MenuController.swift */, - BF904DE9265DAE9A00E86C2A /* InstalledApp.swift */, - D5F5AF7C28ECEA990067C736 /* ErrorDetailsViewController.swift */, - BFC15ADB27BC3AD100ED2FB4 /* Plugin */, - BF703195229F36FF006E110F /* Devices */, - D58032EC2AB241B900878F5E /* Anisette Data */, - BFD52BDC22A0A659000B7ED1 /* Connections */, - D59A6B792AA919E500F61259 /* JIT */, - BF055B4A233B528B0086DEA9 /* Extensions */, - BFE972E0260A8B0700D0BDAC /* Categories */, - BF703194229F36F6006E110F /* Resources */, - BF703196229F370F006E110F /* Supporting Files */, - ); - path = AltServer; - sourceTree = ""; - }; BF45872C2298D31600BD7491 /* libimobiledevice */ = { isa = PBXGroup; children = ( @@ -1801,7 +1607,6 @@ D5F48B4729CCF21B002B52A4 /* AltStore+Async.swift */, D5893F7E2A14183200E767CD /* NSManagedObjectContext+Conveniences.swift */, D52A2F962ACB40F700BDF8E3 /* Logger+AltStore.swift */, - D5B6F6A82AD75D01007EED5A /* ProcessInfo+Previews.swift */, D56915052AD5D75B00A2B747 /* Regex+Permissions.swift */, D5B6F6A82AD75D01007EED5A /* ProcessInfo+Previews.swift */, D552EB052AF453F900A3AB4D /* URL+Normalized.swift */, @@ -1927,13 +1732,6 @@ BFD247612284B9A500981D42 = { isa = PBXGroup; children = ( - B3C39607284F4C8400DA9E2F /* Build.xcconfig */, - B3C39606284F4C8400DA9E2F /* CodeSigning.xcconfig */, - B3C39608284F4C8400DA9E2F /* CodeSigning.xcconfig.sample */, - B3C3960B284F4C9800DA9E2F /* AltStore.xcconfig */, - B3C3960F284F53E900DA9E2F /* AltBackup.xcconfig */, - B3C3960D284F4E4B00DA9E2F /* AltWidgetExtension.xcconfig */, - B3C3960E284F4F9100DA9E2F /* AltStoreCore.xcconfig */, BFD2476C2284B9A500981D42 /* AltStore */, BF66EE7F2501AE50007EE018 /* AltStoreCore */, BF1E315122A0616100370A3C /* Shared */, @@ -1944,13 +1742,19 @@ 19104DB32909C06D00C49C7B /* EmotionalDamage */, 191E5FAC290A5D92001A3B7C /* minimuxer */, B343F886295F7F9B002B1159 /* libfragmentzip.xcodeproj */, - BFF7C905257844C900E55F36 /* AltXPC */, - D5FB7A142AA284BE00EF863D /* AltJIT */, D586D39928EF58B0000E101F /* AltTests */, BFD247852284BB3300981D42 /* Frameworks */, B3146EC6284F580500BBC3FD /* Roxas.xcodeproj */, BFD2476B2284B9A500981D42 /* Products */, B33FFB8F295F8CF2002259E6 /* Recovered References */, + C2B79346E83FCBDE76D501CB /* Pods */, + B3C39607284F4C8400DA9E2F /* Build.xcconfig */, + B3C39606284F4C8400DA9E2F /* CodeSigning.xcconfig */, + B3C39608284F4C8400DA9E2F /* CodeSigning.xcconfig.sample */, + B3C3960B284F4C9800DA9E2F /* AltStore.xcconfig */, + B3C3960F284F53E900DA9E2F /* AltBackup.xcconfig */, + B3C3960D284F4E4B00DA9E2F /* AltWidgetExtension.xcconfig */, + B3C3960E284F4F9100DA9E2F /* AltStoreCore.xcconfig */, ); sourceTree = ""; }; @@ -1965,9 +1769,7 @@ BF989167250AABF3002ACF50 /* AltWidgetExtension.appex */, 19104DB22909C06C00C49C7B /* libEmotionalDamage.a */, 191E5FAB290A5D92001A3B7C /* libminimuxer.a */, - BFF7C904257844C900E55F36 /* AltXPC.xpc */, D586D39828EF58B0000E101F /* AltTests.xctest */, - D5FB7A132AA284BE00EF863D /* altjit */, ); name = Products; sourceTree = ""; @@ -1992,7 +1794,6 @@ BFC84A4B2421A13000853474 /* Sources */, BF56D2AD23DF9E170006506D /* App IDs */, D5BDD9712B1FC8FA001F84DE /* Permissions */, - BFC51D7922972F1F00388324 /* Server */, BF0DCA642433BDE200E3A595 /* Analytics */, BFF00D2E2501BD4B00746320 /* Intents */, BFDB6A0922AAEDA1007EA6D6 /* Operations */, @@ -2011,12 +1812,14 @@ isa = PBXGroup; children = ( B343F86C295F759E002B1159 /* libresolv.tbd */, - B39575F4284F29E20080B4FF /* Roxas.framework */, D537C85A2AA95066009A1E08 /* libcorecrypto.tbd */, D533E8B62727841800A9B5DD /* libAppleArchive.tbd */, BF580497246A3D19008AE704 /* UIKit.framework */, BF4588872298DD3F00BD7491 /* libxml2.tbd */, + BF088D322501A4FF008082D9 /* OpenSSL.xcframework */, BFD247862284BB3B00981D42 /* Roxas.framework */, + 9932E27A2170D2226ABFA4B6 /* Pods_AltStoreCore.framework */, + 941BDBA6EC0212BC1DCBA3F9 /* Pods_SideStore.framework */, ); name = Frameworks; sourceTree = ""; @@ -2088,7 +1891,6 @@ D5927D6529DCC89000D6898E /* UINavigationBarAppearance+TintColor.swift */, D54058BA2A1D8FE3008CCC58 /* UIColor+AltStore.swift */, D5FB28EB2ADDF68D00A1C337 /* UIFontDescriptor+Bold.swift */, - D56915052AD5D75B00A2B747 /* Regex+Permissions.swift */, D5A645202AF591980047D980 /* UTType+AltStore.swift */, ); path = Extensions; @@ -2207,12 +2009,15 @@ path = Connections; sourceTree = ""; }; - BFF7C92D2578464D00E55F36 /* XPC */ = { + C2B79346E83FCBDE76D501CB /* Pods */ = { isa = PBXGroup; children = ( - BFF7C906257844C900E55F36 /* AltXPCProtocol.h */, + E9547974791D7384C45A57D7 /* Pods-AltStoreCore.debug.xcconfig */, + 6D1CADCE97AF931337C66730 /* Pods-AltStoreCore.release.xcconfig */, + E0041AC42492DA27A05E35DF /* Pods-SideStore.debug.xcconfig */, + 9ACEAECC253184BCA8E3E068 /* Pods-SideStore.release.xcconfig */, ); - path = XPC; + path = Pods; sourceTree = ""; }; D50107ED2ADF2E310069F2A1 /* Components */ = { @@ -2262,15 +2067,6 @@ path = Model; sourceTree = ""; }; - D522F9562AA509E9003E57D1 /* Types */ = { - isa = PBXGroup; - children = ( - D5A1D2E82AA512940066CACC /* RemoteServiceDiscoveryTunnel.swift */, - D59A6B7A2AA91B8E00F61259 /* PythonCommand.swift */, - ); - path = Types; - sourceTree = ""; - }; D54058B72A1D6251008CCC58 /* Previews */ = { isa = PBXGroup; children = ( @@ -2327,15 +2123,6 @@ path = Components; sourceTree = ""; }; - D58032EC2AB241B900878F5E /* Anisette Data */ = { - isa = PBXGroup; - children = ( - D58032ED2AB241D100878F5E /* AnisetteError.swift */, - BFE48974238007CE003239E0 /* AnisetteDataManager.swift */, - ); - path = "Anisette Data"; - sourceTree = ""; - }; D586D39928EF58B0000E101F /* AltTests */ = { isa = PBXGroup; children = ( @@ -2356,14 +2143,6 @@ path = "Error Log"; sourceTree = ""; }; - D59A6B792AA919E500F61259 /* JIT */ = { - isa = PBXGroup; - children = ( - D5BA9E9A2A9FE1E8007C0661 /* JITManager.swift */, - ); - path = JIT; - sourceTree = ""; - }; D59A6B7C2AA9225C00F61259 /* Types */ = { isa = PBXGroup; children = ( @@ -2380,50 +2159,6 @@ path = Permissions; sourceTree = ""; }; - D5DB145728F9DC0300A8F606 /* Errors */ = { - isa = PBXGroup; - children = ( - D5DB145828F9DC1000A8F606 /* ALTLocalizedError.swift */, - D5189C002A01BC6800F44625 /* UserInfoValue.swift */, - D51AD27C29356B7B00967AAA /* ALTWrappedError.h */, - D51AD27D29356B7B00967AAA /* ALTWrappedError.m */, - D5FB7A1B2AA284ED00EF863D /* ProcessError.swift */, - D5A1D2E32AA50EB60066CACC /* JITError.swift */, - ); - path = Errors; - sourceTree = ""; - }; - D5FB7A142AA284BE00EF863D /* AltJIT */ = { - isa = PBXGroup; - children = ( - D5FB7A1E2AA284ED00EF863D /* AltJIT.swift */, - D5FB7A382AA28AC700EF863D /* AltJIT-Bridging-Header.h */, - D5FB7A282AA2851200EF863D /* Commands */, - D522F9562AA509E9003E57D1 /* Types */, - D5FB7A292AA2851C00EF863D /* Extensions */, - ); - path = AltJIT; - sourceTree = ""; - }; - D5FB7A282AA2851200EF863D /* Commands */ = { - isa = PBXGroup; - children = ( - D5FB7A1A2AA284ED00EF863D /* EnableJIT.swift */, - D5FB7A1F2AA284ED00EF863D /* MountDisk.swift */, - ); - path = Commands; - sourceTree = ""; - }; - D5FB7A292AA2851C00EF863D /* Extensions */ = { - isa = PBXGroup; - children = ( - D5FB7A1D2AA284ED00EF863D /* Logger+AltJIT.swift */, - D5A1D2EA2AA513410066CACC /* URL+Tools.swift */, - D5FB7A202AA284ED00EF863D /* Task+Timeout.swift */, - ); - path = Extensions; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ @@ -2526,42 +2261,10 @@ dependencies = ( ); name = AltDaemon; - packageProductDependencies = ( - ); productName = AltDaemon; productReference = BF18BFE724857D7900DD5981 /* AltDaemon */; productType = "com.apple.product-type.library.dynamic"; }; - BF45868C229872EA00BD7491 /* AltServer */ = { - isa = PBXNativeTarget; - buildConfigurationList = BF45869A229872EA00BD7491 /* Build configuration list for PBXNativeTarget "AltServer" */; - buildPhases = ( - FACBF95CCAAAB7121E1D92C8 /* [CP] Check Pods Manifest.lock */, - BF458689229872EA00BD7491 /* Sources */, - BF45868B229872EA00BD7491 /* Resources */, - BF4588462298D4AA00BD7491 /* Frameworks */, - BF0201BC22C2EFA3000B93E4 /* Embed Frameworks */, - BF7FDA2C23203B6B00B5D3A4 /* Copy Launcher App */, - 98BF22D155DBAEA97544E3E6 /* [CP] Embed Pods Frameworks */, - BFF7C910257844C900E55F36 /* Embed XPC Services */, - D537C8582AA94D60009A1E08 /* Embed AltJIT */, - ); - buildRules = ( - ); - dependencies = ( - D537C8572AA94D4A009A1E08 /* PBXTargetDependency */, - BF4588452298D48B00BD7491 /* PBXTargetDependency */, - BFF7C90E257844C900E55F36 /* PBXTargetDependency */, - ); - name = AltServer; - packageProductDependencies = ( - BF088D352501A821008082D9 /* AltSign-Dynamic */, - D58D5F2D26DFE68E00E55E38 /* LaunchAtLogin */, - ); - productName = AltServer; - productReference = BF45868D229872EA00BD7491 /* AltServer.app */; - productType = "com.apple.product-type.application"; - }; BF45872A2298D31600BD7491 /* libimobiledevice */ = { isa = PBXNativeTarget; buildConfigurationList = BF4587332298D31600BD7491 /* Build configuration list for PBXNativeTarget "libimobiledevice" */; @@ -2604,6 +2307,7 @@ isa = PBXNativeTarget; buildConfigurationList = BF66EE892501AE50007EE018 /* Build configuration list for PBXNativeTarget "AltStoreCore" */; buildPhases = ( + 5913F0D744709F16D205B38E /* [CP] Check Pods Manifest.lock */, BF66EE792501AE50007EE018 /* Headers */, BF66EE7A2501AE50007EE018 /* Sources */, BF66EE7B2501AE50007EE018 /* Frameworks */, @@ -2612,13 +2316,11 @@ buildRules = ( ); dependencies = ( - 99C4EF51297994E200CB538D /* PBXTargetDependency */, ); name = AltStoreCore; packageProductDependencies = ( - B3C395F0284F2DE700DA9E2F /* KeychainAccess */, - 4879A95E2861046500FC1BBD /* AltSign */, - 99C4EF4C2979132100CB538D /* SemanticVersion */, + A82067C32D03E0DE00645C0D /* SemanticVersion */, + A8A74EEB2D03F55C001B5CFD /* AltSign-Static */, ); productName = AltStoreCore; productReference = BF66EE7E2501AE50007EE018 /* AltStoreCore.framework */; @@ -2646,58 +2348,28 @@ isa = PBXNativeTarget; buildConfigurationList = BFD2477E2284B9A700981D42 /* Build configuration list for PBXNativeTarget "SideStore" */; buildPhases = ( + F36F76F894D066950179DD98 /* [CP] Check Pods Manifest.lock */, 99F87D0629D8B51400B40039 /* ShellScript */, BFD247662284B9A500981D42 /* Sources */, BFD247672284B9A500981D42 /* Frameworks */, BFD247682284B9A500981D42 /* Resources */, BF088D2B2501A087008082D9 /* Embed Frameworks */, - BF98917B250AABF4002ACF50 /* Embed App Extensions */, - 744AE3B03F6BF664FC5705C5 /* [CP] Embed Pods Frameworks */, BF98917B250AABF4002ACF50 /* Embed Foundation Extensions */, + D2B5A659F6DE631B5733E84A /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); dependencies = ( 191E5FB3290A5D9B001A3B7C /* PBXTargetDependency */, 19104DBA2909C0F200C49C7B /* PBXTargetDependency */, - 19104D942909BADB00C49C7B /* PBXTargetDependency */, BF66EE842501AE50007EE018 /* PBXTargetDependency */, BF989176250AABF4002ACF50 /* PBXTargetDependency */, ); name = SideStore; - packageProductDependencies = ( - B3C395F3284F35DD00DA9E2F /* Nuke */, - B3C395F6284F362400DA9E2F /* AppCenterAnalytics */, - B3C395F8284F362400DA9E2F /* AppCenterCrashes */, - 4879A9612861049C00FC1BBD /* OpenSSL */, - 9922FFEB29B501C50020F868 /* Starscream */, - ); productName = AltStore; productReference = BFD2476A2284B9A500981D42 /* SideStore.app */; productType = "com.apple.product-type.application"; }; - D5FB7A122AA284BE00EF863D /* AltJIT */ = { - isa = PBXNativeTarget; - buildConfigurationList = D5FB7A172AA284BE00EF863D /* Build configuration list for PBXNativeTarget "AltJIT" */; - buildPhases = ( - D5FB7A0F2AA284BE00EF863D /* Sources */, - D5FB7A102AA284BE00EF863D /* Frameworks */, - D5FB7A112AA284BE00EF863D /* CopyFiles */, - D52DD3602AAA89A700A7F2B6 /* Embed Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = AltJIT; - packageProductDependencies = ( - D5FB7A2D2AA2859400EF863D /* ArgumentParser */, - D52DD35D2AAA89A600A7F2B6 /* AltSign-Dynamic */, - ); - productName = AltJIT; - productReference = D5FB7A132AA284BE00EF863D /* altjit */; - productType = "com.apple.product-type.tool"; - }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -2743,17 +2415,6 @@ }; }; }; - BFF7C903257844C900E55F36 = { - CreatedOnToolsVersion = 12.3; - LastSwiftMigration = 1230; - }; - D586D39728EF58B0000E101F = { - CreatedOnToolsVersion = 14.0.1; - TestTargetID = BFD247692284B9A500981D42; - }; - D5FB7A122AA284BE00EF863D = { - CreatedOnToolsVersion = 15.0; - }; }; }; buildConfigurationList = BFD247652284B9A500981D42 /* Build configuration list for PBXProject "AltStore" */; @@ -2767,16 +2428,8 @@ mainGroup = BFD247612284B9A500981D42; packageReferences = ( D58D5F2C26DFE68E00E55E38 /* XCRemoteSwiftPackageReference "LaunchAtLogin" */, - B3C395EF284F2DE700DA9E2F /* XCRemoteSwiftPackageReference "KeychainAccess" */, - B3C395F2284F35DD00DA9E2F /* XCRemoteSwiftPackageReference "Nuke" */, - B3C395F5284F362400DA9E2F /* XCRemoteSwiftPackageReference "appcenter-sdk-apple" */, - B3C395FA284F3B2400DA9E2F /* XCRemoteSwiftPackageReference "Sparkle" */, - B3C395FD284F3C0900DA9E2F /* XCRemoteSwiftPackageReference "STPrivilegedTask" */, - 4879A95D2861046500FC1BBD /* XCRemoteSwiftPackageReference "AltSign" */, - 4879A9602861049C00FC1BBD /* XCRemoteSwiftPackageReference "OpenSSL" */, - 99C4EF472978D52400CB538D /* XCRemoteSwiftPackageReference "SemanticVersion" */, - 9922FFEA29B501C50020F868 /* XCRemoteSwiftPackageReference "Starscream" */, D5FB7A2C2AA2859400EF863D /* XCRemoteSwiftPackageReference "swift-argument-parser" */, + A82067C22D03E0DE00645C0D /* XCRemoteSwiftPackageReference "SemanticVersion" */, ); productRefGroup = BFD2476B2284B9A500981D42 /* Products */; projectDirPath = ""; @@ -2808,9 +2461,6 @@ BF989166250AABF3002ACF50 /* AltWidgetExtension */, 19104DB12909C06C00C49C7B /* EmotionalDamage */, 191E5FAA290A5D92001A3B7C /* minimuxer */, - BFF7C903257844C900E55F36 /* AltXPC */, - D5FB7A122AA284BE00EF863D /* AltJIT */, - D586D39728EF58B0000E101F /* AltTests */, ); }; /* End PBXProject section */ @@ -2927,14 +2577,12 @@ D5144BA82B8684EF00738A5C /* Icons.xcassets in Resources */, D57DF638271E32F000677701 /* PatchApp.storyboard in Resources */, BFD2477A2284B9A700981D42 /* LaunchScreen.storyboard in Resources */, - BF44EEF3246B3A17002A52F2 /* AltBackup.ipa in Resources */, D56D21422B7D9C41007641C5 /* AltIcons.plist in Resources */, BF770E6922BD57DD002A40FE /* Silence.m4a in Resources */, BFD247772284B9A700981D42 /* Assets.xcassets in Resources */, BFF0B6922321A305007A79E1 /* AboutPatreonHeaderView.xib in Resources */, BFB6B22423187A3D0022A802 /* NewsCollectionViewCell.xib in Resources */, BFD247752284B9A500981D42 /* Main.storyboard in Resources */, - BFDB5B2622EFBBEA00F74113 /* BrowseCollectionViewCell.xib in Resources */, 0E764E172ADFF5740043DD4E /* AltBackup.ipa in Resources */, BFE6073C231AE1E7002B0E8E /* SettingsHeaderFooterView.xib in Resources */, BF29012F2318F6B100D88A45 /* AppBannerView.xib in Resources */, @@ -2946,6 +2594,28 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ + 5913F0D744709F16D205B38E /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-AltStoreCore-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; 99F87D0629D8B51400B40039 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -2964,6 +2634,45 @@ shellPath = /bin/sh; shellScript = "bash ./Dependencies/fetch-prebuilt.sh minimuxer\n"; }; + D2B5A659F6DE631B5733E84A /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-SideStore/Pods-SideStore-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-SideStore/Pods-SideStore-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-SideStore/Pods-SideStore-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + F36F76F894D066950179DD98 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-SideStore-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -3008,58 +2717,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - BF458689229872EA00BD7491 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - BFF767C82489A74E0097E58C /* WirelessConnectionHandler.swift in Sources */, - BFF0394B25F0551600BE607D /* MenuController.swift in Sources */, - BFECAC8024FD950B0077C41F /* ConnectionManager.swift in Sources */, - D570841A2924680D00D42D34 /* OperatingSystemVersion+Comparable.swift in Sources */, - BFC15ADA27BC352300ED2FB4 /* PluginVersion.swift in Sources */, - BFECAC8324FD950B0077C41F /* NetworkConnection.swift in Sources */, - BF541C0B25E5A5FA00CD46B2 /* FileManager+URLs.swift in Sources */, - D5A299892AAB9E5900A3988D /* AppProcess.swift in Sources */, - D5A299872AAB9E4E00A3988D /* ProcessError.swift in Sources */, - BFECAC8724FD950B0077C41F /* Bundle+AltStore.swift in Sources */, - BF3F786422CAA41E008FBD20 /* ALTDeviceManager+Installation.swift in Sources */, - D5A299882AAB9E4E00A3988D /* JITError.swift in Sources */, - BF18BFFD2485A1E400DD5981 /* WiredConnectionHandler.swift in Sources */, - BFC712BB2512B9CF00AB5EBE /* PluginManager.swift in Sources */, - BFECAC8224FD950B0077C41F /* ServerProtocol.swift in Sources */, - BFECAC8124FD950B0077C41F /* ALTServerError+Conveniences.swift in Sources */, - D5C8ACDB2A956B2B00669F92 /* Process+STPrivilegedTask.swift in Sources */, - BFECAC7F24FD950B0077C41F /* CodableError.swift in Sources */, - D5189C012A01BC6800F44625 /* UserInfoValue.swift in Sources */, - D51AD28029356B8000967AAA /* ALTWrappedError.m in Sources */, - BFECAC8624FD950B0077C41F /* Result+Conveniences.swift in Sources */, - BF265D1925F843A000080DC9 /* NSError+AltStore.swift in Sources */, - BF904DEA265DAE9A00E86C2A /* InstalledApp.swift in Sources */, - BFF435D9255CBDAB00DD724F /* ALTApplication+AltStoreApp.swift in Sources */, - BF718BD523C928A300A89F2D /* ALTNotificationConnection.mm in Sources */, - BF1E312B229F474900370A3C /* RequestHandler.swift in Sources */, - BF718BD123C91BD300A89F2D /* ALTWiredConnection.mm in Sources */, - BFAD678E25E0649500D4C4D1 /* ALTDebugConnection.mm in Sources */, - BFECAC8524FD950B0077C41F /* Connection.swift in Sources */, - D58032EE2AB241D100878F5E /* AnisetteError.swift in Sources */, - BF458690229872EA00BD7491 /* AppDelegate.swift in Sources */, - BFECAC8424FD950B0077C41F /* ALTConstants.m in Sources */, - BF4586C52298CDB800BD7491 /* ALTDeviceManager.mm in Sources */, - D58032F02AB2429D00878F5E /* ProcessInfo+Device.swift in Sources */, - D59A6B842AA932F700F61259 /* Logger+AltServer.swift in Sources */, - BF0241AA22F29CCD00129732 /* UserDefaults+AltServer.swift in Sources */, - BFECAC9424FD98BA0077C41F /* NSError+ALTServerError.m in Sources */, - BFAD67A325E0854500D4C4D1 /* DeveloperDiskManager.swift in Sources */, - D5F5AF7D28ECEA990067C736 /* ErrorDetailsViewController.swift in Sources */, - BFECAC9324FD98BA0077C41F /* CFNotificationName+AltStore.m in Sources */, - BFE48975238007CE003239E0 /* AnisetteDataManager.swift in Sources */, - D5DB145B28F9DC5C00A8F606 /* ALTLocalizedError.swift in Sources */, - D5BA9E9B2A9FE1E8007C0661 /* JITManager.swift in Sources */, - BFE972E3260A8B2700D0BDAC /* NSError+libimobiledevice.mm in Sources */, - D5A299862AAB9E4E00A3988D /* Process+Conveniences.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; BF4587282298D31600BD7491 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -3143,6 +2800,7 @@ BF44EEF0246B08BA002A52F2 /* BackupController.swift in Sources */, 0EE7FDC62BE8CEA300D1E390 /* ALTLocalizedError.swift in Sources */, 03F06CD52942C27E001C4D68 /* Bundle+AltStore.swift in Sources */, + A8FD915E2D046F5200322782 /* UserInfoValue.swift in Sources */, BF58047E246A28F7008AE704 /* AppDelegate.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -3151,13 +2809,13 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + A82067842D03DC0600645C0D /* OperatingSystemVersion+Comparable.swift in Sources */, D5FB28EE2ADDF89800A1C337 /* KnownSource.swift in Sources */, BF66EED32501AECA007EE018 /* AltStore2ToAltStore3.xcmappingmodel in Sources */, BF66EEA52501AEC5007EE018 /* Benefit.swift in Sources */, D52B4ABF2AF183F0005991C3 /* WebViewController.swift in Sources */, BF66EED22501AECA007EE018 /* AltStore4ToAltStore5.xcmappingmodel in Sources */, D5A645252AF5BC7F0047D980 /* UserAccount.swift in Sources */, - D5189C022A01BC6800F44625 /* UserInfoValue.swift in Sources */, BFAECC5B2501B0A400528F27 /* Bundle+AltStore.swift in Sources */, BF66EECD2501AECA007EE018 /* StoreAppPolicy.swift in Sources */, BF66EEE82501AED0007EE018 /* UserDefaults+AltStore.swift in Sources */, @@ -3165,6 +2823,7 @@ D552EB062AF453F900A3AB4D /* URL+Normalized.swift in Sources */, BFAECC522501B0A400528F27 /* CodableError.swift in Sources */, D51E83822B8692DF0092FC61 /* AltStore16ToAltStore17.xcmappingmodel in Sources */, + A8FD915F2D046F5200322782 /* UserInfoValue.swift in Sources */, D5F9821D2AB900060045751F /* AppScreenshot.swift in Sources */, BF66EE9E2501AEC1007EE018 /* Fetchable.swift in Sources */, BF66EEDF2501AECA007EE018 /* PatreonAccount.swift in Sources */, @@ -3175,7 +2834,6 @@ D52A2F972ACB40F700BDF8E3 /* Logger+AltStore.swift in Sources */, BFC712C42512D5F100AB5EBE /* XPCConnection.swift in Sources */, D5CA0C4B280E141900469595 /* ManagedPatron.swift in Sources */, - 0E05025A2BEC83C500879B5C /* OperatingSystemVersion+Comparable.swift in Sources */, BF66EE8C2501AEB2007EE018 /* Keychain.swift in Sources */, BF66EED42501AECA007EE018 /* AltStore5ToAltStore6.xcmappingmodel in Sources */, BF66EE972501AEBC007EE018 /* ALTAppPermissions.m in Sources */, @@ -3197,7 +2855,6 @@ D557A4832AE85DB7007D0DCF /* PledgeReward.swift in Sources */, D5893F802A1419E800E767CD /* NSManagedObjectContext+Conveniences.swift in Sources */, D5CA0C4E280E249E00469595 /* AltStore9ToAltStore10.xcmappingmodel in Sources */, - D51AD27F29356B7B00967AAA /* ALTWrappedError.m in Sources */, BF989184250AACFC002ACF50 /* Date+RelativeDate.swift in Sources */, D5DB81642B0410BC003F5F8B /* AppSorting.swift in Sources */, BF66EE962501AEBC007EE018 /* ALTPatreonBenefitID.m in Sources */, @@ -3233,7 +2890,6 @@ BF66EECC2501AECA007EE018 /* Source.swift in Sources */, BF66EED72501AECA007EE018 /* InstalledApp.swift in Sources */, 0EE7FDC92BE8D07400D1E390 /* NSError+AltStore.swift in Sources */, - D5DB145A28F9DC5A00A8F606 /* ALTLocalizedError.swift in Sources */, D5A645232AF5B5C50047D980 /* PatreonAPI+Responses.swift in Sources */, D5185B822AE1E71D00646E33 /* Source13To14MigrationPolicy.swift in Sources */, BF66EECE2501AECA007EE018 /* InstalledAppPolicy.swift in Sources */, @@ -3264,7 +2920,7 @@ D5151BE22A90363300C96F28 /* RefreshAllAppsWidgetIntent.swift in Sources */, D5FD4EC92A9530C00097BEE8 /* AppSnapshot.swift in Sources */, D5151BE72A90395400C96F28 /* View+AltWidget.swift in Sources */, - BF98917F250AAC4F002ACF50 /* AltWidget.swift in Sources */, + BF98917F250AAC4F002ACF50 /* LockScreenWidget.swift in Sources */, A800F7042CE28E3800208744 /* View+AltWidget.swift in Sources */, BF98917F250AAC4F002ACF50 /* LockScreenWidget.swift in Sources */, D5FD4EC52A952EAD0097BEE8 /* AltWidgetBundle.swift in Sources */, @@ -3281,7 +2937,6 @@ D57F2C9426E01BC700B9FA39 /* UIDevice+Vibration.swift in Sources */, BFD2478F2284C8F900981D42 /* Button.swift in Sources */, D5151BE12A90344300C96F28 /* RefreshAllAppsWidgetIntent.swift in Sources */, - D540E93828EE1BDE000F1B0F /* ErrorDetailsViewController.swift in Sources */, D513F6162A12CE4E0061EAA1 /* SourceError.swift in Sources */, BF56D2AC23DF8E170006506D /* FetchAppIDsOperation.swift in Sources */, BFC1F38D22AEE3A4003AC21A /* DownloadAppOperation.swift in Sources */, @@ -3306,15 +2961,13 @@ BFF0B6982322CAB8007A79E1 /* InstructionsViewController.swift in Sources */, BF9ABA4522DCFF43008935CF /* BrowseViewController.swift in Sources */, D5935AED29C39DE300C157EF /* SourceComponents.swift in Sources */, - D56915062AD5D75B00A2B747 /* Regex+Permissions.swift in Sources */, - D5935AED29C39DE300C157EF /* SourceDetailsComponents.swift in Sources */, + D5935AED29C39DE300C157EF /* SourceComponents.swift in Sources */, D5A0537329B91DB400997551 /* SourceDetailContentViewController.swift in Sources */, BF770E5422BC044E002A40FE /* OperationContexts.swift in Sources */, BFD2478C2284C4C300981D42 /* AppIconImageView.swift in Sources */, BF8F69C422E662D300049BA1 /* AppViewController.swift in Sources */, BFF0B68E23219520007A79E1 /* PatreonViewController.swift in Sources */, BFF00D302501BD7D00746320 /* Intents.intentdefinition in Sources */, - D5CF568C2A0D8EEC006D93E2 /* VerificationError.swift in Sources */, D5B6F6AB2AD76541007EED5A /* PreviewAppScreenshotsViewController.swift in Sources */, BFD2476E2284B9A500981D42 /* AppDelegate.swift in Sources */, BF41B806233423AE00C593A3 /* TabBarController.swift in Sources */, @@ -3328,7 +2981,7 @@ D5927D6629DCC89000D6898E /* UINavigationBarAppearance+TintColor.swift in Sources */, BF88F97224F8727D00BB75DF /* AppManagerErrors.swift in Sources */, B39F16152918D7DA002E9404 /* Consts+Proxy.swift in Sources */, - BF6C8FAE2429597900125131 /* BannerCollectionViewCell.swift in Sources */, + BF6C8FAE2429597900125131 /* AppBannerCollectionViewCell.swift in Sources */, BF6C8FAE2429597900125131 /* AppBannerCollectionViewCell.swift in Sources */, D5084CCC2B1EA80100C02160 /* FeaturedComponents.swift in Sources */, BF6F439223644C6E00A0B879 /* RefreshAltStoreViewController.swift in Sources */, @@ -3336,6 +2989,7 @@ BD4513AB2C6FA98C0052BCC0 /* AppExtensionView.swift in Sources */, BFE338E822F10E56002E24B9 /* LaunchViewController.swift in Sources */, BFA8172B23C5633D001B5953 /* FetchAnisetteDataOperation.swift in Sources */, + A8FD91602D046F5200322782 /* UserInfoValue.swift in Sources */, D552B1D82A042A740066216F /* AppPermissionsCard.swift in Sources */, BFD6B03322DFF20800B86064 /* MyAppsComponents.swift in Sources */, BF41B808233433C100C593A3 /* LoadingState.swift in Sources */, @@ -3345,7 +2999,6 @@ D5F2F6A92720B7C20081CCF5 /* PatchViewController.swift in Sources */, B39F16132918D7C5002E9404 /* Consts.swift in Sources */, BF8F69C222E659F700049BA1 /* AppContentViewController.swift in Sources */, - D5A2193429B14F94002229FC /* DeprecatedAPIs.swift in Sources */, BF08858522DE7EC800DE9F1E /* UpdateCollectionViewCell.swift in Sources */, BF770E5822BC3D0F002A40FE /* RefreshGroup.swift in Sources */, 19B9B7452845E6DF0076EF69 /* SelectTeamViewController.swift in Sources */, @@ -3368,6 +3021,7 @@ D593F1942717749A006E82DE /* PatchAppOperation.swift in Sources */, BF770E5122BB1CF6002A40FE /* InstallAppOperation.swift in Sources */, BF9ABA4B22DD1380008935CF /* NavigationBar.swift in Sources */, + A8FD917B2D0472DD00322782 /* DeprecatedAPIs.swift in Sources */, BF6C8FAC242935ED00125131 /* NSAttributedString+Markdown.m in Sources */, BFF00D322501BDA100746320 /* BackgroundRefreshAppsOperation.swift in Sources */, BF0C4EBD22A1BD8B009A2DD7 /* AppManager.swift in Sources */, @@ -3393,7 +3047,6 @@ D54058B92A1D6269008CCC58 /* AppPermissionProtocol.swift in Sources */, BFB6B220231870B00022A802 /* NewsCollectionViewCell.swift in Sources */, D56D21402B7D9942007641C5 /* AltAppIconsViewController.swift in Sources */, - BFB3645A2325985F00CD0EB1 /* FindServerOperation.swift in Sources */, D52EF2BE2A0594550096C377 /* AppDetailCollectionViewController.swift in Sources */, D569A5042AF9BC5F00A4CB8B /* ReviewPermissionsViewController.swift in Sources */, BF3BEFBF2408673400DE7D55 /* FetchProvisioningProfilesOperation.swift in Sources */, @@ -3401,66 +3054,14 @@ D5F982212AB910180045751F /* AppScreenshotsViewController.swift in Sources */, BFF0B69023219C6D007A79E1 /* PatreonComponents.swift in Sources */, BFBE0004250ACFFB0080826E /* ViewApp.intentdefinition in Sources */, - BF770E5622BC3C03002A40FE /* Server.swift in Sources */, - BFA8172923C56042001B5953 /* ServerConnection.swift in Sources */, D52C8F012AFC144C00CA0BDD /* FeaturedViewController.swift in Sources */, BF56D2AF23DF9E310006506D /* AppIDsViewController.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - BFF7C900257844C900E55F36 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - BFF7C9342578492100E55F36 /* ALTAnisetteData.m in Sources */, - BFF7C920257844FA00E55F36 /* ALTPluginService.m in Sources */, - BF77A67E25795BBE00BFE477 /* main.swift in Sources */, - BF77A67025795A5600BFE477 /* AltXPC.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - D586D39428EF58B0000E101F /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - D586D39B28EF58B0000E101F /* AltTests.swift in Sources */, - D56915092AD5F3E800A2B747 /* AltTests+Sources.swift in Sources */, - D5F5AF2E28FDD2EC00C938F5 /* TestErrors.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - D5FB7A0F2AA284BE00EF863D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - D5A1D2EB2AA513410066CACC /* URL+Tools.swift in Sources */, - D5FB7A212AA284ED00EF863D /* EnableJIT.swift in Sources */, - D5FB7A312AA28A2900EF863D /* NSError+AltStore.swift in Sources */, - D59A6B7B2AA91B8E00F61259 /* PythonCommand.swift in Sources */, - D5A1D2EC2AA51D490066CACC /* ProcessError.swift in Sources */, - D5FB7A262AA284ED00EF863D /* MountDisk.swift in Sources */, - D5FB7A392AA28D8300EF863D /* NSError+ALTServerError.m in Sources */, - D59A6B7F2AA9226C00F61259 /* AppProcess.swift in Sources */, - D5FB7A272AA284ED00EF863D /* Task+Timeout.swift in Sources */, - D59A6B822AA92D1C00F61259 /* Process+Conveniences.swift in Sources */, - D5FB7A2A2AA2854100EF863D /* ALTLocalizedError.swift in Sources */, - D5A1D2E92AA512940066CACC /* RemoteServiceDiscoveryTunnel.swift in Sources */, - D5FB7A2B2AA2854400EF863D /* UserInfoValue.swift in Sources */, - D5FB7A242AA284ED00EF863D /* Logger+AltJIT.swift in Sources */, - D5A1D2E42AA50EB60066CACC /* JITError.swift in Sources */, - D5FB7A252AA284ED00EF863D /* AltJIT.swift in Sources */, - D5FB7A322AA28A4000EF863D /* ALTWrappedError.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 19104D942909BADB00C49C7B /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = BF45872A2298D31600BD7491 /* libimobiledevice */; - targetProxy = 19104D932909BADB00C49C7B /* PBXContainerItemProxy */; - }; 19104DBA2909C0F200C49C7B /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 19104DB12909C06C00C49C7B /* EmotionalDamage */; @@ -3475,10 +3076,6 @@ isa = PBXTargetDependency; productRef = 191E5FD9290AFA49001A3B7C /* OpenSSL */; }; - 99C4EF51297994E200CB538D /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - productRef = 99C4EF50297994E200CB538D /* SemanticVersion */; - }; B343F86F295F76FD002B1159 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = "minimuxer-staticlib"; @@ -3504,21 +3101,6 @@ target = BF66EE7D2501AE50007EE018 /* AltStoreCore */; targetProxy = BFF615AA2510042B00484D3B /* PBXContainerItemProxy */; }; - BFF7C90E257844C900E55F36 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = BFF7C903257844C900E55F36 /* AltXPC */; - targetProxy = BFF7C90D257844C900E55F36 /* PBXContainerItemProxy */; - }; - D537C8572AA94D4A009A1E08 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = D5FB7A122AA284BE00EF863D /* AltJIT */; - targetProxy = D537C8562AA94D4A009A1E08 /* PBXContainerItemProxy */; - }; - D586D39D28EF58B0000E101F /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = BFD247692284B9A500981D42 /* AltStore */; - targetProxy = D586D39C28EF58B0000E101F /* PBXContainerItemProxy */; - }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ @@ -3730,111 +3312,6 @@ }; name = Release; }; - BF45869B229872EA00BD7491 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 11611D46F8A7C8B928E8156B /* Pods-AltServer.debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = AltServer/AltServer.entitlements; - CODE_SIGN_IDENTITY = "Mac Developer"; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 84; - DEAD_CODE_STRIPPING = YES; - DEVELOPMENT_TEAM = 6XVY5G3U44; - ENABLE_HARDENED_RUNTIME = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/Mac", - ); - GCC_PREPROCESSOR_DEFINITIONS = ( - "$(inherited)", - HAVE_OPENSSL, - HAVE_STPNCPY, - HAVE_STPCPY, - HAVE_VASPRINTF, - HAVE_ASPRINTF, - "\"PACKAGE_STRING=\\\"AltServer 1.0\\\"\"", - ); - HEADER_SEARCH_PATHS = ( - "\"$(SRCROOT)/Dependencies/AltSign/Dependencies/ldid/libplist/include\"", - "\"$(SRCROOT)/Dependencies/libimobiledevice\"", - "\"$(SRCROOT)/Dependencies/libimobiledevice/include\"", - "\"$(SRCROOT)/Dependencies/AltSign/Dependencies/OpenSSL/macos/include\"", - "\"$(SRCROOT)/Dependencies/libusbmuxd/include\"", - "\"$(SRCROOT)/Dependencies/AltSign/Dependencies/libzip/lib\"", - "\"$(SRCROOT)/Dependencies/AltSign/Dependencies/ldid/libplist/libcnary/include\"", - "\"${SDKROOT}/usr/include/libxml2\"", - "\"$(SRCROOT)/Dependencies/AltSign/Dependencies/libzip/xcode\"", - ); - INFOPLIST_FILE = AltServer/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - ); - MARKETING_VERSION = 1.7.2b; - PRODUCT_BUNDLE_IDENTIFIER = com.rileytestut.AltServer; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - SWIFT_OBJC_BRIDGING_HEADER = "AltServer/AltServer-Bridging-Header.h"; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - }; - name = Debug; - }; - BF45869C229872EA00BD7491 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 589BA531D903B28F292063E5 /* Pods-AltServer.release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = AltServer/AltServer.entitlements; - CODE_SIGN_IDENTITY = "Mac Developer"; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 84; - DEAD_CODE_STRIPPING = YES; - DEVELOPMENT_TEAM = 6XVY5G3U44; - ENABLE_HARDENED_RUNTIME = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/Mac", - ); - GCC_PREPROCESSOR_DEFINITIONS = ( - "$(inherited)", - HAVE_OPENSSL, - HAVE_STPNCPY, - HAVE_STPCPY, - HAVE_VASPRINTF, - HAVE_ASPRINTF, - "\"PACKAGE_STRING=\\\"AltServer 1.0\\\"\"", - ); - HEADER_SEARCH_PATHS = ( - "\"$(SRCROOT)/Dependencies/AltSign/Dependencies/ldid/libplist/include\"", - "\"$(SRCROOT)/Dependencies/libimobiledevice\"", - "\"$(SRCROOT)/Dependencies/libimobiledevice/include\"", - "\"$(SRCROOT)/Dependencies/AltSign/Dependencies/OpenSSL/macos/include\"", - "\"$(SRCROOT)/Dependencies/libusbmuxd/include\"", - "\"$(SRCROOT)/Dependencies/AltSign/Dependencies/libzip/lib\"", - "\"$(SRCROOT)/Dependencies/AltSign/Dependencies/ldid/libplist/libcnary/include\"", - "\"${SDKROOT}/usr/include/libxml2\"", - "\"$(SRCROOT)/Dependencies/AltSign/Dependencies/libzip/xcode\"", - ); - INFOPLIST_FILE = AltServer/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - ); - MARKETING_VERSION = 1.7.2b; - PRODUCT_BUNDLE_IDENTIFIER = com.rileytestut.AltServer; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - SWIFT_OBJC_BRIDGING_HEADER = "AltServer/AltServer-Bridging-Header.h"; - SWIFT_VERSION = 5.0; - }; - name = Release; - }; BF4587342298D31600BD7491 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -3956,10 +3433,11 @@ }; BF66EE872501AE50007EE018 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B3C3960E284F4F9100DA9E2F /* AltStoreCore.xcconfig */; + baseConfigurationReference = E9547974791D7384C45A57D7 /* Pods-AltStoreCore.debug.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 1; @@ -3993,10 +3471,11 @@ }; BF66EE882501AE50007EE018 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B3C3960E284F4F9100DA9E2F /* AltStoreCore.xcconfig */; + baseConfigurationReference = 6D1CADCE97AF931337C66730 /* Pods-AltStoreCore.release.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 1; @@ -4040,14 +3519,14 @@ CODE_SIGN_ENTITLEMENTS = AltWidget/AltWidgetExtension.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 31; + CURRENT_PROJECT_VERSION = 6; DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_ASSET_PATHS = AltWidget/Previews.xcassets; DEVELOPMENT_TEAM = "$(DEVELOPMENT_TEAM)"; ENABLE_DEBUG_DYLIB = NO; FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - CURRENT_PROJECT_VERSION = 6; - DEVELOPMENT_ASSET_PATHS = AltWidget/Previews.xcassets; INFOPLIST_FILE = AltWidget/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -4075,12 +3554,13 @@ CODE_SIGN_ENTITLEMENTS = AltWidget/AltWidgetExtension.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 31; + DEVELOPMENT_ASSET_PATHS = AltWidget/Previews.xcassets; DEVELOPMENT_TEAM = "$(DEVELOPMENT_TEAM)"; ENABLE_DEBUG_DYLIB = NO; FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - CURRENT_PROJECT_VERSION = 31; - DEVELOPMENT_ASSET_PATHS = AltWidget/Previews.xcassets; INFOPLIST_FILE = AltWidget/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -4235,7 +3715,7 @@ }; BFD2477F2284B9A700981D42 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B3C3960B284F4C9800DA9E2F /* AltStore.xcconfig */; + baseConfigurationReference = E0041AC42492DA27A05E35DF /* Pods-SideStore.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; @@ -4244,8 +3724,8 @@ CODE_SIGN_ENTITLEMENTS = AltStore/AltStore.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = "$(DEVELOPMENT_TEAM)"; CURRENT_PROJECT_VERSION = 31; + DEVELOPMENT_TEAM = "$(DEVELOPMENT_TEAM)"; ENABLE_BITCODE = NO; ENABLE_DEBUG_DYLIB = NO; GCC_UNROLL_LOOPS = YES; @@ -4277,7 +3757,7 @@ }; BFD247802284B9A700981D42 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B3C3960B284F4C9800DA9E2F /* AltStore.xcconfig */; + baseConfigurationReference = 9ACEAECC253184BCA8E3E068 /* Pods-SideStore.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; @@ -4286,8 +3766,8 @@ CODE_SIGN_ENTITLEMENTS = AltStore/AltStore.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = "$(DEVELOPMENT_TEAM)"; CURRENT_PROJECT_VERSION = 31; + DEVELOPMENT_TEAM = "$(DEVELOPMENT_TEAM)"; ENABLE_BITCODE = NO; ENABLE_DEBUG_DYLIB = NO; GCC_OPTIMIZATION_LEVEL = fast; @@ -4319,142 +3799,6 @@ }; name = Release; }; - D586D39E28EF58B0000E101F /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEAD_CODE_STRIPPING = YES; - DEBUG_INFORMATION_FORMAT = dwarf; - DEVELOPMENT_TEAM = 6XVY5G3U44; - GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.rileytestut.AltTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = auto; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_EMIT_LOC_STRINGS = NO; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/AltStore.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/AltStore"; - }; - name = Debug; - }; - D586D39F28EF58B0000E101F /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEAD_CODE_STRIPPING = YES; - DEVELOPMENT_TEAM = 6XVY5G3U44; - GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.rileytestut.AltTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = auto; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; - SWIFT_EMIT_LOC_STRINGS = NO; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/AltStore.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/AltStore"; - }; - name = Release; - }; - D5FB7A182AA284BE00EF863D /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; - CREATE_INFOPLIST_SECTION_IN_BINARY = YES; - CURRENT_PROJECT_VERSION = 2; - DEBUG_INFORMATION_FORMAT = dwarf; - DEVELOPMENT_TEAM = 6XVY5G3U44; - ENABLE_HARDENED_RUNTIME = YES; - ENABLE_USER_SCRIPT_SANDBOXING = YES; - GCC_C_LANGUAGE_STANDARD = gnu17; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - "ALTJIT=1", - ); - GENERATE_INFOPLIST_FILE = YES; - LD_RUNPATH_SEARCH_PATHS = ( - "@executable_path/../Frameworks", - "@executable_path/AltServer.app/Contents/Frameworks", - ); - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(SDKROOT)/usr/lib/system", - ); - LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MACOSX_DEPLOYMENT_TARGET = 13.0; - MARKETING_VERSION = 1.0.1; - OTHER_SWIFT_FLAGS = ""; - PRODUCT_BUNDLE_IDENTIFIER = com.rileytestut.AltJIT; - PRODUCT_NAME = altjit; - PROVISIONING_PROFILE_SPECIFIER = ""; - SDKROOT = macosx; - SKIP_INSTALL = YES; - SWIFT_OBJC_BRIDGING_HEADER = "AltJIT/AltJIT-Bridging-Header.h"; - SWIFT_VERSION = 5.0; - }; - name = Debug; - }; - D5FB7A192AA284BE00EF863D /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; - CREATE_INFOPLIST_SECTION_IN_BINARY = YES; - CURRENT_PROJECT_VERSION = 2; - DEVELOPMENT_TEAM = 6XVY5G3U44; - ENABLE_HARDENED_RUNTIME = YES; - ENABLE_USER_SCRIPT_SANDBOXING = YES; - GCC_C_LANGUAGE_STANDARD = gnu17; - GCC_PREPROCESSOR_DEFINITIONS = ( - "$(inherited)", - "ALTJIT=1", - ); - GENERATE_INFOPLIST_FILE = YES; - LD_RUNPATH_SEARCH_PATHS = ( - "@executable_path/../Frameworks", - "@executable_path/AltServer.app/Contents/Frameworks", - ); - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(SDKROOT)/usr/lib/system", - ); - LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MACOSX_DEPLOYMENT_TARGET = 13.0; - MARKETING_VERSION = 1.0.1; - OTHER_SWIFT_FLAGS = ""; - PRODUCT_BUNDLE_IDENTIFIER = com.rileytestut.AltJIT; - PRODUCT_NAME = altjit; - PROVISIONING_PROFILE_SPECIFIER = ""; - SDKROOT = macosx; - SKIP_INSTALL = YES; - SWIFT_OBJC_BRIDGING_HEADER = "AltJIT/AltJIT-Bridging-Header.h"; - SWIFT_VERSION = 5.0; - }; - name = Release; - }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -4539,26 +3883,9 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - D5FB7A172AA284BE00EF863D /* Build configuration list for PBXNativeTarget "AltJIT" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - D5FB7A182AA284BE00EF863D /* Debug */, - D5FB7A192AA284BE00EF863D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; /* End XCConfigurationList section */ /* Begin XCRemoteSwiftPackageReference section */ - 4879A95D2861046500FC1BBD /* XCRemoteSwiftPackageReference "AltSign" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/SideStore/AltSign"; - requirement = { - branch = master; - kind = branch; - }; - }; 4879A9602861049C00FC1BBD /* XCRemoteSwiftPackageReference "OpenSSL" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/krzyzanowskim/OpenSSL"; @@ -4567,60 +3894,12 @@ minimumVersion = 1.1.180; }; }; - 9922FFEA29B501C50020F868 /* XCRemoteSwiftPackageReference "Starscream" */ = { + A82067C22D03E0DE00645C0D /* XCRemoteSwiftPackageReference "SemanticVersion" */ = { isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/daltoniam/Starscream.git"; + repositoryURL = "https://github.com/SwiftPackageIndex/SemanticVersion"; requirement = { kind = upToNextMajorVersion; - minimumVersion = 4.0.0; - }; - }; - 99C4EF472978D52400CB538D /* XCRemoteSwiftPackageReference "SemanticVersion" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/SwiftPackageIndex/SemanticVersion.git"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 0.3.5; - }; - }; - B3C395EF284F2DE700DA9E2F /* XCRemoteSwiftPackageReference "KeychainAccess" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/kishikawakatsumi/KeychainAccess.git"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 4.2.0; - }; - }; - B3C395F2284F35DD00DA9E2F /* XCRemoteSwiftPackageReference "Nuke" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/kean/Nuke.git"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 7.0.0; - }; - }; - B3C395F5284F362400DA9E2F /* XCRemoteSwiftPackageReference "appcenter-sdk-apple" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/microsoft/appcenter-sdk-apple.git"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 4.2.0; - }; - }; - B3C395FA284F3B2400DA9E2F /* XCRemoteSwiftPackageReference "Sparkle" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/sparkle-project/Sparkle.git"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 2.1.0; - }; - }; - B3C395FD284F3C0900DA9E2F /* XCRemoteSwiftPackageReference "STPrivilegedTask" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/JoeMatt/STPrivilegedTask.git"; - requirement = { - branch = master; - kind = branch; + minimumVersion = 0.4.0; }; }; D58D5F2C26DFE68E00E55E38 /* XCRemoteSwiftPackageReference "LaunchAtLogin" */ = { @@ -4652,59 +3931,14 @@ package = 4879A9602861049C00FC1BBD /* XCRemoteSwiftPackageReference "OpenSSL" */; productName = OpenSSL; }; - 4879A95E2861046500FC1BBD /* AltSign */ = { + A82067C32D03E0DE00645C0D /* SemanticVersion */ = { isa = XCSwiftPackageProductDependency; - package = 4879A95D2861046500FC1BBD /* XCRemoteSwiftPackageReference "AltSign" */; - productName = AltSign; - }; - D52DD35D2AAA89A600A7F2B6 /* AltSign-Dynamic */ = { - isa = XCSwiftPackageProductDependency; - productName = "AltSign-Dynamic"; - }; - D561B2EA28EF5A4F006752E4 /* AltSign-Dynamic */ = { - isa = XCSwiftPackageProductDependency; - package = 4879A9602861049C00FC1BBD /* XCRemoteSwiftPackageReference "OpenSSL" */; - productName = OpenSSL; - }; - 9922FFEB29B501C50020F868 /* Starscream */ = { - isa = XCSwiftPackageProductDependency; - package = 9922FFEA29B501C50020F868 /* XCRemoteSwiftPackageReference "Starscream" */; - productName = Starscream; - }; - 99C4EF4C2979132100CB538D /* SemanticVersion */ = { - isa = XCSwiftPackageProductDependency; - package = 99C4EF472978D52400CB538D /* XCRemoteSwiftPackageReference "SemanticVersion" */; + package = A82067C22D03E0DE00645C0D /* XCRemoteSwiftPackageReference "SemanticVersion" */; productName = SemanticVersion; }; - 99C4EF50297994E200CB538D /* SemanticVersion */ = { + A8A74EEB2D03F55C001B5CFD /* AltSign-Static */ = { isa = XCSwiftPackageProductDependency; - package = 99C4EF472978D52400CB538D /* XCRemoteSwiftPackageReference "SemanticVersion" */; - productName = SemanticVersion; - }; - B3C395F0284F2DE700DA9E2F /* KeychainAccess */ = { - isa = XCSwiftPackageProductDependency; - package = B3C395EF284F2DE700DA9E2F /* XCRemoteSwiftPackageReference "KeychainAccess" */; - productName = KeychainAccess; - }; - B3C395F3284F35DD00DA9E2F /* Nuke */ = { - isa = XCSwiftPackageProductDependency; - package = B3C395F2284F35DD00DA9E2F /* XCRemoteSwiftPackageReference "Nuke" */; - productName = Nuke; - }; - B3C395F6284F362400DA9E2F /* AppCenterAnalytics */ = { - isa = XCSwiftPackageProductDependency; - package = B3C395F5284F362400DA9E2F /* XCRemoteSwiftPackageReference "appcenter-sdk-apple" */; - productName = AppCenterAnalytics; - }; - B3C395F8284F362400DA9E2F /* AppCenterCrashes */ = { - isa = XCSwiftPackageProductDependency; - package = B3C395F5284F362400DA9E2F /* XCRemoteSwiftPackageReference "appcenter-sdk-apple" */; - productName = AppCenterCrashes; - }; - D5FB7A2D2AA2859400EF863D /* ArgumentParser */ = { - isa = XCSwiftPackageProductDependency; - package = D5FB7A2C2AA2859400EF863D /* XCRemoteSwiftPackageReference "swift-argument-parser" */; - productName = ArgumentParser; + productName = "AltSign-Static"; }; /* End XCSwiftPackageProductDependency section */ diff --git a/AltStore.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/AltStore.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved deleted file mode 100644 index 695b2521..00000000 --- a/AltStore.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ /dev/null @@ -1,114 +0,0 @@ -{ - "originHash" : "ee46302f91cbb62c5234c36750d40856658e961e191f5536cf4fe74d10fc2c94", - "pins" : [ - { - "identity" : "altsign", - "kind" : "remoteSourceControl", - "location" : "https://github.com/SideStore/AltSign", - "state" : { - "branch" : "master", - "revision" : "4323ff794e600ce1759cb6ea57275e13b7ea72f2" - } - }, - { - "identity" : "appcenter-sdk-apple", - "kind" : "remoteSourceControl", - "location" : "https://github.com/microsoft/appcenter-sdk-apple.git", - "state" : { - "revision" : "b2dc99cfedead0bad4e6573d86c5228c89cff332", - "version" : "4.4.3" - } - }, - { - "identity" : "imobiledevice.swift", - "kind" : "remoteSourceControl", - "location" : "https://github.com/SideStore/iMobileDevice.swift", - "state" : { - "revision" : "74e481106dd155c0cd21bca6795fd9fe5f751654", - "version" : "1.0.5" - } - }, - { - "identity" : "keychainaccess", - "kind" : "remoteSourceControl", - "location" : "https://github.com/kishikawakatsumi/KeychainAccess.git", - "state" : { - "revision" : "84e546727d66f1adc5439debad16270d0fdd04e7", - "version" : "4.2.2" - } - }, - { - "identity" : "launchatlogin", - "kind" : "remoteSourceControl", - "location" : "https://github.com/sindresorhus/LaunchAtLogin.git", - "state" : { - "revision" : "e8171b3e38a2816f579f58f3dac1522aa39efe41", - "version" : "4.2.0" - } - }, - { - "identity" : "nuke", - "kind" : "remoteSourceControl", - "location" : "https://github.com/kean/Nuke.git", - "state" : { - "revision" : "9318d02a8a6d20af56505c9673261c1fd3b3aebe", - "version" : "7.6.3" - } - }, - { - "identity" : "openssl", - "kind" : "remoteSourceControl", - "location" : "https://github.com/krzyzanowskim/OpenSSL", - "state" : { - "revision" : "8cb1d641ab5ebce2cd7cf31c93baef07bed672d4", - "version" : "1.1.2301" - } - }, - { - "identity" : "plcrashreporter", - "kind" : "remoteSourceControl", - "location" : "https://github.com/microsoft/PLCrashReporter.git", - "state" : { - "revision" : "81cdec2b3827feb03286cb297f4c501a8eb98df1", - "version" : "1.10.2" - } - }, - { - "identity" : "semanticversion", - "kind" : "remoteSourceControl", - "location" : "https://github.com/SwiftPackageIndex/SemanticVersion.git", - "state" : { - "revision" : "ea8eea9d89842a29af1b8e6c7677f1c86e72fa42", - "version" : "0.4.0" - } - }, - { - "identity" : "sparkle", - "kind" : "remoteSourceControl", - "location" : "https://github.com/sparkle-project/Sparkle.git", - "state" : { - "revision" : "0ef1ee0220239b3776f433314515fd849025673f", - "version" : "2.6.4" - } - }, - { - "identity" : "starscream", - "kind" : "remoteSourceControl", - "location" : "https://github.com/daltoniam/Starscream.git", - "state" : { - "revision" : "c6bfd1af48efcc9a9ad203665db12375ba6b145a", - "version" : "4.0.8" - } - }, - { - "identity" : "stprivilegedtask", - "kind" : "remoteSourceControl", - "location" : "https://github.com/JoeMatt/STPrivilegedTask.git", - "state" : { - "branch" : "master", - "revision" : "10a9150ef32d444af326beba76356ae9af95a3e7" - } - } - ], - "version" : 3 -} diff --git a/AltStore.xcworkspace/contents.xcworkspacedata b/AltStore.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..11a7a531 --- /dev/null +++ b/AltStore.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,16 @@ + + + + + + + + + + + diff --git a/AltStore.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/AltStore.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/AltStore.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/AltStore.xcworkspace/xcshareddata/swiftpm/Package.resolved b/AltStore.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 00000000..38219a31 --- /dev/null +++ b/AltStore.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,33 @@ +{ + "originHash" : "e97900bbb49eb7423d5c5ecbf132d2d5761c401e2444f3c8e6cbfa7014ad9c53", + "pins" : [ + { + "identity" : "launchatlogin", + "kind" : "remoteSourceControl", + "location" : "https://github.com/sindresorhus/LaunchAtLogin.git", + "state" : { + "revision" : "e8171b3e38a2816f579f58f3dac1522aa39efe41", + "version" : "4.2.0" + } + }, + { + "identity" : "semanticversion", + "kind" : "remoteSourceControl", + "location" : "https://github.com/SwiftPackageIndex/SemanticVersion", + "state" : { + "revision" : "ea8eea9d89842a29af1b8e6c7677f1c86e72fa42", + "version" : "0.4.0" + } + }, + { + "identity" : "swift-argument-parser", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-argument-parser.git", + "state" : { + "revision" : "8f4d2753f0e4778c76d5f05ad16c74f707390531", + "version" : "1.2.3" + } + } + ], + "version" : 3 +} diff --git a/AltStore/AltStore.entitlements b/AltStore/AltStore.entitlements index f6d2b9f4..27c6a878 100644 --- a/AltStore/AltStore.entitlements +++ b/AltStore/AltStore.entitlements @@ -8,6 +8,8 @@ com.apple.developer.kernel.increased-memory-limit + aps-environment + development com.apple.developer.siri com.apple.security.application-groups diff --git a/AltStore/Analytics/AnalyticsManager.swift b/AltStore/Analytics/AnalyticsManager.swift index e8d60914..d50cad78 100644 --- a/AltStore/Analytics/AnalyticsManager.swift +++ b/AltStore/Analytics/AnalyticsManager.swift @@ -14,7 +14,13 @@ import AppCenter import AppCenterAnalytics import AppCenterCrashes +#if DEBUG private let appCenterAppSecret = "73532d3e-e573-4693-99a4-9f85840bbb44" +#elseif RELEASE +private let appCenterAppSecret = "73532d3e-e573-4693-99a4-9f85840bbb44" +#else +private let appCenterAppSecret = "73532d3e-e573-4693-99a4-9f85840bbb44" +#endif extension AnalyticsManager { diff --git a/AltStore/App Detail/AppContentViewController.swift b/AltStore/App Detail/AppContentViewController.swift index 2cc4a544..1c66f09d 100644 --- a/AltStore/App Detail/AppContentViewController.swift +++ b/AltStore/App Detail/AppContentViewController.swift @@ -29,7 +29,7 @@ final class AppContentViewController: UITableViewController { var app: StoreApp! - private lazy var screenshotsDataSource = self.makeScreenshotsDataSource() +// private lazy var screenshotsDataSource = self.makeScreenshotsDataSource() private lazy var dateFormatter: DateFormatter = { let dateFormatter = DateFormatter() dateFormatter.dateStyle = .medium @@ -186,7 +186,7 @@ extension AppContentViewController switch Row.allCases[indexPath.row] { case .screenshots: - guard !self.app.allScreenshots.isEmpty else { return 0.0 } + guard !self.app.screenshots.isEmpty else { return 0.0 } return UITableView.automaticDimension case .permissions: diff --git a/AltStore/App Detail/AppViewController.swift b/AltStore/App Detail/AppViewController.swift index e4cbc46d..e0e1c930 100644 --- a/AltStore/App Detail/AppViewController.swift +++ b/AltStore/App Detail/AppViewController.swift @@ -207,7 +207,21 @@ final class AppViewController: UIViewController self._shouldResetLayout = false } - let statusBarHeight = (self.view.window ?? self.presentedViewController?.view.window)?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0 + let statusBarHeight: Double + + if let navigationController, navigationController.presentingViewController != nil, navigationController.modalPresentationStyle != .fullScreen + { + statusBarHeight = 20 + } + else if let statusBarManager = (self.view.window ?? self.presentedViewController?.view.window)?.windowScene?.statusBarManager + { + statusBarHeight = statusBarManager.statusBarFrame.height + } + else + { + statusBarHeight = 0 + } + let cornerRadius = self.contentViewControllerShadowView.layer.cornerRadius let inset = 12 as CGFloat @@ -562,8 +576,6 @@ extension AppViewController } DispatchQueue.main.async { - let toastView = ToastView(error: error, opensLog: true) - toastView.show(in: self) self.bannerView.button.progress = nil self.navigationBarDownloadButton.progress = nil self.update() diff --git a/AltStore/App IDs/AppIDsViewController.swift b/AltStore/App IDs/AppIDsViewController.swift index 5fd46c8d..4d4f03b8 100644 --- a/AltStore/App IDs/AppIDsViewController.swift +++ b/AltStore/App IDs/AppIDsViewController.swift @@ -93,19 +93,20 @@ private extension AppIDsViewController cell.bannerView.buttonLabel.isHidden = false let currentDate = Date() - + let formatter = DateComponentsFormatter() formatter.unitsStyle = .full formatter.includesApproximationPhrase = false formatter.includesTimeRemainingPhrase = false formatter.allowedUnits = [.minute, .hour, .day] formatter.maximumUnitCount = 1 - - cell.bannerView.button.setTitle((formatter.string(from: currentDate, to: expirationDate) ?? NSLocalizedString("Unknown", comment: "")).uppercased(), for: .normal) + + let timeInterval = formatter.string(from: currentDate, to: expirationDate) + let timeIntervalText = timeInterval ?? NSLocalizedString("Unknown", comment: "") + cell.bannerView.button.setTitle(timeIntervalText.uppercased(), for: .normal) // formatter.includesTimeRemainingPhrase = true - - // attributedAccessibilityLabel.mutableString.append((formatter.string(from: currentDate, to: expirationDate) ?? NSLocalizedString("Unknown", comment: "")) + " ") + attributedAccessibilityLabel.mutableString.append(timeIntervalText) } else { diff --git a/AltStore/AppDelegate.swift b/AltStore/AppDelegate.swift index fc8c84b5..18747746 100644 --- a/AltStore/AppDelegate.swift +++ b/AltStore/AppDelegate.swift @@ -63,7 +63,10 @@ final class AppDelegate: UIResponder, UIApplicationDelegate { self.setTintColor() self.prepareImageCache() - + + // TODO: @mahee96: find if we need to start em_proxy as in altstore? + // start_em_proxy(bind_addr: Consts.Proxy.serverURL) + SecureValueTransformer.register() if UserDefaults.standard.firstLaunch == nil @@ -86,7 +89,8 @@ final class AppDelegate: UIResponder, UIApplicationDelegate { func applicationDidEnterBackground(_ application: UIApplication) { // Make sure to update SceneDelegate.sceneDidEnterBackground() as well. - + // TODO: @mahee96: find if we need to stop em_proxy as in altstore? + // stop_em_proxy() guard let oneMonthAgo = Calendar.current.date(byAdding: .month, value: -1, to: Date()) else { return } let midnightOneMonthAgo = Calendar.current.startOfDay(for: oneMonthAgo) @@ -104,6 +108,8 @@ final class AppDelegate: UIResponder, UIApplicationDelegate { { AppManager.shared.update() start_em_proxy(bind_addr: Consts.Proxy.serverURL) + + PatreonAPI.shared.refreshPatreonAccount() } func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any]) -> Bool diff --git a/AltStore/Authentication/Authentication.storyboard b/AltStore/Authentication/Authentication.storyboard index 98057985..b2f0647a 100644 --- a/AltStore/Authentication/Authentication.storyboard +++ b/AltStore/Authentication/Authentication.storyboard @@ -14,7 +14,7 @@ - + @@ -42,13 +42,13 @@ - + @@ -57,13 +57,13 @@ - - - - - - - - - - - - - - - - - - - - - - @@ -495,7 +444,7 @@ World - + @@ -520,7 +469,7 @@ World - + @@ -790,7 +739,7 @@ World - + @@ -851,15 +800,16 @@ World - + - + + @@ -990,11 +940,12 @@ World + - + diff --git a/AltStore/Browse/BrowseCollectionViewCell.swift b/AltStore/Browse/BrowseCollectionViewCell.swift deleted file mode 100644 index bcbf8ff6..00000000 --- a/AltStore/Browse/BrowseCollectionViewCell.swift +++ /dev/null @@ -1,96 +0,0 @@ -// -// BrowseCollectionViewCell.swift -// AltStore -// -// Created by Riley Testut on 7/15/19. -// Copyright © 2019 Riley Testut. All rights reserved. -// - -import UIKit - -import Roxas - -import Nuke - -@objc final class BrowseCollectionViewCell: UICollectionViewCell -{ - var imageURLs: [URL] = [] { - didSet { - self.dataSource.items = self.imageURLs as [NSURL] - } - } - private lazy var dataSource = self.makeDataSource() - - @IBOutlet var bannerView: AppBannerView! - @IBOutlet var subtitleLabel: UILabel! - - @IBOutlet private(set) var screenshotsCollectionView: UICollectionView! - - override func awakeFromNib() - { - super.awakeFromNib() - - self.contentView.preservesSuperviewLayoutMargins = true - - // Must be registered programmatically, not in BrowseCollectionViewCell.xib, or else it'll throw an exception 🤷‍♂️. - self.screenshotsCollectionView.register(ScreenshotCollectionViewCell.self, forCellWithReuseIdentifier: RSTCellContentGenericCellIdentifier) - - self.screenshotsCollectionView.delegate = self - self.screenshotsCollectionView.dataSource = self.dataSource - self.screenshotsCollectionView.prefetchDataSource = self.dataSource - } -} - -private extension BrowseCollectionViewCell -{ - func makeDataSource() -> RSTArrayCollectionViewPrefetchingDataSource - { - let dataSource = RSTArrayCollectionViewPrefetchingDataSource(items: []) - dataSource.cellConfigurationHandler = { (cell, screenshot, indexPath) in - let cell = cell as! ScreenshotCollectionViewCell - cell.imageView.image = nil - cell.imageView.isIndicatingActivity = true - } - dataSource.prefetchHandler = { (imageURL, indexPath, completionHandler) in - return RSTAsyncBlockOperation() { (operation) in - let request = ImageRequest(url: imageURL as URL) - ImagePipeline.shared.loadImage(with: request, progress: nil) { result in - guard !operation.isCancelled else { return operation.finish() } - - switch result - { - case .success(let response): completionHandler(response.image, nil) - case .failure(let error): completionHandler(nil, error) - } - } - } - } - dataSource.prefetchCompletionHandler = { (cell, image, indexPath, error) in - let cell = cell as! ScreenshotCollectionViewCell - cell.imageView.isIndicatingActivity = false - cell.imageView.image = image - - if let error = error - { - print("Error loading image:", error) - } - } - - return dataSource - } -} - -extension BrowseCollectionViewCell: UICollectionViewDelegateFlowLayout -{ - func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize - { - // Assuming 9.0 / 16.0 ratio for now. - let aspectRatio: CGFloat = 9.0 / 16.0 - - let itemHeight = collectionView.bounds.height - let itemWidth = itemHeight * aspectRatio - - let size = CGSize(width: itemWidth.rounded(.down), height: itemHeight.rounded(.down)) - return size - } -} diff --git a/AltStore/Browse/BrowseCollectionViewCell.xib b/AltStore/Browse/BrowseCollectionViewCell.xib deleted file mode 100644 index ecd02b4e..00000000 --- a/AltStore/Browse/BrowseCollectionViewCell.xib +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/AltStore/Browse/BrowseViewController.swift b/AltStore/Browse/BrowseViewController.swift index affc5f27..2efdaf1e 100644 --- a/AltStore/Browse/BrowseViewController.swift +++ b/AltStore/Browse/BrowseViewController.swift @@ -296,7 +296,6 @@ private extension BrowseViewController func updateDataSource() { - self.dataSource.predicate = nil let fetchRequest = self.makeFetchRequest() let context = self.source?.managedObjectContext ?? DatabaseManager.shared.viewContext diff --git a/AltStore/Components/NavigationBar.swift b/AltStore/Components/NavigationBar.swift index dad02c0b..9a28ebb6 100644 --- a/AltStore/Components/NavigationBar.swift +++ b/AltStore/Components/NavigationBar.swift @@ -10,7 +10,7 @@ import UIKit import Roxas -final class NavigationBar: UINavigationBar +class NavigationBarAppearance: UINavigationBarAppearance { // We sometimes need to ignore user interaction so // we can tap items underneath the navigation bar. diff --git a/AltStore/Components/ToastView.swift b/AltStore/Components/ToastView.swift index e1ae7157..77c93212 100644 --- a/AltStore/Components/ToastView.swift +++ b/AltStore/Components/ToastView.swift @@ -16,10 +16,13 @@ extension TimeInterval static let longToastViewDuration = 8.0 } -final class ToastView: RSTToastView +extension ToastView { static let openErrorLogNotification = Notification.Name("ALTOpenErrorLogNotification") +} +class ToastView: RSTToastView +{ var preferredDuration: TimeInterval var opensErrorLog: Bool = false @@ -72,6 +75,7 @@ final class ToastView: RSTToastView error.domain == AltServerErrorDomain && error.code == ALTServerError.Code.underlyingError.rawValue { // Treat underlyingError as the primary error, but keep localized title + failure. + let nsError = error as NSError error = unwrappedUnderlyingError as NSError @@ -138,12 +142,6 @@ final class ToastView: RSTToastView { self.show(in: view, duration: self.preferredDuration) } - - @objc - func showErrorLog() { - guard self.opensErrorLog else { return } - NotificationCenter.default.post(name: ToastView.openErrorLogNotification, object: self) - } } private extension ToastView diff --git a/AltStore/Managing Apps/AppManagerErrors.swift b/AltStore/Managing Apps/AppManagerErrors.swift index 3e51f80c..014b564f 100644 --- a/AltStore/Managing Apps/AppManagerErrors.swift +++ b/AltStore/Managing Apps/AppManagerErrors.swift @@ -30,7 +30,9 @@ extension AppManager } else if self.errors.count == 1 { guard let source = self.errors.keys.first else { return } localizedTitle = String(format: NSLocalizedString("Failed to refresh Source '%@'", comment: ""), source.name) - } else { + } + else + { localizedTitle = String(format: NSLocalizedString("Failed to refresh %@ Sources", comment: ""), NSNumber(value: self.errors.count)) } } @@ -42,7 +44,9 @@ extension AppManager return error.localizedDescription } else if let error = self.errors.values.first, self.errors.count == 1 { return error.localizedDescription - } else { + } + else + { var localizedDescription: String? self.managedObjectContext?.performAndWait { diff --git a/AltStore/My Apps/MyAppsViewController.swift b/AltStore/My Apps/MyAppsViewController.swift index 91e16e9c..e34fdca6 100644 --- a/AltStore/My Apps/MyAppsViewController.swift +++ b/AltStore/My Apps/MyAppsViewController.swift @@ -356,11 +356,11 @@ private extension MyAppsViewController formatter.maximumUnitCount = 1 - - cell.bannerView.button.setTitle(formatter.string(from: currentDate, to: installedApp.expirationDate)?.uppercased(), for: .normal) + let timeInterval = formatter.string(from: currentDate, to: installedApp.expirationDate) + cell.bannerView.button.setTitle(timeInterval?.uppercased(), for: .normal) cell.bannerView.button.isIndicatingActivity = false - cell.bannerView.configure(for: installedApp, action: .custom(numberOfDaysText.uppercased())) + cell.bannerView.configure(for: installedApp, action: .custom((timeInterval?.uppercased())!)) cell.bannerView.iconImageView.isIndicatingActivity = true @@ -387,7 +387,7 @@ private extension MyAppsViewController cell.bannerView.button.alpha = 1.0 } - cell.bannerView.accessibilityLabel? += ". " + String(format: NSLocalizedString("Expires in %@", comment: ""), numberOfDaysText) + cell.bannerView.accessibilityLabel? += ". " + String(format: NSLocalizedString("Expires in %@", comment: ""), timeInterval!) // Make sure refresh button is correct size. cell.layoutIfNeeded() @@ -529,11 +529,10 @@ private extension MyAppsViewController print("[ALTLog] Failed to fetch updates:", error) } - if let patreonAccount = DatabaseManager.shared.patreonAccount(), patreonAccount.isPatron, PatreonAPI.shared.isAuthenticated + if let patreonAccount = DatabaseManager.shared.patreonAccount(), patreonAccount.isAltStorePatron, PatreonAPI.shared.isAuthenticated { self.dataSource.predicate = nil - - + } } } @@ -1023,7 +1022,7 @@ private extension MyAppsViewController { message = NSLocalizedString("Non-developer Apple IDs are limited to 3 apps. Inactive apps are backed up and uninstalled so they don't count towards your total, but will be reinstalled with all their data when activated again.", comment: "") - if UserDefaults.standard.ignoreActiveAppsLimit + if UserDefaults.standard.isAppLimitDisabled { message += "\n\n" message += NSLocalizedString("If you're using the MacDirtyCow exploit to remove the 3-app limit, you can install up to 10 apps and app extensions instead.", comment: "") diff --git a/AltStore/News/NewsViewController.swift b/AltStore/News/NewsViewController.swift index 45a9a4bd..d3a34f84 100644 --- a/AltStore/News/NewsViewController.swift +++ b/AltStore/News/NewsViewController.swift @@ -360,7 +360,9 @@ private extension NewsViewController { case .failure(OperationError.cancelled): break // Ignore case .failure(let error): - ToastView(error: error, opensLog: true).show(in: self) + let toastView = ToastView(error: error) + toastView.opensErrorLog = true + toastView.show(in: self) case .success: print("Installed app:", storeApp.bundleIdentifier) } diff --git a/AltStore/Operations/AuthenticationOperation.swift b/AltStore/Operations/AuthenticationOperation.swift index 901adffd..7c84de34 100644 --- a/AltStore/Operations/AuthenticationOperation.swift +++ b/AltStore/Operations/AuthenticationOperation.swift @@ -244,14 +244,23 @@ final class AuthenticationOperation: ResultOperation<(ALTTeam, ALTCertificate, A { team.isActiveTeam = false } - + let activeAppsMinimumVersion = OperatingSystemVersion(majorVersion: 13, minorVersion: 3, patchVersion: 1) - if team.type == .free, !UserDefaults.standard.isAppLimitDisabled, ProcessInfo().sparseRestorePatched { - UserDefaults.standard.activeAppsLimit = ALTActiveAppsLimit - } else if UserDefaults.standard.isAppLimitDisabled, !ProcessInfo().sparseRestorePatched { - UserDefaults.standard.activeAppsLimit = 10 - } else { - UserDefaults.standard.activeAppsLimit = nil + + let isMinimumVersionMatching = ProcessInfo.processInfo.isOperatingSystemAtLeast(activeAppsMinimumVersion) + let isSparseRestorePatched = ProcessInfo().sparseRestorePatched + let isAppLimitDisabled = UserDefaults.standard.isAppLimitDisabled + + UserDefaults.standard.activeAppsLimit = nil + // TODO: @mahee96: is the minimum ver match for ios 13.3.1 check required? + // if so what is the app limit? As nil app limit specifies unlimited apps?! + if team.type == .free//, isMinimumVersionMatching + { + if (!isAppLimitDisabled && isSparseRestorePatched) || + (isAppLimitDisabled && !isSparseRestorePatched) + { + UserDefaults.standard.activeAppsLimit = InstalledApp.freeAccountActiveAppsLimit + } } // Save @@ -620,6 +629,8 @@ private extension AuthenticationOperation } else { + // We don't have private keys for any of the certificates, + // so we need to revoke one and create a new one. replaceCertificate(from: certificates) } } diff --git a/AltStore/Operations/BackgroundRefreshAppsOperation.swift b/AltStore/Operations/BackgroundRefreshAppsOperation.swift index 4a3f38a6..47c6c1ea 100644 --- a/AltStore/Operations/BackgroundRefreshAppsOperation.swift +++ b/AltStore/Operations/BackgroundRefreshAppsOperation.swift @@ -214,7 +214,7 @@ private extension BackgroundRefreshAppsOperation do { let results = try result.get() - shouldPresentAlert = false + shouldPresentAlert = !results.isEmpty for (_, result) in results { @@ -242,6 +242,8 @@ private extension BackgroundRefreshAppsOperation content.title = NSLocalizedString("Failed to Refresh Apps", comment: "") content.body = error.localizedDescription + + shouldPresentAlert = true } if shouldPresentAlert diff --git a/AltStore/Operations/ClearAppCacheOperation.swift b/AltStore/Operations/ClearAppCacheOperation.swift index b290856e..892c4148 100644 --- a/AltStore/Operations/ClearAppCacheOperation.swift +++ b/AltStore/Operations/ClearAppCacheOperation.swift @@ -8,7 +8,7 @@ import Foundation import AltStoreCore -/* + import Nuke @@ -41,7 +41,7 @@ struct BatchError: ALTLocalizedError return message } } -*/ + @objc(ClearAppCacheOperation) class ClearAppCacheOperation: ResultOperation { diff --git a/AltStore/Operations/DeactivateAppOperation.swift b/AltStore/Operations/DeactivateAppOperation.swift index b25cb5dd..de243077 100644 --- a/AltStore/Operations/DeactivateAppOperation.swift +++ b/AltStore/Operations/DeactivateAppOperation.swift @@ -31,7 +31,11 @@ final class DeactivateAppOperation: ResultOperation { super.main() - if let error = self.context.error { return self.finish(.failure(error)) } + if let error = self.context.error + { + self.finish(.failure(error)) + return + } DatabaseManager.shared.persistentContainer.performBackgroundTask { (context) in let installedApp = context.object(with: self.app.objectID) as! InstalledApp diff --git a/AltStore/Operations/DownloadAppOperation.swift b/AltStore/Operations/DownloadAppOperation.swift index 6971cf28..1652a781 100644 --- a/AltStore/Operations/DownloadAppOperation.swift +++ b/AltStore/Operations/DownloadAppOperation.swift @@ -19,24 +19,27 @@ final class DownloadAppOperation: ResultOperation { @Managed private(set) var app: AppProtocol - + let context: InstallAppOperationContext - + private let appName: String private let bundleIdentifier: String + private var sourceURL: URL? private let destinationURL: URL private let session = URLSession(configuration: .default) private let temporaryDirectory = FileManager.default.uniqueTemporaryURL() - + private var downloadPatreonAppContinuation: CheckedContinuation? - + init(app: AppProtocol, destinationURL: URL, context: InstallAppOperationContext) { self.app = app self.context = context + self.appName = app.name self.bundleIdentifier = app.bundleIdentifier + self.sourceURL = app.url self.destinationURL = destinationURL super.init() @@ -57,23 +60,14 @@ final class DownloadAppOperation: ResultOperation print("Downloading App:", self.bundleIdentifier) - - Logger.sideload.notice("Downloading app \(self.bundleIdentifier, privacy: .public)...") - // Set _after_ checking self.context.error to prevent overwriting localized failure for previous errors. self.localizedFailure = String(format: NSLocalizedString("%@ could not be downloaded.", comment: ""), self.appName) - - guard let storeApp = self.app as? StoreApp else { - // Only StoreApp allows falling back to previous versions. - // AppVersion can only install itself, and ALTApplication doesn't have previous versions. - return self.download(self.app) - } - + self.$app.perform { app in do { var appVersion: AppVersion? - + if let version = app as? AppVersion { appVersion = version @@ -83,33 +77,35 @@ final class DownloadAppOperation: ResultOperation guard let latestVersion = storeApp.latestAvailableVersion else { let failureReason = String(format: NSLocalizedString("The latest version of %@ could not be determined.", comment: ""), self.appName) throw OperationError.unknown(failureReason: failureReason) - } - + } + // Attempt to download latest _available_ version, and fall back to older versions if necessary. appVersion = latestVersion } - + if let appVersion { try self.verify(appVersion) } - + self.download(appVersion ?? app) } catch let error as VerificationError where error.code == .iOSVersionNotSupported { - guard let presentingViewController = self.context.presentingViewController, let storeApp = app.storeApp, let latestSupportedVersion = storeApp.latestSupportedVersion + guard let presentingViewController = self.context.presentingViewController, let storeApp = app.storeApp, let latestSupportedVersion = storeApp.latestSupportedVersion, + case let version = latestSupportedVersion.version, + version != storeApp.installedApp?.version else { return self.finish(.failure(error)) } - + if let installedApp = storeApp.installedApp { guard !installedApp.matches(latestSupportedVersion) else { return self.finish(.failure(error)) } } - + let title = NSLocalizedString("Unsupported iOS Version", comment: "") let message = error.localizedDescription + "\n\n" + NSLocalizedString("Would you like to download the last version compatible with this device instead?", comment: "") let localizedVersion = latestSupportedVersion.localizedVersion - + DispatchQueue.main.async { let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert) alertController.addAction(UIAlertAction(title: UIAlertAction.cancel.title, style: UIAlertAction.cancel.style) { _ in @@ -120,19 +116,25 @@ final class DownloadAppOperation: ResultOperation }) presentingViewController.present(alertController, animated: true) } - } catch { + } + catch + { self.finish(.failure(error)) } } } - override func finish(_ result: Result) { - do { + override func finish(_ result: Result) + { + do + { try FileManager.default.removeItem(at: self.temporaryDirectory) - } catch { - print("Failed to remove DownloadAppOperation temporary directory: \(self.temporaryDirectory).", error) - Logger.sideload.error("Failed to remove DownloadAppOperation temporary directory: \(self.temporaryDirectory, privacy: .public). \(error.localizedDescription, privacy: .public)") } + catch + { + print("Failed to remove DownloadAppOperation temporary directory: \(self.temporaryDirectory).", error) + } + super.finish(result) } } @@ -153,274 +155,273 @@ private extension DownloadAppOperation func download(@Managed _ app: AppProtocol) { - guard let sourceURL = $app.url else { return self.finish(.failure(OperationError.appNotFound(name: self.appName))) } - - if let appVersion = app as? AppVersion - { - // All downloads go through this path, and `app` is - // always an AppVersion if downloading from a source, - // so context.appVersion != nil means downloading from source. - self.context.appVersion = appVersion - } - - self.downloadIPA(from: sourceURL) { result in - do + guard let sourceURL = self.sourceURL else { return self.finish(.failure(OperationError.appNotFound(name: self.appName))) + + if let appVersion = app as? AppVersion { - let application = try result.get() - - if self.context.bundleIdentifier == StoreApp.dolphinAppID, self.context.bundleIdentifier != application.bundleIdentifier - { - if var infoPlist = NSDictionary(contentsOf: application.bundle.infoPlistURL) as? [String: Any] - { - // Manually update the app's bundle identifier to match the one specified in the source. - // This allows people who previously installed the app to still update and refresh normally. - infoPlist[kCFBundleIdentifierKey as String] = StoreApp.dolphinAppID - (infoPlist as NSDictionary).write(to: application.bundle.infoPlistURL, atomically: true) - } - } - - self.downloadDependencies(for: application) { result in - do - { - _ = try result.get() - - try FileManager.default.copyItem(at: application.fileURL, to: self.destinationURL, shouldReplace: true) - - guard let copiedApplication = ALTApplication(fileURL: self.destinationURL) else { throw OperationError.invalidApp } - - Logger.sideload.notice("Downloaded app \(copiedApplication.bundleIdentifier, privacy: .public) from \(sourceURL, privacy: .public)") - - self.finish(.success(copiedApplication)) - - self.progress.completedUnitCount += 1 - } - catch - { - self.finish(.failure(error)) - } - } + // All downloads go through this path, and `app` is + // always an AppVersion if downloading from a source, + // so context.appVersion != nil means downloading from source. + self.context.appVersion = appVersion } - catch - { - self.finish(.failure(error)) - } - } - } - - func downloadIPA(from sourceURL: URL, completionHandler: @escaping (Result) -> Void) - { - Task.detached(priority: .userInitiated) { - do - { - let fileURL: URL - - if sourceURL.isFileURL - { - fileURL = sourceURL - self.progress.completedUnitCount += 3 - } - else if let host = sourceURL.host, host.lowercased().hasSuffix("patreon.com") && sourceURL.path.lowercased() == "/file" - { - // Patreon app - fileURL = try await self.downloadPatreonApp(from: sourceURL) - } - else - { - // Regular app - fileURL = try await self.downloadFile(from: sourceURL) - } - - defer { - if !sourceURL.isFileURL - { - try? FileManager.default.removeItem(at: fileURL) - } - } - - var isDirectory: ObjCBool = false - guard FileManager.default.fileExists(atPath: fileURL.path, isDirectory: &isDirectory) else { throw OperationError.appNotFound(name: self.appName) } - try FileManager.default.createDirectory(at: self.temporaryDirectory, withIntermediateDirectories: true, attributes: nil) - - let appBundleURL: URL - - if isDirectory.boolValue - { - // Directory, so assuming this is .app bundle. - guard Bundle(url: fileURL) != nil else { throw OperationError.invalidApp } - - appBundleURL = self.temporaryDirectory.appendingPathComponent(fileURL.lastPathComponent) - try FileManager.default.copyItem(at: fileURL, to: appBundleURL) - } - else - { - // File, so assuming this is a .ipa file. - appBundleURL = try FileManager.default.unzipAppBundle(at: fileURL, toDirectory: self.temporaryDirectory) - - // Use context's temporaryDirectory to ensure .ipa isn't deleted before we're done installing. - let ipaURL = self.context.temporaryDirectory.appendingPathComponent("App.ipa") - try FileManager.default.copyItem(at: fileURL, to: ipaURL) - - self.context.ipaURL = ipaURL - } - - guard let application = ALTApplication(fileURL: appBundleURL) else { throw OperationError.invalidApp } - completionHandler(.success(application)) - } - catch - { - completionHandler(.failure(error)) - } - } - } - - func downloadFile(from downloadURL: URL) async throws -> URL - { - try await withCheckedThrowingContinuation { continuation in - let downloadTask = self.session.downloadTask(with: downloadURL) { (fileURL, response, error) in + downloadIPA(from: sourceURL!) { result in do { - if let response = response as? HTTPURLResponse + let application = try result.get() + + if self.context.bundleIdentifier == StoreApp.dolphinAppID, self.context.bundleIdentifier != application.bundleIdentifier { - guard response.statusCode != 403 else { throw URLError(.noPermissionsToReadFile) } - guard response.statusCode != 404 else { throw CocoaError(.fileNoSuchFile, userInfo: [NSURLErrorKey: downloadURL]) } + if var infoPlist = NSDictionary(contentsOf: application.bundle.infoPlistURL) as? [String: Any] + { + // Manually update the app's bundle identifier to match the one specified in the source. + // This allows people who previously installed the app to still update and refresh normally. + infoPlist[kCFBundleIdentifierKey as String] = StoreApp.dolphinAppID + (infoPlist as NSDictionary).write(to: application.bundle.infoPlistURL, atomically: true) + } } - let (fileURL, _) = try Result((fileURL, response), error).get() - continuation.resume(returning: fileURL) + self.downloadDependencies(for: application) { result in + do + { + _ = try result.get() + + try FileManager.default.copyItem(at: application.fileURL, to: self.destinationURL, shouldReplace: true) + + guard let copiedApplication = ALTApplication(fileURL: self.destinationURL) else { throw OperationError.invalidApp } + self.finish(.success(copiedApplication)) + + self.progress.completedUnitCount += 1 + } + catch + { + self.finish(.failure(error)) + } + } } catch { - continuation.resume(throwing: error) + self.finish(.failure(error)) } } - self.progress.addChild(downloadTask.progress, withPendingUnitCount: 3) - - downloadTask.resume() - } - } - - func downloadPatreonApp(from patreonURL: URL) async throws -> URL - { - guard !UserDefaults.shared.skipPatreonDownloads else { - // Skip all hacks, take user straight to Patreon post. - return try await downloadFromPatreonPost() } - do + func downloadIPA(from sourceURL: URL, completionHandler: @escaping (Result) -> Void) { - // User is pledged to this app, attempt to download. - - let fileURL = try await self.downloadFile(from: patreonURL) - return fileURL + Task.detached(priority: .userInitiated) { + do + { + let fileURL: URL + + if sourceURL.isFileURL + { + fileURL = sourceURL + self.progress.completedUnitCount += 3 + } + else if let host = sourceURL.host, host.lowercased().hasSuffix("patreon.com") && sourceURL.path.lowercased() == "/file" + { + // Patreon app + fileURL = try await downloadPatreonApp(from: sourceURL) + } + else + { + // Regular app + fileURL = try await downloadFile(from: sourceURL) + } + + defer { + if !sourceURL.isFileURL + { + try? FileManager.default.removeItem(at: fileURL) + } + } + + var isDirectory: ObjCBool = false + guard FileManager.default.fileExists(atPath: fileURL.path, isDirectory: &isDirectory) else { throw OperationError.appNotFound(name: self.appName) } + + try FileManager.default.createDirectory(at: self.temporaryDirectory, withIntermediateDirectories: true, attributes: nil) + + let appBundleURL: URL + + if isDirectory.boolValue + { + // Directory, so assuming this is .app bundle. + guard Bundle(url: fileURL) != nil else { throw OperationError.invalidApp } + + appBundleURL = self.temporaryDirectory.appendingPathComponent(fileURL.lastPathComponent) + try FileManager.default.copyItem(at: fileURL, to: appBundleURL) + } + else + { + // File, so assuming this is a .ipa file. + appBundleURL = try FileManager.default.unzipAppBundle(at: fileURL, toDirectory: self.temporaryDirectory) + + // Use context's temporaryDirectory to ensure .ipa isn't deleted before we're done installing. + let ipaURL = self.context.temporaryDirectory.appendingPathComponent("App.ipa") + try FileManager.default.copyItem(at: fileURL, to: ipaURL) + + self.context.ipaURL = ipaURL + } + + guard let application = ALTApplication(fileURL: appBundleURL) else { throw OperationError.invalidApp } + completionHandler(.success(application)) + } + catch + { + completionHandler(.failure(error)) + } + } } - catch URLError.noPermissionsToReadFile + + func downloadFile(from downloadURL: URL) async throws -> URL { - guard let presentingViewController = self.context.presentingViewController else { throw OperationError.pledgeRequired(appName: self.appName) } - - // Attempt to sign-in again in case our Patreon session has expired. try await withCheckedThrowingContinuation { continuation in - PatreonAPI.shared.authenticate(presentingViewController: presentingViewController) { result in + let downloadTask = self.session.downloadTask(with: downloadURL) { (fileURL, response, error) in do { - let account = try result.get() - try account.managedObjectContext?.save() + if let response = response as? HTTPURLResponse + { + guard response.statusCode != 403 else { throw URLError(.noPermissionsToReadFile) } + guard response.statusCode != 404 else { throw CocoaError(.fileNoSuchFile, userInfo: [NSURLErrorKey: downloadURL]) } + } - continuation.resume() + let (fileURL, _) = try Result((fileURL, response), error).get() + try? FileManager.default.removeItem(at: fileURL) + continuation.resume(returning: fileURL) } catch { continuation.resume(throwing: error) } } + self.progress.addChild(downloadTask.progress, withPendingUnitCount: 3) + + downloadTask.resume() + } + } + + func downloadPatreonApp(from patreonURL: URL) async throws -> URL + { + guard !UserDefaults.shared.skipPatreonDownloads else { + // Skip all hacks, take user straight to Patreon post. + return try await downloadFromPatreonPost() } do { - // Success, so try to download once more now that we're definitely authenticated. + // User is pledged to this app, attempt to download. - let fileURL = try await self.downloadFile(from: patreonURL) + let fileURL = try await downloadFile(from: patreonURL) return fileURL } catch URLError.noPermissionsToReadFile { - // We know authentication succeeded, so failure must mean user isn't patron/on the correct tier, - // or that our hacky workaround for downloading Patreon attachments has failed. - // Either way, taking them directly to the post serves as a decent fallback. + guard let presentingViewController = self.context.presentingViewController else { throw OperationError.pledgeRequired(appName: self.appName) } - return try await downloadFromPatreonPost() + // Attempt to sign-in again in case our Patreon session has expired. + try await withCheckedThrowingContinuation { continuation in + PatreonAPI.shared.authenticate(presentingViewController: presentingViewController) { result in + do + { + let account = try result.get() + try account.managedObjectContext?.save() + + continuation.resume() + } + catch + { + continuation.resume(throwing: error) + } + } + } + + do + { + // Success, so try to download once more now that we're definitely authenticated. + + let fileURL = try await downloadFile(from: patreonURL) + return fileURL + } + catch URLError.noPermissionsToReadFile + { + // We know authentication succeeded, so failure must mean user isn't patron/on the correct tier, + // or that our hacky workaround for downloading Patreon attachments has failed. + // Either way, taking them directly to the post serves as a decent fallback. + + return try await downloadFromPatreonPost() + } + } + + func downloadFromPatreonPost() async throws -> URL + { + guard let presentingViewController = self.context.presentingViewController else { throw OperationError.pledgeRequired(appName: self.appName) } + + let downloadURL: URL + + if let components = URLComponents(url: patreonURL, resolvingAgainstBaseURL: false), + let postItem = components.queryItems?.first(where: { $0.name == "h" }), + let postID = postItem.value, + let patreonPostURL = URL(string: "https://www.patreon.com/posts/" + postID) + { + downloadURL = patreonPostURL + } + else + { + downloadURL = patreonURL + } + + return try await downloadFromPatreon(downloadURL, presentingViewController: presentingViewController) } } - func downloadFromPatreonPost() async throws -> URL + @MainActor + func downloadFromPatreon(_ patreonURL: URL, presentingViewController: UIViewController) async throws -> URL { - guard let presentingViewController = self.context.presentingViewController else { throw OperationError.pledgeRequired(appName: self.appName) } + let webViewController = WebViewController(url: patreonURL) + webViewController.delegate = self + webViewController.webView.navigationDelegate = self + + let navigationController = UINavigationController(rootViewController: webViewController) + presentingViewController.present(navigationController, animated: true) let downloadURL: URL - if let components = URLComponents(url: patreonURL, resolvingAgainstBaseURL: false), - let postItem = components.queryItems?.first(where: { $0.name == "h" }), - let postID = postItem.value, - let patreonPostURL = URL(string: "https://www.patreon.com/posts/" + postID) + do { - downloadURL = patreonPostURL - } - else - { - downloadURL = patreonURL + defer { + navigationController.dismiss(animated: true) + } + + downloadURL = try await withCheckedThrowingContinuation { continuation in + self.downloadPatreonAppContinuation = continuation + } } - return try await self.downloadFromPatreon(downloadURL, presentingViewController: presentingViewController) + let fileURL = try await downloadFile(from: downloadURL) + return fileURL } } - - @MainActor - func downloadFromPatreon(_ patreonURL: URL, presentingViewController: UIViewController) async throws -> URL - { - let webViewController = WebViewController(url: patreonURL) - webViewController.delegate = self - webViewController.webView.navigationDelegate = self - - let navigationController = UINavigationController(rootViewController: webViewController) - presentingViewController.present(navigationController, animated: true) - - let downloadURL: URL - - do - { - defer { - navigationController.dismiss(animated: true) - } - - downloadURL = try await withCheckedThrowingContinuation { continuation in - self.downloadPatreonAppContinuation = continuation - } - } - - let fileURL = try await self.downloadFile(from: downloadURL) - return fileURL - } } extension DownloadAppOperation: WebViewControllerDelegate { - func webViewControllerDidFinish(_ webViewController: WebViewController) + func webViewControllerDidFinish(_ webViewController: WebViewController) { guard let continuation = self.downloadPatreonAppContinuation else { return } self.downloadPatreonAppContinuation = nil - + continuation.resume(throwing: CancellationError()) } } extension DownloadAppOperation: WKNavigationDelegate { - func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction) async -> WKNavigationActionPolicy + func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction) async -> WKNavigationActionPolicy { guard #available(iOS 14.5, *), navigationAction.shouldPerformDownload else { return .allow } - + guard let continuation = self.downloadPatreonAppContinuation else { return .allow } self.downloadPatreonAppContinuation = nil - + if let downloadURL = navigationAction.request.url { continuation.resume(returning: downloadURL) @@ -429,19 +430,19 @@ extension DownloadAppOperation: WKNavigationDelegate { continuation.resume(throwing: URLError(.badURL)) } - + return .cancel } - - func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse) async -> WKNavigationResponsePolicy + + func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse) async -> WKNavigationResponsePolicy { // Called for Patreon attachments - + guard !navigationResponse.canShowMIMEType else { return .allow } - + guard let continuation = self.downloadPatreonAppContinuation else { return .allow } self.downloadPatreonAppContinuation = nil - + guard let response = navigationResponse.response as? HTTPURLResponse, let responseURL = response.url, let mimeType = response.mimeType, let type = UTType(mimeType: mimeType), type.conforms(to: .ipa) || type.conforms(to: .zip) || type.conforms(to: .application) @@ -449,9 +450,9 @@ extension DownloadAppOperation: WKNavigationDelegate continuation.resume(throwing: OperationError.invalidApp) return .cancel } - + continuation.resume(returning: responseURL) - + return .cancel } } @@ -546,7 +547,7 @@ private extension DownloadAppOperation } catch let error as DecodingError { - let nsError = (error as NSError).withLocalizedFailure(String(format: NSLocalizedString("The dependencies for %@ could not be determined.", comment: ""), application.name)) + let nsError = (error as NSError).withLocalizedFailure(String(format: NSLocalizedString("Could not determine dependencies for %@.", comment: ""), application.name)) completionHandler(.failure(nsError)) } catch @@ -578,7 +579,7 @@ private extension DownloadAppOperation } catch let error as NSError { - let localizedFailure = String(format: NSLocalizedString("The dependency “%@” could not be downloaded.", comment: ""), dependency.preferredFilename) + let localizedFailure = String(format: NSLocalizedString("The dependency '%@' could not be downloaded.", comment: ""), dependency.preferredFilename) completionHandler(.failure(error.withLocalizedFailure(localizedFailure))) } } diff --git a/AltStore/Operations/Errors/OperationError.swift b/AltStore/Operations/Errors/OperationError.swift index 9571419c..9188742f 100644 --- a/AltStore/Operations/Errors/OperationError.swift +++ b/AltStore/Operations/Errors/OperationError.swift @@ -15,17 +15,12 @@ extension OperationError { enum Code: Int, ALTErrorCode, CaseIterable { typealias Error = OperationError - + // General case unknown = 1000 case unknownResult = 1001 - // case cancelled = 1002 + case cancelled = 1002 case timedOut = 1003 - case unableToConnectSideJIT - case unableToRespondSideJITDevice - case wrongSideJITIP - case SideJITIssue // (error: String) - case refreshsidejit case notAuthenticated = 1004 case appNotFound = 1005 case unknownUDID = 1006 @@ -35,18 +30,11 @@ extension OperationError case noSources = 1010 case openAppFailed = 1011 case missingAppGroup = 1012 - case refreshAppFailed - - // Connection - case noWiFi = 1200 - case tooNewError - case anisetteV1Error//(message: String) - case provisioningError//(result: String, message: String?) - case anisetteV3Error//(message: String) - - case cacheClearError//(errors: [String]) case forbidden = 1013 case sourceNotAdded = 1014 + + + // Connection /* Connection */ case serverNotFound = 1200 @@ -56,6 +44,20 @@ extension OperationError /* Pledges */ case pledgeRequired = 1401 case pledgeInactive = 1402 + + /* SideStore Only */ + case unableToConnectSideJIT + case unableToRespondSideJITDevice + case wrongSideJITIP + case SideJITIssue // (error: String) + case refreshsidejit + case refreshAppFailed + case tooNewError + case anisetteV1Error//(message: String) + case provisioningError//(result: String, message: String?) + case anisetteV3Error//(message: String) + case cacheClearError//(errors: [String]) + case noWiFi } static var cancelled: CancellationError { CancellationError() } @@ -70,13 +72,13 @@ extension OperationError static let invalidApp: OperationError = .init(code: .invalidApp) static let noSources: OperationError = .init(code: .noSources) static let missingAppGroup: OperationError = .init(code: .missingAppGroup) - + static let noWiFi: OperationError = .init(code: .noWiFi) static let tooNewError: OperationError = .init(code: .tooNewError) static let provisioningError: OperationError = .init(code: .provisioningError) static let anisetteV1Error: OperationError = .init(code: .anisetteV1Error) static let anisetteV3Error: OperationError = .init(code: .anisetteV3Error) - + static let cacheClearError: OperationError = .init(code: .cacheClearError) static func unknown(failureReason: String? = nil, file: String = #fileID, line: UInt = #line) -> OperationError { @@ -126,6 +128,7 @@ extension OperationError static func invalidParameters(_ message: String? = nil) -> OperationError { OperationError(code: .invalidParameters, failureReason: message) + } static func forbidden(failureReason: String? = nil, file: String = #fileID, line: UInt = #line) -> OperationError { OperationError(code: .forbidden, failureReason: failureReason, sourceFile: file, sourceLine: line) @@ -168,8 +171,8 @@ struct OperationError: ALTLocalizedError { private var _failureReason: String? private init(code: Code, failureReason: String? = nil, - appName: String? = nil, requiredAppIDs: Int? = nil, availableAppIDs: Int? = nil, - expirationDate: Date? = nil, sourceFile: String? = nil, sourceLine: UInt? = nil){ + appName: String? = nil, sourceName: String? = nil, requiredAppIDs: Int? = nil, + availableAppIDs: Int? = nil, expirationDate: Date? = nil, sourceFile: String? = nil, sourceLine: UInt? = nil){ self.code = code self._failureReason = failureReason @@ -245,7 +248,6 @@ struct OperationError: ALTLocalizedError { } } - private var _failureReason: String? var recoverySuggestion: String? { switch self.code diff --git a/AltStore/Operations/Errors/VerificationError.swift b/AltStore/Operations/Errors/VerificationError.swift index ccc531ce..e6b410dc 100644 --- a/AltStore/Operations/Errors/VerificationError.swift +++ b/AltStore/Operations/Errors/VerificationError.swift @@ -16,7 +16,7 @@ extension VerificationError typealias Error = VerificationError // Legacy - // case privateEntitlements = 0 +// case privateEntitlements = 0 case mismatchedBundleIdentifiers = 1 case iOSVersionNotSupported = 2 @@ -28,7 +28,11 @@ extension VerificationError case undeclaredPermissions = 6 case addedPermissions = 7 } - + +// static func privateEntitlements(_ entitlements: [String: Any], app: ALTApplication) -> VerificationError { +// VerificationError(code: .privateEntitlements, app: app, entitlements: entitlements) +// } + static func mismatchedBundleIdentifiers(sourceBundleID: String, app: ALTApplication) -> VerificationError { VerificationError(code: .mismatchedBundleIdentifiers, app: app, sourceBundleID: sourceBundleID) } @@ -108,6 +112,10 @@ struct VerificationError: ALTLocalizedError var errorFailureReason: String { switch self.code { +// case .privateEntitlements: +// let appName = self.$app.name ?? NSLocalizedString("The app", comment: "") +// return String(formatted: "“%@” requires private permissions.", appName) + case .mismatchedBundleIdentifiers: if let appBundleID = self.$app.bundleIdentifier, let bundleID = self.sourceBundleID { diff --git a/AltStore/Operations/InstallAppOperation.swift b/AltStore/Operations/InstallAppOperation.swift index 1115ca0c..c88ad8d0 100644 --- a/AltStore/Operations/InstallAppOperation.swift +++ b/AltStore/Operations/InstallAppOperation.swift @@ -46,9 +46,7 @@ final class InstallAppOperation: ResultOperation else { return self.finish(.failure(OperationError.invalidParameters("InstallAppOperation.main: self.context.certificate or self.context.resignedApp or self.context.provisioningProfiles is nil"))) } - - Logger.sideload.notice("Installing resigned app \(resignedApp.bundleIdentifier, privacy: .public)...") - + @Managed var appVersion = self.context.appVersion let storeBuildVersion = $appVersion.buildVersion @@ -257,7 +255,6 @@ final class InstallAppOperation: ResultOperation catch { print("Failed to remove refreshed .ipa: \(error)") - Logger.sideload.error("Failed to remove refreshed .ipa: \(error.localizedDescription, privacy: .public)") } } @@ -267,43 +264,6 @@ final class InstallAppOperation: ResultOperation private extension InstallAppOperation { - func receive(from connection: ServerConnection, completionHandler: @escaping (Result) -> Void) - { - connection.receiveResponse() { (result) in - do - { - let response = try result.get() - - switch response - { - case .installationProgress(let response): - Logger.sideload.debug("Installing \(self.context.resignedApp?.bundleIdentifier ?? self.context.bundleIdentifier, privacy: .public)... \((response.progress * 100).rounded())%") - - if response.progress == 1.0 - { - self.progress.completedUnitCount = self.progress.totalUnitCount - completionHandler(.success(())) - } - else - { - self.progress.completedUnitCount = Int64(response.progress * 100) - self.receive(from: connection, completionHandler: completionHandler) - } - - case .error(let response): - completionHandler(.failure(response.error)) - - default: - completionHandler(.failure(ALTServerError(.unknownRequest))) - } - } - catch - { - completionHandler(.failure(ALTServerError(error))) - } - } - } - func cleanUp() { guard !self.didCleanUp else { return } @@ -315,7 +275,7 @@ private extension InstallAppOperation } catch { - Logger.sideload.error("Failed to remove temporary directory: \(error.localizedDescription, privacy: .public)") + print("Failed to remove temporary directory.", error) } } } diff --git a/AltStore/Operations/SendAppOperation.swift b/AltStore/Operations/SendAppOperation.swift index cc8d40eb..0da089a7 100644 --- a/AltStore/Operations/SendAppOperation.swift +++ b/AltStore/Operations/SendAppOperation.swift @@ -39,9 +39,7 @@ final class SendAppOperation: ResultOperation<()> guard let resignedApp = self.context.resignedApp else { return self.finish(.failure(OperationError.invalidParameters("SendAppOperation.main: self.resignedApp is nil"))) } - - Logger.sideload.notice("Sending app \(self.context.bundleIdentifier, privacy: .public) to AltServer \(server.localizedName ?? "nil", privacy: .public)...") - + // self.context.resignedApp.fileURL points to the app bundle, but we want the .ipa. let app = AnyApp(name: resignedApp.name, bundleIdentifier: self.context.bundleIdentifier, url: resignedApp.fileURL, storeApp: nil) let fileURL = InstalledApp.refreshedIPAURL(for: app) diff --git a/AltStore/Operations/VerifyAppOperation.swift b/AltStore/Operations/VerifyAppOperation.swift index 98adc5c4..83410f91 100644 --- a/AltStore/Operations/VerifyAppOperation.swift +++ b/AltStore/Operations/VerifyAppOperation.swift @@ -13,87 +13,6 @@ import AltStoreCore import AltSign import Roxas -extension VerificationError -{ - enum Code: Int, ALTErrorCode, CaseIterable { - typealias Error = VerificationError - - case privateEntitlements - case mismatchedBundleIdentifiers - case iOSVersionNotSupported - } - - static func privateEntitlements(_ entitlements: [String: Any], app: ALTApplication) -> VerificationError { - VerificationError(code: .privateEntitlements, app: app, entitlements: entitlements) - } - - static func mismatchedBundleIdentifiers(sourceBundleID: String, app: ALTApplication) -> VerificationError { - VerificationError(code: .mismatchedBundleIdentifiers, app: app, sourceBundleID: sourceBundleID) - } - - static func iOSVersionNotSupported(app: AppProtocol, osVersion: OperatingSystemVersion = ProcessInfo.processInfo.operatingSystemVersion, requiredOSVersion: OperatingSystemVersion?) -> VerificationError { - VerificationError(code: .iOSVersionNotSupported, app: app) - } -} - -struct VerificationError: ALTLocalizedError { - let code: Code - - var errorTitle: String? - var errorFailure: String? - @Managed var app: AppProtocol? - var sourceBundleID: String? - var deviceOSVersion: OperatingSystemVersion? - var requiredOSVersion: OperatingSystemVersion? - - var errorDescription: String? { - switch self.code { - case .iOSVersionNotSupported: - guard let deviceOSVersion else { return nil } - - var failureReason = self.errorFailureReason - if self.app == nil { - let firstLetter = failureReason.prefix(1).lowercased() - failureReason = firstLetter + failureReason.dropFirst() - } - - return String(formatted: "This device is running iOS %@, but %@", deviceOSVersion.stringValue, failureReason) - default: return nil - } - - return self.errorFailureReason - } - - var errorFailureReason: String { - switch self.code - { - case .privateEntitlements: - let appName = self.$app.name ?? NSLocalizedString("The app", comment: "") - return String(formatted: "“%@” requires private permissions.", appName) - - case .mismatchedBundleIdentifiers: - if let appBundleID = self.$app.bundleIdentifier, let bundleID = self.sourceBundleID { - return String(formatted: "The bundle ID '%@' does not match the one specified by the source ('%@').", appBundleID, bundleID) - } else { - return NSLocalizedString("The bundle ID does not match the one specified by the source.", comment: "") - } - - case .iOSVersionNotSupported: - let appName = self.$app.name ?? NSLocalizedString("The app", comment: "") - let deviceOSVersion = self.deviceOSVersion ?? ProcessInfo.processInfo.operatingSystemVersion - - guard let requiredOSVersion else { - return String(formatted: "%@ does not support iOS %@.", appName, deviceOSVersion.stringValue) - } - if deviceOSVersion > requiredOSVersion { - return String(formatted: "%@ requires iOS %@ or earlier", appName, requiredOSVersion.stringValue) - } else { - return String(formatted: "%@ requires iOS %@ or later", appName, requiredOSVersion.stringValue) - } - } - } -} - import RegexBuilder private extension ALTEntitlement diff --git a/AltStore/Resources/AltBackup.ipa b/AltStore/Resources/AltBackup.ipa index 8fcda915..627b12de 100644 Binary files a/AltStore/Resources/AltBackup.ipa and b/AltStore/Resources/AltBackup.ipa differ diff --git a/AltStore/Resources/Assets.xcassets/Permissions/BackgroundAudioPermission.imageset/Contents.json b/AltStore/Resources/Assets.xcassets/Permissions/BackgroundAudioPermission.imageset/Contents.json new file mode 100644 index 00000000..fcc90b1f --- /dev/null +++ b/AltStore/Resources/Assets.xcassets/Permissions/BackgroundAudioPermission.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "sound@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "sound@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/AltStore/Resources/Assets.xcassets/Permissions/BackgroundAudioPermission.imageset/sound@2x.png b/AltStore/Resources/Assets.xcassets/Permissions/BackgroundAudioPermission.imageset/sound@2x.png new file mode 100644 index 00000000..f7121412 Binary files /dev/null and b/AltStore/Resources/Assets.xcassets/Permissions/BackgroundAudioPermission.imageset/sound@2x.png differ diff --git a/AltStore/Resources/Assets.xcassets/Permissions/BackgroundAudioPermission.imageset/sound@3x.png b/AltStore/Resources/Assets.xcassets/Permissions/BackgroundAudioPermission.imageset/sound@3x.png new file mode 100644 index 00000000..23bbdff5 Binary files /dev/null and b/AltStore/Resources/Assets.xcassets/Permissions/BackgroundAudioPermission.imageset/sound@3x.png differ diff --git a/AltStore/Resources/Assets.xcassets/Permissions/BackgroundFetchPermission.imageset/Contents.json b/AltStore/Resources/Assets.xcassets/Permissions/BackgroundFetchPermission.imageset/Contents.json new file mode 100644 index 00000000..04671484 --- /dev/null +++ b/AltStore/Resources/Assets.xcassets/Permissions/BackgroundFetchPermission.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "fetch@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "fetch@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/AltStore/Resources/Assets.xcassets/Permissions/BackgroundFetchPermission.imageset/fetch@2x.png b/AltStore/Resources/Assets.xcassets/Permissions/BackgroundFetchPermission.imageset/fetch@2x.png new file mode 100644 index 00000000..c44c3dee Binary files /dev/null and b/AltStore/Resources/Assets.xcassets/Permissions/BackgroundFetchPermission.imageset/fetch@2x.png differ diff --git a/AltStore/Resources/Assets.xcassets/Permissions/BackgroundFetchPermission.imageset/fetch@3x.png b/AltStore/Resources/Assets.xcassets/Permissions/BackgroundFetchPermission.imageset/fetch@3x.png new file mode 100644 index 00000000..6c05606a Binary files /dev/null and b/AltStore/Resources/Assets.xcassets/Permissions/BackgroundFetchPermission.imageset/fetch@3x.png differ diff --git a/AltStore/Resources/Assets.xcassets/Permissions/Contents.json b/AltStore/Resources/Assets.xcassets/Permissions/Contents.json new file mode 100644 index 00000000..da4a164c --- /dev/null +++ b/AltStore/Resources/Assets.xcassets/Permissions/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/AltStore/Resources/Assets.xcassets/Permissions/PhotosPermission.imageset/Contents.json b/AltStore/Resources/Assets.xcassets/Permissions/PhotosPermission.imageset/Contents.json new file mode 100644 index 00000000..de4d09de --- /dev/null +++ b/AltStore/Resources/Assets.xcassets/Permissions/PhotosPermission.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "photos@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "photos@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/AltStore/Resources/Assets.xcassets/Permissions/PhotosPermission.imageset/photos@2x.png b/AltStore/Resources/Assets.xcassets/Permissions/PhotosPermission.imageset/photos@2x.png new file mode 100644 index 00000000..63dcd177 Binary files /dev/null and b/AltStore/Resources/Assets.xcassets/Permissions/PhotosPermission.imageset/photos@2x.png differ diff --git a/AltStore/Resources/Assets.xcassets/Permissions/PhotosPermission.imageset/photos@3x.png b/AltStore/Resources/Assets.xcassets/Permissions/PhotosPermission.imageset/photos@3x.png new file mode 100644 index 00000000..522b8bd8 Binary files /dev/null and b/AltStore/Resources/Assets.xcassets/Permissions/PhotosPermission.imageset/photos@3x.png differ diff --git a/AltStore/SceneDelegate.swift b/AltStore/SceneDelegate.swift index 8ec91a46..34411380 100644 --- a/AltStore/SceneDelegate.swift +++ b/AltStore/SceneDelegate.swift @@ -44,7 +44,7 @@ final class SceneDelegate: UIResponder, UIWindowSceneDelegate PatreonAPI.shared.refreshPatreonAccount() } - + func sceneDidEnterBackground(_ scene: UIScene) { // Called as the scene transitions from the foreground to the background. @@ -54,7 +54,10 @@ final class SceneDelegate: UIResponder, UIWindowSceneDelegate guard UIApplication.shared.applicationState == .background else { return } // Make sure to update AppDelegate.applicationDidEnterBackground() as well. - + + // TODO: @mahee96: find if we need to stop em_proxy as in altstore? + // stop_em_proxy() + guard let oneMonthAgo = Calendar.current.date(byAdding: .month, value: -1, to: Date()) else { return } let midnightOneMonthAgo = Calendar.current.startOfDay(for: oneMonthAgo) diff --git a/AltStore/Settings/AboutPatreonHeaderView.xib b/AltStore/Settings/AboutPatreonHeaderView.xib index c07a2d6a..365b3d3e 100644 --- a/AltStore/Settings/AboutPatreonHeaderView.xib +++ b/AltStore/Settings/AboutPatreonHeaderView.xib @@ -11,17 +11,17 @@ - + - + - + - + @@ -31,19 +31,19 @@ - + - + - + + + + + + + + + - + Thank you for using SideStore! @@ -91,10 +99,10 @@ Following us on social media allows us to give quick updates and spread the word - +