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 @@
-
-
+
-
-
-
-
@@ -219,15 +215,19 @@
+
+
+
+
@@ -264,7 +264,7 @@
-
+
@@ -298,7 +298,7 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -445,7 +445,7 @@
-
+
@@ -460,7 +460,7 @@
-
+
diff --git a/AltStore/Base.lproj/Main.storyboard b/AltStore/Base.lproj/Main.storyboard
index d22b29a9..2b60ee1d 100644
--- a/AltStore/Base.lproj/Main.storyboard
+++ b/AltStore/Base.lproj/Main.storyboard
@@ -1,9 +1,9 @@
-
+
-
+
@@ -51,7 +51,7 @@
-
+
@@ -254,7 +254,7 @@
-
+
@@ -281,7 +281,7 @@
-
+
@@ -305,7 +305,7 @@
-
+
@@ -353,7 +353,7 @@
-
+
@@ -394,57 +394,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -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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