From 63a3203e50b218bfabba2bdbdf64bf42ad51b15c Mon Sep 17 00:00:00 2001 From: Magesh K <47920326+mahee96@users.noreply.github.com> Date: Sat, 7 Dec 2024 17:45:09 +0530 Subject: [PATCH] clean-checkpoint-1 --- .gitignore | 3 + .gitmodules | 5 + .../Background.colorset/Contents.json | 12 +- AltBackup/Info.plist | 1 - AltJIT/AltJIT-Bridging-Header.h | 7 - AltJIT/AltJIT.swift | 18 - AltJIT/Commands/EnableJIT.swift | 455 ------- AltJIT/Commands/MountDisk.swift | 75 -- AltJIT/Extensions/Logger+AltJIT.swift | 16 - AltJIT/Extensions/Task+Timeout.swift | 57 - AltJIT/Extensions/URL+Tools.swift | 15 - AltJIT/Types/PythonCommand.swift | 58 - .../Types/RemoteServiceDiscoveryTunnel.swift | 41 - AltServer/Anisette Data/AnisetteError.swift | 51 - AltServer/Extensions/Logger+AltServer.swift | 16 - .../Extensions/Process+STPrivilegedTask.swift | 71 -- AltServer/Extensions/ProcessInfo+Device.swift | 54 - AltServer/JIT/JITManager.swift | 192 --- AltStore.xcodeproj/project.pbxproj | 1066 +++-------------- .../xcshareddata/swiftpm/Package.resolved | 114 -- AltStore.xcworkspace/contents.xcworkspacedata | 16 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/swiftpm/Package.resolved | 33 + AltStore/AltStore.entitlements | 2 + AltStore/Analytics/AnalyticsManager.swift | 6 + .../App Detail/AppContentViewController.swift | 4 +- AltStore/App Detail/AppViewController.swift | 18 +- AltStore/App IDs/AppIDsViewController.swift | 11 +- AltStore/AppDelegate.swift | 10 +- .../Authentication/Authentication.storyboard | 46 +- AltStore/Base.lproj/Main.storyboard | 79 +- .../Browse/BrowseCollectionViewCell.swift | 96 -- AltStore/Browse/BrowseCollectionViewCell.xib | 64 - AltStore/Browse/BrowseViewController.swift | 1 - AltStore/Components/NavigationBar.swift | 2 +- AltStore/Components/ToastView.swift | 12 +- AltStore/Managing Apps/AppManagerErrors.swift | 8 +- AltStore/My Apps/MyAppsViewController.swift | 15 +- AltStore/News/NewsViewController.swift | 4 +- .../Operations/AuthenticationOperation.swift | 25 +- .../BackgroundRefreshAppsOperation.swift | 4 +- .../Operations/ClearAppCacheOperation.swift | 4 +- .../Operations/DeactivateAppOperation.swift | 6 +- .../Operations/DownloadAppOperation.swift | 483 ++++---- .../Operations/Errors/OperationError.swift | 46 +- .../Operations/Errors/VerificationError.swift | 12 +- AltStore/Operations/InstallAppOperation.swift | 44 +- AltStore/Operations/SendAppOperation.swift | 4 +- AltStore/Operations/VerifyAppOperation.swift | 81 -- AltStore/Resources/AltBackup.ipa | Bin 66769 -> 66640 bytes .../Contents.json | 22 + .../sound@2x.png | Bin 0 -> 1896 bytes .../sound@3x.png | Bin 0 -> 2991 bytes .../Contents.json | 22 + .../fetch@2x.png | Bin 0 -> 2443 bytes .../fetch@3x.png | Bin 0 -> 3974 bytes .../Assets.xcassets/Permissions/Contents.json | 6 + .../PhotosPermission.imageset/Contents.json | 22 + .../PhotosPermission.imageset/photos@2x.png | Bin 0 -> 6167 bytes .../PhotosPermission.imageset/photos@3x.png | Bin 0 -> 10703 bytes AltStore/SceneDelegate.swift | 7 +- AltStore/Settings/AboutPatreonHeaderView.xib | 40 +- .../Error Log/ErrorLogViewController.swift | 87 +- AltStore/Settings/PatreonComponents.swift | 4 +- AltStore/Settings/Settings.storyboard | 229 +--- .../Settings/SettingsViewController.swift | 19 +- AltStore/Sources/SourcesViewController.swift | 142 +-- AltStore/TabBarController.swift | 4 +- .../Extensions/UserDefaults+AltStore.swift | 9 +- AltStoreCore/Model/AppPermission.swift | 61 - AltStoreCore/Model/AppVersion.swift | 10 +- AltStoreCore/Model/DatabaseManager.swift | 2 + AltStoreCore/Model/InstalledApp.swift | 64 +- AltStoreCore/Model/MergePolicy.swift | 4 +- .../Model/Patreon/PatreonAccount.swift | 3 +- AltStoreCore/Model/Source.swift | 2 +- AltStoreCore/Model/StoreApp.swift | 8 +- AltStoreCore/Patreon/PatreonAPI.swift | 2 +- AltStoreCore/Protocols/AppProtocol.swift | 7 +- .../SmallIcon.imageset/altminicon.pdf | Bin 4486 -> 0 bytes AltWidget/Provider.swift | 249 ---- Dependencies/AltSign | 1 + Podfile | 22 +- Podfile.lock | 24 +- Shared/Categories/NSError+ALTServerError.m | 15 +- Shared/Errors/ALTLocalizedError.swift | 4 +- Shared/Errors/ALTWrappedError.m | 1 + Shared/Errors/JITError.swift | 66 - .../ALTServerError+Conveniences.swift | 1 + Shared/Extensions/Bundle+AltStore.swift | 1 + Shared/Extensions/NSError+AltStore.swift | 97 +- .../OperatingSystemVersion+Comparable.swift | 12 +- Shared/Server Protocol/CodableError.swift | 42 +- Shared/Server Protocol/ServerProtocol.swift | 1 + Shared/XPC/AltXPCProtocol.h | 18 - 95 files changed, 1040 insertions(+), 3761 deletions(-) delete mode 100644 AltJIT/AltJIT-Bridging-Header.h delete mode 100644 AltJIT/AltJIT.swift delete mode 100644 AltJIT/Commands/EnableJIT.swift delete mode 100644 AltJIT/Commands/MountDisk.swift delete mode 100644 AltJIT/Extensions/Logger+AltJIT.swift delete mode 100644 AltJIT/Extensions/Task+Timeout.swift delete mode 100644 AltJIT/Extensions/URL+Tools.swift delete mode 100644 AltJIT/Types/PythonCommand.swift delete mode 100644 AltJIT/Types/RemoteServiceDiscoveryTunnel.swift delete mode 100644 AltServer/Anisette Data/AnisetteError.swift delete mode 100644 AltServer/Extensions/Logger+AltServer.swift delete mode 100644 AltServer/Extensions/Process+STPrivilegedTask.swift delete mode 100644 AltServer/Extensions/ProcessInfo+Device.swift delete mode 100644 AltServer/JIT/JITManager.swift delete mode 100644 AltStore.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved create mode 100644 AltStore.xcworkspace/contents.xcworkspacedata create mode 100644 AltStore.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 AltStore.xcworkspace/xcshareddata/swiftpm/Package.resolved delete mode 100644 AltStore/Browse/BrowseCollectionViewCell.swift delete mode 100644 AltStore/Browse/BrowseCollectionViewCell.xib create mode 100644 AltStore/Resources/Assets.xcassets/Permissions/BackgroundAudioPermission.imageset/Contents.json create mode 100644 AltStore/Resources/Assets.xcassets/Permissions/BackgroundAudioPermission.imageset/sound@2x.png create mode 100644 AltStore/Resources/Assets.xcassets/Permissions/BackgroundAudioPermission.imageset/sound@3x.png create mode 100644 AltStore/Resources/Assets.xcassets/Permissions/BackgroundFetchPermission.imageset/Contents.json create mode 100644 AltStore/Resources/Assets.xcassets/Permissions/BackgroundFetchPermission.imageset/fetch@2x.png create mode 100644 AltStore/Resources/Assets.xcassets/Permissions/BackgroundFetchPermission.imageset/fetch@3x.png create mode 100644 AltStore/Resources/Assets.xcassets/Permissions/Contents.json create mode 100644 AltStore/Resources/Assets.xcassets/Permissions/PhotosPermission.imageset/Contents.json create mode 100644 AltStore/Resources/Assets.xcassets/Permissions/PhotosPermission.imageset/photos@2x.png create mode 100644 AltStore/Resources/Assets.xcassets/Permissions/PhotosPermission.imageset/photos@3x.png delete mode 100644 AltWidget/Assets.xcassets/SmallIcon.imageset/altminicon.pdf delete mode 100644 AltWidget/Provider.swift create mode 160000 Dependencies/AltSign delete mode 100644 Shared/Errors/JITError.swift delete mode 100644 Shared/XPC/AltXPCProtocol.h 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 8fcda9157fb9e816a91e9810e63b71c487763625..627b12de35721d23e20a8e5a8bd67257d33c2029 100644 GIT binary patch literal 66640 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 z zZReY-{4$o0K*1_ZgSLuWAI{kqY^=ax9zXgE4vt237ywdpWvwB+!?I@SuzW5(&O~m%u3{rdN!+&eik$4;ih6KJwOv;+*Dr3bE*!%ag{hcb zFOT!#*z$w#z24(oP(m;$qF+$JUVY)jGkUzD<{{WE{^c%!C~X|(2)X1%!?iVQqBkN= zxn)LnKPSu7q|kamqNiO>$8d79>}OA}Lazn(+K*CJ6#8xY#XMW;W*h|9mx`mVxvNQq zCU}yzt_l}5uDm6Ns=zsn=kg^oQ7K_tTmJs&z|8*v&OkB0Y)++4n3or}+UJVEo9WJh zP>_?^7h_JK?DcqX^h~DT20H8Xufczt7ivTQ4AON0&KH~qImYxWxa3@<>bwE;nNB#< zU&H+-;(s2-ikQ`-WCh~M6r2>OQn6kSt*5gUD-ea6%}ZhOZ0ii|2Pc9*3B)wton$lp zr^AD~F^pKriq#wH)_-#@W6NyCwM_rPaFM&$hV$IzIm^p!O#d6?>KE_=VfqbR2C||5 zCFfsG{1u#IScE5-P!;cRM@L5{z&3!RPj+UB#;3`1pf$ouYiX|nbhHKQkC=c^S^{CrK={1Ay ziYU7A!KElpXMApZC8RWJMA79$hA__cr#d>CAkJNJ9Uc3-Y2%!i2UAQ{yjWk?j$~{P z)ypnsU17U5VfEyD-VOt>VdB7`C zgud9u)ri> zy(tuS8nn9Jz}x>rC~UAB6b9k6j#C__6IAO;&Sh){E)MM4Ur(?<7zVPDK3+X}F1o0z03{VN%0AX<;C^#8zKkown`|mnB6d24ugn0#cLr;d= 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 literal 66769 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

*x_-)OTiQ)WloPwf6-kK16 zIni5@BO%s2pt2B}rI!=3j=Bm3?EoS;W->*1_L|)t-ev6%aZTFqT&M#XZvMU4q3MZ& zJ|Xi`(=YOb_*ty}DI=&l9(PD>8@*m*YHey5 zTMtZrhzpc0Ze*O(!Z<4ec5yzGt?0`Woo(Ii2DqzQPBX-jHW4j1Tw6;#rVE2e7_ZY! z+wvXNQ(7%L|B-H|dJ^>!Wq>>z&ya4C)T|NUwpm$CG2*UQO+{@Xu6!OrC~&O|+9T zPQG^c7bL>H%i67Wr`KE$zI-h>?)_1(85LYl*i-8Z`=DC}piTF(?l7wj zG_187#f<1VxXo_%m=yB9yxqH6(rL|fnCmDQC@bADtP{E>>>YY=?s&GSlx;|Js^V?O zF9CxNkuSJ4sGM$;M2{%A8*sWeGb|~Xuj1O6wH}&ct=qy+rgXqV`0V#s5kp{v*_fswA&h) zR>lUS4ur||A0S?VK7{RW72?P$OGQCJOPDD7`S`xbF6?{td*vfNPzrk!rMqo~)JJD@sK$d31Fg4TTFOaIB>71 zW9p_o!CBQQ-8B0MM~NzMysX$M=)Bpl*|0kQO+n4i+bP(&b=-b3(sf-rxlVzpdGsRL z9dK$qN*C4i25B~RR@lv|y>K9?a?Rk)Nv{w((%Z}wJ^BqF4p*t*rEun=#L{PzsF{FK z{&1~Lt;LJs44_~li6fC}^ZM8i!8nq08NarM{q>zx!ezMzf_Z@G`RBb7!E^S%*WCa0 zMo?|g3#^hXBoqSJuZKk82aUfq{_}$z3=K@l$kP^JWXddR>+;UX#KzTu$;iQh`JIuo z8I!Gp6Tq5TO%n-hikjVQ;`Mz6js^DDa&ktl_9m99CQfE%_Ds$$04GmlfRU4_ z$=~?=;_<)p(fXJ8u&~N7+Bz@-)a4o7tjydQwaqvgxr`avT-cfHt&IO$7+A0Jg8Q5F z3gfy+MIph!V4=altpA-b0LIp4CN9p5tn5rI48MT=8iwD+g2T_#C#n1l zk>L?8CxNa)im?Dc4)0vx%_C5Dk~b22Q98FI%hMgmY|*FSn3f|?IB^+BjdiB-5z0^L z1Vz@9C>Vm#TVuWgc;BQN6KPJ&MJPPZ zr9u$^=lNrg`Zv*Z&7btB;&4tilT+}G>0C>E^5Vra#yB8Ch?zqsNZvE=B*}2GdeLk= zg~dXNnU*Q!Xar}n>u-DZEVBiwb1*|?=m$3BCdmVyzriy^okdUK*VzrQ6Qde#|p_w;eZ3DhOA?(Xs@hB`%w8Qm` zeS-}83ACLUz_DJyLU|`&`>@Z?0<+un-DxAjZ&%Z(XqH`Pcl=KEg-jquI8sfbAlMEG)^5~LA*m;;Z8Jv2>i;75{0uRN67QEcj$t5gyV(D~) z$6Cvfqyv(I)=w(qc;a!2f^;10~bUQwpz zQ_&Qqlbt3J&&(N*1A_W!mXNzcwp1I3TaiH(9F{uqW`k;VFQrMm47UimY}!`w<+{&# z?aF~EuW)#hqHJHos0~-mQ|03jYu-)|u*dN%_N@Swso!%uT^1u_D_Kw#Z$Rlv z9}_)`nL9zbVw=-CDe;kmpSR9&GZS$E2>^npJB_xugQtlWt%4P|f&i0e;mDnvG}P0( z^3(d$uVc(t;RlkIw_SI5R{$Kh6^Q%XR;^GY$F`k2PuG69C~P{bchoK3y0Lq>8=EEz zo~cN{yARRI*7od2g%ZuIzMHJA+~pnh5C;{JBBQ~x+x^P*=bL`N=CMBv`(v0^?&zyw zW59rcnf^Ns+sW15#mdg?zc*>SUnaf$%cOxG4+ErRY}is#-cq(S;xxK6=ZPqOMW{__}H;iIn1P5A<9fg1MpxHlsf5x+aj2xG3 zjjQ@x(>E{;g=ep6BedPD8$jD>zCqr@Vh_|}) zD(3dQ{@@GTyt|xF!O;XvmCOgFzM@p2uX?NwcCc=zXx@mrsg1A46QCm`LJPqdp8+#j{sEG<*}#GS zcc}LqANxA=H}o;<4Oe9ssGkJ<3F%S1it26R9pQ-sa3J>9tC&0Btab1dzGX5+eN6fg zzAsY|b*htVFHP&7x>~Fa-1Y+gL!x`fO_FRZuCwXz6hL%I~dmi5ks{MuhO8>6Clba{~F%9v&(eOfl8I&okd=ca1nqFXnl1 zDtM9#+UAlzO}FDSti~CmnBl*TT6iXb$Sl0dqPDmI+Tm=)Tnh{+0pZPxHwBN(;+w47 zqigK$0YNNO+Uz7JQCZBDuqn3^i^_Z?L zBumz@BhH}d)R$*2jE?SHoU|rn`Z4=S54bP;i7-(&9Kn++$`W2+P$ammGLkaCCiU~ZO+}lnRRE*43hkht47+r{FHLfRu3uCrNsH71UMc{`H zD8s+Q{cA@_`(K)1)TGs4{T4BRy^9mT*4E64@ehyYpYUL)A?BS}3PciZ`ylPTwAKIGZwtwOQ+zvJXjpk>X?v#1-3P_<(Y4dX{-|6q+*~gRW^5Oc#khec#YPx& z44zSe;(>gQxNn&f5wN2XSSPB^TBywCC*MubV}5G)UbQy_%{v}vA8Qe7FV*ppsV*h!SrF7Uji?pP6mKg<5gqdF?Vv0M zne~b$q_X~?wCLqSWzYZMh5bRVTN%cju^q=;LkdFFth&<*ju1q-;#f*4>{hAFK7#x+ zW9nE=*!_8PZ&09YM`Fv>7gHy}4{`K@8T6Ru8=UOTZ9^)Qp9pe}ektRjtUH>~`&sJ@ zTVp0|oqgXR=&G!<&|q;^-NXA?lKvy!v-AwT=f(`R;Npm^G$xy61b>X26wapAC(QT3 zCH-H4^4evAZ+uK;hejY0;CUrm=i6(izAlatU2c6xBSJj?Th#N%^8UNloBdn0{(oBE z|DV49KYjndqwk>`Q$h)^Q7Z&E7?}9Kr0>%9<^U!KTPtUmUlHi$Zvnb2{g3{)Osp*R zLqEEQI!Dl%zY^@@Cnjqjr)6rW#An9EX>TUSrf9?_zkc_DDE1^Nc{Axtsx}exSL}U! z-B^PU$?=(*@$0eLX~`K$nz1SC2tU>Fqcf8=Kx4SfWZ}g;NR}$*zRMEowI1MBE(bf?N- zU}S$O22p2cGZ$wj6C8lQOJZp8GTX=+T)bJQtm{}hXvwdCQz`czS2>EXz8S^qU?_P$X+ zp}MeETYCh1noFJYaj(*>Mbl1OClZl46!PbRSBv&|i3zSdv9M``9&KVf?b%%6jd5e> z9z>|#a>$-a3;m47U{@sL^88jsz9=vGN3?fvzdjVG7d$%YoUu9(VSf~^IwFatb-Cb7 zzW#c$#FpmoH>LD(35^*62fmK*3OT@F`YFBfFQ~#kqWmu+QWsmQ#k$iqVd}bLaoT1* z7oVNfy}fpyCg(c`oN}v`b&K1!AyGFw5c$U-eK;+A)cl+*&qG?Cr%S7f8*8gOorUnm z!AD^6ZY^OlvDPvyj51+k1`1*y_#1q#IPEnU^dO6tz>MTFeMZ2)FylQ8^9?+On+~6x zz7$uG0@D1#nuG_1m^a<)6tkZeW&EmqmfP671B106AGnXRZTR7jJ=tHnuID^$LT?B& z`c|5^g*X<4thCJJpXvMbO>JF@m+UO_-&wUR$y+kqc*|bJwC2%V<-V&>VvG+P=}#){ zjF~mf@nmP!8NGh##J;fJbWLMUe_=)f`*};$TLjjmQ({9!o!{(TZ~lNWo1nTGUySs@l*Fypy&FFwUw>w+<)ja;+D`;$9InZp|2Hn865 zF!BmUVv!KXoiWe|9o1ZdXc$z1mX6EtDY2uz=aUe-i7#$YQp7GI%Qi^z?*7b_aEWWf zX9xh%{mxjBRksax@b#oSlF={^WBqPSGjzrE`=>98Q{uopt{z^20N#`L)Ysw)uZj|# zZF%~b;Osk1dPS;|D)I#Tsy&-I7t?)Ec>1#Z4<#VdKS$rmGbWWmuXY;tnpXR3JN@ga zC`d)#c2OLwRuHDq&T0`kzBY$kIG;&om8qpI*D-tDl4qIcxm&*$+3%=y)2dv;&58ALAvXf&tpex zXeA4fMY%*p#VBIPF8FtE5H#N*yRyRT$Ov7OG)FFS1lW;A1Z>nO9)gTQ@Mh&Tg>s%? zzOe#1*-t*R7-CbiS0OBE7~%3hg=Y1!|2#%d31>U{xL(eGESDYH5TkKrG(pZ`xT3~p z(PDn4jg<1^t8#i0a{fCI+(X*o$2HTrKyuroIWbVkjem>xLOo09GLeAiDpl85px zY#_&Yv)Rm;4P72BSCL?+#W0V4H#y3L;S!13VqvQ7`m96|OS^AdE>S@$j+|JX1SLTNAE5mLt#=OGWNri~-3LXxDXlH*-!a?joCUOM5al5Q4oE~~>&*P;$$+Xv_VkCXx6sfO-IFsR{fR0_j zJF$=p7sS8Cm(y`RA#$PvUE@%f^Z`zlPOh}9xU?pIuhEl#yikrB!Er)GVOgjhl!e>G z@(yRe{QDih_>{*6s)pS1`Or&Uu_Wu{G}(fY!YoZOeB^1^X|03At<OkCZ1#r~{r_NuQm> zd{tYSR-yq2fs~)Rbn3|#oi+h4(0?{*X{azAxWDDi!N7?Ba_LpFvG`@xzt-K~YYfgv zaHkcp5U;B_I0QE2e-tm2{-JmQ2Zr>YWehNpBhg>Y|0-puX~Kc+zB($u-v1K?oIg?E z`i;V$iy?nSPx2oSQT>UY*I&{z5CfQ+sajds8@aeTnY~sV;QrS6Ujq0Kxc}k6{OYhp z@jJl&>%^FZ3I@jZ8~L1o;eVF=FJ>xc&Hz^@6Eo-k;`N7U{@^w17lOOC{OT+XLx7R~ z#_K2m_jOwSFX8@KG=IPPD;fR&OHRL!n#AT`5&lyF>ObW3tNQW#aQ-7{zTYv6#{V;< z|A%4}+~2D${}WHGKk#`%lF)IUP{!_WP5S?Ui7=L7_9{Sy-YOELT}kp7zt z&tGHwbB6tQjJkXOMvQ-o$Nv%Ce_s~W{?nkg9Q`Zk{`X|vKVtf0RDVxe*!+emCqUx( z--+q}Xjp#-Y4#_O{Ad48kpJVj{vpFZ2g1K=9mD0n0`GTU6z=a~@$b|3uj%Q}@#pW{ z*{=SI`|r`{UsL|G$NW3x`P;vu{Lf+j^TPc*<&ww0qWt$|{P&p}`n8k>28RCnY=V7l JJpH=*{{RV%_E!J^ 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 0000000000000000000000000000000000000000..f7121412e6dd319cdc26a9ada4996aea5e870ae6 GIT binary patch literal 1896 zcmY*ac{m%`7LU+cT6+~$L^5R_B?wh%B0<^+vBXkT`3MntLPF9?rq!_zZGA$dsM5|< ztF+@;I;vAkq(SYf(;C!ThBAU0Ol^5d+t>Hr{l0VWx##}Q?|07qr; zsHHX3+S*)#FlVr1nPDvRSO(-X$$xk-Bu02Vh0dhVVnI^gFe2>&6A1=Og}#o@buuZD z|5b`*d}&M4AXIt+wX(2;e&v>=BBW8cXFP=@QI_&MSRp!s&L9ZET)sjQf;)hbR>OHKiD1W{o-Kr5lGk&!ErF8g;fu%Gq^VyGZ2 za=Ay;bcu}Ygv~V?ZZ^)bQGJaJZPj&81J2@h+NhOqcko(T5FteEpK%(q8pE7gbd+Oe zs)7GwZ2FqOeo8Y8gFfe(F^s*aNUZ?h_j}@q9`x&uKKH>UtM}?$1|SQS{ynhj)Lm-< zn^ICJECfF@MNcmewD~=)*doYO)U~ratx}NN^PdMR7CfoYUuAc>Z8{j` zy6R6;#3L77r?q!0RTQ_V+3Jzt>3aQzOHKjmEo@6>e?G3dWT7g}f2Jr?(0Vx4)qncY zk&k0`0y^{2RcnPS=A2 zX&5_jh;sXu#i|(l`)yoMBo6?ZbliAh4D#ZYybZbk?B`6`^XB4-_LKMK(Z{F)a%Dj)N0_KenOze915aid{Xx1!lyc)xmJhuqQW z>)OHG$yd!JOyfv=vEuB#FoxbrSCIGt{Pw-m#%QnTbj2w`vRx@ z-0|!C2r~`*H(`T?mKxogf>A*SFfnTrH>E!%+lt5-_ie?$Dl!}4Bt_ITQ=T?}#|^dx zc0)z(Kqn5>cBYIU@c3?d+7D^?ke9EL>4hL+h+O^4CeUP@H@LKyY`cG{bl_TT(=T`? zVoUAX_7bn8Q~SGV{&8dg>Vj^rDntbs;iM~0O5#u(U!!>Lqs*xKP~)D1#N`GN)>* z8E!$>h$b7^9?=Ap*KA1~fpFO%xB3F7obj4ns@lC=`%4UDn%__hG2X<4{JFzp+INXs z?#Eynd%w>{2XA1t0uMedeb~1|WEW>*sQ0?ed`4VI#hI4dDy);>i$yth!c~V`+NS~+ zEA@W5az_c=cfOg-j@~_#Yd>yFxG3(9)%iA6=dEK-Wg~3i^3YbL+N2NRM6O#5c>3U9 zzoyKzB{<&^0`2a=nlHkUh#LGIR0h#%P$6;G}%H^>g46W$T|dJnfqW83^=$(x^`?1D(mZVOd9W?IW;~+( zw@H`}uh(Vx?$jNRP|lQBDqEdvB(qXK+rxRyiUSUn+{o?;3jIj$Ej6xlL#4W?w><0{ ziYMQXg!F{dmM_ItV$&JP&j%quZ?fAgQhoGy{_?SZLs3QhSpG@wqw literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..23bbdff5899b43403db59b2c41f56b9568fd6a65 GIT binary patch literal 2991 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 T&z+w=`5f!(m>>z)T<-h_M~`Ii literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..63dcd17722e888a4a481b62ae4b655ed11fd1f39 GIT binary patch literal 6167 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..522b8bd84b98aa455e33bf2da466cb0e5eb6e8c7 GIT binary patch literal 10703 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 BGOhps literal 0 HcmV?d00001 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 - +