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 8fcda915..627b12de 100644
Binary files a/AltStore/Resources/AltBackup.ipa and b/AltStore/Resources/AltBackup.ipa differ
diff --git a/AltStore/Resources/Assets.xcassets/Permissions/BackgroundAudioPermission.imageset/Contents.json b/AltStore/Resources/Assets.xcassets/Permissions/BackgroundAudioPermission.imageset/Contents.json
new file mode 100644
index 00000000..fcc90b1f
--- /dev/null
+++ b/AltStore/Resources/Assets.xcassets/Permissions/BackgroundAudioPermission.imageset/Contents.json
@@ -0,0 +1,22 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "sound@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "sound@3x.png",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/AltStore/Resources/Assets.xcassets/Permissions/BackgroundAudioPermission.imageset/sound@2x.png b/AltStore/Resources/Assets.xcassets/Permissions/BackgroundAudioPermission.imageset/sound@2x.png
new file mode 100644
index 00000000..f7121412
Binary files /dev/null and b/AltStore/Resources/Assets.xcassets/Permissions/BackgroundAudioPermission.imageset/sound@2x.png differ
diff --git a/AltStore/Resources/Assets.xcassets/Permissions/BackgroundAudioPermission.imageset/sound@3x.png b/AltStore/Resources/Assets.xcassets/Permissions/BackgroundAudioPermission.imageset/sound@3x.png
new file mode 100644
index 00000000..23bbdff5
Binary files /dev/null and b/AltStore/Resources/Assets.xcassets/Permissions/BackgroundAudioPermission.imageset/sound@3x.png differ
diff --git a/AltStore/Resources/Assets.xcassets/Permissions/BackgroundFetchPermission.imageset/Contents.json b/AltStore/Resources/Assets.xcassets/Permissions/BackgroundFetchPermission.imageset/Contents.json
new file mode 100644
index 00000000..04671484
--- /dev/null
+++ b/AltStore/Resources/Assets.xcassets/Permissions/BackgroundFetchPermission.imageset/Contents.json
@@ -0,0 +1,22 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "fetch@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "fetch@3x.png",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/AltStore/Resources/Assets.xcassets/Permissions/BackgroundFetchPermission.imageset/fetch@2x.png b/AltStore/Resources/Assets.xcassets/Permissions/BackgroundFetchPermission.imageset/fetch@2x.png
new file mode 100644
index 00000000..c44c3dee
Binary files /dev/null and b/AltStore/Resources/Assets.xcassets/Permissions/BackgroundFetchPermission.imageset/fetch@2x.png differ
diff --git a/AltStore/Resources/Assets.xcassets/Permissions/BackgroundFetchPermission.imageset/fetch@3x.png b/AltStore/Resources/Assets.xcassets/Permissions/BackgroundFetchPermission.imageset/fetch@3x.png
new file mode 100644
index 00000000..6c05606a
Binary files /dev/null and b/AltStore/Resources/Assets.xcassets/Permissions/BackgroundFetchPermission.imageset/fetch@3x.png differ
diff --git a/AltStore/Resources/Assets.xcassets/Permissions/Contents.json b/AltStore/Resources/Assets.xcassets/Permissions/Contents.json
new file mode 100644
index 00000000..da4a164c
--- /dev/null
+++ b/AltStore/Resources/Assets.xcassets/Permissions/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/AltStore/Resources/Assets.xcassets/Permissions/PhotosPermission.imageset/Contents.json b/AltStore/Resources/Assets.xcassets/Permissions/PhotosPermission.imageset/Contents.json
new file mode 100644
index 00000000..de4d09de
--- /dev/null
+++ b/AltStore/Resources/Assets.xcassets/Permissions/PhotosPermission.imageset/Contents.json
@@ -0,0 +1,22 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "photos@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "photos@3x.png",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/AltStore/Resources/Assets.xcassets/Permissions/PhotosPermission.imageset/photos@2x.png b/AltStore/Resources/Assets.xcassets/Permissions/PhotosPermission.imageset/photos@2x.png
new file mode 100644
index 00000000..63dcd177
Binary files /dev/null and b/AltStore/Resources/Assets.xcassets/Permissions/PhotosPermission.imageset/photos@2x.png differ
diff --git a/AltStore/Resources/Assets.xcassets/Permissions/PhotosPermission.imageset/photos@3x.png b/AltStore/Resources/Assets.xcassets/Permissions/PhotosPermission.imageset/photos@3x.png
new file mode 100644
index 00000000..522b8bd8
Binary files /dev/null and b/AltStore/Resources/Assets.xcassets/Permissions/PhotosPermission.imageset/photos@3x.png differ
diff --git a/AltStore/SceneDelegate.swift b/AltStore/SceneDelegate.swift
index 8ec91a46..34411380 100644
--- a/AltStore/SceneDelegate.swift
+++ b/AltStore/SceneDelegate.swift
@@ -44,7 +44,7 @@ final class SceneDelegate: UIResponder, UIWindowSceneDelegate
PatreonAPI.shared.refreshPatreonAccount()
}
-
+
func sceneDidEnterBackground(_ scene: UIScene)
{
// Called as the scene transitions from the foreground to the background.
@@ -54,7 +54,10 @@ final class SceneDelegate: UIResponder, UIWindowSceneDelegate
guard UIApplication.shared.applicationState == .background else { return }
// Make sure to update AppDelegate.applicationDidEnterBackground() as well.
-
+
+ // TODO: @mahee96: find if we need to stop em_proxy as in altstore?
+ // stop_em_proxy()
+
guard let oneMonthAgo = Calendar.current.date(byAdding: .month, value: -1, to: Date()) else { return }
let midnightOneMonthAgo = Calendar.current.startOfDay(for: oneMonthAgo)
diff --git a/AltStore/Settings/AboutPatreonHeaderView.xib b/AltStore/Settings/AboutPatreonHeaderView.xib
index c07a2d6a..365b3d3e 100644
--- a/AltStore/Settings/AboutPatreonHeaderView.xib
+++ b/AltStore/Settings/AboutPatreonHeaderView.xib
@@ -11,17 +11,17 @@
-
+
-
+
-
+
-
+
@@ -31,19 +31,19 @@
-
+
-
+
-
+
+
+
+
+
+
+
+
+
-
+
Thank you for using SideStore!
@@ -91,10 +99,10 @@ Following us on social media allows us to give quick updates and spread the word
-
+
-
+
@@ -105,7 +113,7 @@ Following us on social media allows us to give quick updates and spread the word
-
+
@@ -146,7 +154,7 @@ Following us on social media allows us to give quick updates and spread the word
-
+
diff --git a/AltStore/Settings/Error Log/ErrorLogViewController.swift b/AltStore/Settings/Error Log/ErrorLogViewController.swift
index 0e29c9e8..498609c7 100644
--- a/AltStore/Settings/Error Log/ErrorLogViewController.swift
+++ b/AltStore/Settings/Error Log/ErrorLogViewController.swift
@@ -17,7 +17,7 @@ import Nuke
import QuickLook
-final class ErrorLogViewController: UITableViewController
+final class ErrorLogViewController: UITableViewController, QLPreviewControllerDelegate
{
private lazy var dataSource = self.makeDataSource()
private var expandedErrorIDs = Set()
@@ -28,6 +28,7 @@ final class ErrorLogViewController: UITableViewController
self.updateButtonInteractivity()
}
}
+
private lazy var timeFormatter: DateFormatter = {
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .none
@@ -126,11 +127,18 @@ private extension ErrorLogViewController
])
cell.menuButton.menu = menu
- cell.menuButton.showsMenuAsPrimaryAction = self.isScrolling ? false : true
- cell.selectionStyle = .none
- } else {
- cell.menuButton.isUserInteractionEnabled = false
+
+ if self.isScrolling
+ {
+ cell.menuButton.showsMenuAsPrimaryAction = false
}
+ else
+ {
+ cell.menuButton.showsMenuAsPrimaryAction = true
+ }
+
+ cell.selectionStyle = .none
+
// Include errorDescriptionTextView's text in cell summary.
cell.accessibilityLabel = [cell.errorFailureLabel.text, cell.dateLabel.text, cell.errorCodeLabel.text, cell.errorDescriptionTextView.text].compactMap { $0 }.joined(separator: ". ")
@@ -429,38 +437,45 @@ extension ErrorLogViewController
{
for case let cell as ErrorLogTableViewCell in self.tableView.visibleCells
{
- cell.menuButton.showsMenuAsPrimaryAction = self.isScrolling ? false : true
+ if self.isScrolling
+ {
+ cell.menuButton.showsMenuAsPrimaryAction = false
+ }
+ else
+ {
+ cell.menuButton.showsMenuAsPrimaryAction = true
+ }
}
}
}
-extension ErrorLogViewController: QLPreviewControllerDataSource, QLPreviewControllerDelegate
-{
- func numberOfPreviewItems(in controller: QLPreviewController) -> Int
- {
- return 1
- }
-
- func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem
- {
- return (_exportedLogURL as? NSURL) ?? NSURL()
- }
-
- func previewControllerDidDismiss(_ controller: QLPreviewController)
- {
- guard let exportedLogURL = _exportedLogURL else { return }
-
- let parentDirectory = exportedLogURL.deletingLastPathComponent()
-
- do
- {
- try FileManager.default.removeItem(at: parentDirectory)
- }
- catch
- {
- Logger.main.error("Failed to remove temporary log directory \(parentDirectory.lastPathComponent, privacy: .public). \(error.localizedDescription, privacy: .public)")
- }
-
- _exportedLogURL = nil
- }
-}
+//extension ErrorLogViewController: QLPreviewControllerDataSource, QLPreviewControllerDelegate
+//{
+// func numberOfPreviewItems(in controller: QLPreviewController) -> Int
+// {
+// return 1
+// }
+//
+// func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem
+// {
+// return (_exportedLogURL as? NSURL) ?? NSURL()
+// }
+//
+// func previewControllerDidDismiss(_ controller: QLPreviewController)
+// {
+// guard let exportedLogURL = _exportedLogURL else { return }
+//
+// let parentDirectory = exportedLogURL.deletingLastPathComponent()
+//
+// do
+// {
+// try FileManager.default.removeItem(at: parentDirectory)
+// }
+// catch
+// {
+// Logger.main.error("Failed to remove temporary log directory \(parentDirectory.lastPathComponent, privacy: .public). \(error.localizedDescription, privacy: .public)")
+// }
+//
+// _exportedLogURL = nil
+// }
+//}
diff --git a/AltStore/Settings/PatreonComponents.swift b/AltStore/Settings/PatreonComponents.swift
index c744d837..6a058c14 100644
--- a/AltStore/Settings/PatreonComponents.swift
+++ b/AltStore/Settings/PatreonComponents.swift
@@ -76,13 +76,13 @@ final class AboutPatreonHeaderView: UICollectionReusableView
self.textView.layer.cornerRadius = 20
self.textView.textContainer.lineFragmentPadding = 0
- for imageView in [self.rileyImageView, self.shaneImageView].compactMap({ $0 })
+ for imageView in [self.rileyImageView!, self.shaneImageView!]
{
imageView.clipsToBounds = true
imageView.layer.cornerRadius = imageView.bounds.midY
}
- for button in [self.supportButton, self.accountButton, self.twitterButton, self.instagramButton].compactMap({ $0 })
+ for button in [self.supportButton!, self.accountButton!]
{
button.clipsToBounds = true
button.layer.cornerRadius = 16
diff --git a/AltStore/Settings/Settings.storyboard b/AltStore/Settings/Settings.storyboard
index 717e67a4..beba4955 100644
--- a/AltStore/Settings/Settings.storyboard
+++ b/AltStore/Settings/Settings.storyboard
@@ -103,7 +103,7 @@
-
+
@@ -133,7 +133,7 @@
-
+
@@ -147,7 +147,7 @@
-
+
@@ -179,7 +179,7 @@
-
+
@@ -211,7 +211,7 @@
+
@@ -1328,7 +1185,7 @@ Settings by i cons from the Noun Project
-
+
@@ -1382,7 +1239,7 @@ Settings by i cons from the Noun Project
-
+
@@ -1525,6 +1382,8 @@ Settings by i cons from the Noun Project
+
+
diff --git a/AltStore/Settings/SettingsViewController.swift b/AltStore/Settings/SettingsViewController.swift
index 7e6e96e4..a4ea6d94 100644
--- a/AltStore/Settings/SettingsViewController.swift
+++ b/AltStore/Settings/SettingsViewController.swift
@@ -97,7 +97,6 @@ final class SettingsViewController: UITableViewController
@IBOutlet private var disableAppLimitSwitch: UISwitch!
@IBOutlet private var refreshSideJITServer: UILabel!
- @IBOutlet private var enforceThreeAppLimitSwitch: UISwitch!
@IBOutlet private var disableResponseCachingSwitch: UISwitch!
@IBOutlet private var mastodonButton: UIButton!
@@ -133,7 +132,8 @@ final class SettingsViewController: UITableViewController
debugModeGestureRecognizer.direction = .up
debugModeGestureRecognizer.numberOfTouchesRequired = 3
self.tableView.addGestureRecognizer(debugModeGestureRecognizer)
-
+
+ var versionString: String = ""
if let installedApp = InstalledApp.fetchAltStore(in: DatabaseManager.shared.viewContext)
{
#if BETA
@@ -247,7 +247,6 @@ private extension SettingsViewController
self.backgroundRefreshSwitch.isOn = UserDefaults.standard.isBackgroundRefreshEnabled
self.noIdleTimeoutSwitch.isOn = UserDefaults.standard.isIdleTimeoutDisableEnabled
self.disableAppLimitSwitch.isOn = UserDefaults.standard.isAppLimitDisabled
- self.enforceThreeAppLimitSwitch.isOn = !UserDefaults.standard.ignoreActiveAppsLimit
self.disableResponseCachingSwitch.isOn = UserDefaults.standard.responseCachingDisabled
if self.isViewLoaded
@@ -421,6 +420,10 @@ private extension SettingsViewController
@IBAction func toggleDisableAppLimit(_ sender: UISwitch) {
UserDefaults.standard.isAppLimitDisabled = sender.isOn
+ if UserDefaults.standard.activeAppsLimit != nil
+ {
+ UserDefaults.standard.activeAppsLimit = InstalledApp.freeAccountActiveAppsLimit
+ }
}
@IBAction func toggleIsBackgroundRefreshEnabled(_ sender: UISwitch)
@@ -433,16 +436,6 @@ private extension SettingsViewController
UserDefaults.standard.isIdleTimeoutDisableEnabled = sender.isOn
}
- @IBAction func toggleEnforceThreeAppLimit(_ sender: UISwitch)
- {
- UserDefaults.standard.ignoreActiveAppsLimit = !sender.isOn
-
- if UserDefaults.standard.activeAppsLimit != nil
- {
- UserDefaults.standard.activeAppsLimit = InstalledApp.freeAccountActiveAppsLimit
- }
- }
-
@IBAction func toggleDisableResponseCaching(_ sender: UISwitch)
{
UserDefaults.standard.responseCachingDisabled = sender.isOn
diff --git a/AltStore/Sources/SourcesViewController.swift b/AltStore/Sources/SourcesViewController.swift
index f34cb64f..76520056 100644
--- a/AltStore/Sources/SourcesViewController.swift
+++ b/AltStore/Sources/SourcesViewController.swift
@@ -13,26 +13,26 @@ import AltStoreCore
import Roxas
import Nuke
-struct SourceError: ALTLocalizedError
-{
- enum Code: Int, ALTErrorCode
- {
- typealias Error = SourceError
- case unsupported
- }
-
- var code: Code
- var errorTitle: String?
- var errorFailure: String?
- @Managed var source: Source
-
- var errorFailureReason: String {
- switch self.code
- {
- case .unsupported: return String(format: NSLocalizedString("The source “%@” is not supported by this version of SideStore.", comment: ""), self.$source.name)
- }
- }
-}
+//struct SourceError: ALTLocalizedError
+//{
+// enum Code: Int, ALTErrorCode
+// {
+// typealias Error = SourceError
+// case unsupported
+// }
+//
+// var code: Code
+// var errorTitle: String?
+// var errorFailure: String?
+// @Managed var source: Source
+//
+// var errorFailureReason: String {
+// switch self.code
+// {
+// case .unsupported: return String(format: NSLocalizedString("The source “%@” is not supported by this version of SideStore.", comment: ""), self.$source.name)
+// }
+// }
+//}
@objc(SourcesFooterView)
private final class SourcesFooterView: TextCollectionReusableView
@@ -454,14 +454,14 @@ private extension SourcesViewController
completionHandler?(false)
let dispatchGroup = DispatchGroup()
-
+
var sourcesByURL = [URL: Source]()
var fetchError: Error?
-
+
for sourceURL in featuredSourceURLs
{
dispatchGroup.enter()
-
+
AppManager.shared.fetchSource(sourceURL: sourceURL, managedObjectContext: context) { result in
// Serialize access to sourcesByURL.
context.performAndWait {
@@ -470,12 +470,12 @@ private extension SourcesViewController
case .failure(let error): fetchError = error
case .success(let source): sourcesByURL[source.sourceURL] = source
}
-
+
dispatchGroup.leave()
}
}
}
-
+
dispatchGroup.notify(queue: .main) {
if let error = fetchError
{
@@ -547,98 +547,6 @@ extension SourcesViewController
let source = self.dataSource.item(at: indexPath)
self.showSourceDetails(for: source)
}
-
- // override func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView
- // {
- // let headerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: kind, for: indexPath) as! UICollectionViewListCell
-
- // var configuation = UIListContentConfiguration.cell()
- // configuation.text = NSLocalizedString("Sources control what apps are available to download through AltStore.", comment: "")
- // configuation.textProperties.color = .secondaryLabel
- // configuation.textProperties.alignment = .natural
-
- // headerView.contentConfiguration = configuation
-
- // switch kind
- // {
- // case UICollectionView.elementKindSectionHeader:
- // switch Section.allCases[indexPath.section]
- // {
- // case .added:
- // headerView.textLabel.text = NSLocalizedString("Sources control what apps are available to download through SideStore.", comment: "")
- // headerView.textLabel.font = UIFont.preferredFont(forTextStyle: .callout)
- // headerView.textLabel.textAlignment = .natural
-
- // headerView.topLayoutConstraint.constant = 14
- // headerView.bottomLayoutConstraint.constant = 30
-
- // case .trusted:
- // switch self.fetchTrustedSourcesResult
- // {
- // case .failure: headerView.textLabel.text = NSLocalizedString("Error Loading Trusted Sources", comment: "")
- // case .success, .none: headerView.textLabel.text = NSLocalizedString("Trusted Sources", comment: "")
- // }
-
- // let descriptor = UIFontDescriptor.preferredFontDescriptor(withTextStyle: .callout).withSymbolicTraits(.traitBold)!
- // headerView.textLabel.font = UIFont(descriptor: descriptor, size: 0)
- // headerView.textLabel.textAlignment = .center
-
- // headerView.topLayoutConstraint.constant = 54
- // headerView.bottomLayoutConstraint.constant = 15
- // }
-
- // case UICollectionView.elementKindSectionFooter:
- // let footerView = headerView as! SourcesFooterView
- // let font = UIFont.preferredFont(forTextStyle: .subheadline)
-
- // switch self.fetchTrustedSourcesResult
- // {
- // case .failure(let error):
- // footerView.textView.font = font
- // footerView.textView.text = error.localizedDescription
-
- // footerView.activityIndicatorView.stopAnimating()
- // footerView.topLayoutConstraint.constant = 0
- // footerView.textView.textAlignment = .center
-
- // case .success, .none:
- // footerView.textView.delegate = self
-
- // let attributedText = NSMutableAttributedString(
- // string: NSLocalizedString("SideStore has reviewed these sources to make sure they meet our safety standards.", comment: ""),
- // attributes: [.font: font, .foregroundColor: UIColor.gray]
- // )
- // //attributedText.mutableString.append(" ")
-
- // //let boldedFont = UIFont(descriptor: font.fontDescriptor.withSymbolicTraits(.traitBold)!, size: font.pointSize)
- // //let openPatreonURL = URL(string: "https://SideStore.io/")!
-
- // // let joinPatreonText = NSAttributedString(
- // // string: NSLocalizedString("", comment: ""),
- // // attributes: [.font: boldedFont, .link: openPatreonURL, .underlineColor: UIColor.clear]
- // //)
- // //attributedText.append(joinPatreonText)
-
- // footerView.textView.attributedText = attributedText
- // footerView.textView.textAlignment = .natural
-
- // if self.fetchTrustedSourcesResult != nil
- // {
- // footerView.activityIndicatorView.stopAnimating()
- // footerView.topLayoutConstraint.constant = 20
- // }
- // else
- // {
- // footerView.activityIndicatorView.startAnimating()
- // footerView.topLayoutConstraint.constant = 0
- // }
- // }
-
- // default: break
- // }
-
- // return headerView
- // }
}
extension SourcesViewController: NSFetchedResultsControllerDelegate
diff --git a/AltStore/TabBarController.swift b/AltStore/TabBarController.swift
index a93776fe..73ee91d7 100644
--- a/AltStore/TabBarController.swift
+++ b/AltStore/TabBarController.swift
@@ -136,7 +136,9 @@ private extension TabBarController
{
self.selectedIndex = Tab.myApps.rawValue
}
- @objc func openErrorLog(_: Notification){
+
+ @objc func openErrorLog(_ notification: Notification)
+ {
self.selectedIndex = Tab.settings.rawValue
}
}
diff --git a/AltStoreCore/Extensions/UserDefaults+AltStore.swift b/AltStoreCore/Extensions/UserDefaults+AltStore.swift
index 7f9b4202..cefa5534 100644
--- a/AltStoreCore/Extensions/UserDefaults+AltStore.swift
+++ b/AltStoreCore/Extensions/UserDefaults+AltStore.swift
@@ -82,8 +82,6 @@ public extension UserDefaults
}
@NSManaged @objc(activeAppsLimit) private var _activeAppsLimit: NSNumber?
- @NSManaged var ignoreActiveAppsLimit: Bool
-
// Including "MacDirtyCow" in name triggers false positives with malware detectors 🤷♂️
@NSManaged var isCowExploitSupported: Bool
@@ -129,8 +127,7 @@ public extension UserDefaults
#keyPath(UserDefaults.requiresAppGroupMigration): true,
#keyPath(UserDefaults.menuAnisetteList): "https://servers.sidestore.io/servers.json",
#keyPath(UserDefaults.menuAnisetteURL): "https://ani.sidestore.io",
- #keyPath(UserDefaults.ignoreActiveAppsLimit): false,
- #keyPath(UserDefaults.isMacDirtyCowSupported): isMacDirtyCowSupported
+ #keyPath(UserDefaults.isCowExploitSupported): isMacDirtyCowSupported,
#keyPath(UserDefaults.permissionCheckingDisabled): permissionCheckingDisabled,
#keyPath(UserDefaults._preferredAppSorting): preferredAppSorting.rawValue,
] as [String: Any]
@@ -140,8 +137,8 @@ public extension UserDefaults
if !isMacDirtyCowSupported
{
- // Disable ignoreActiveAppsLimit if running iOS version that doesn't support MacDirtyCow.
- UserDefaults.standard.ignoreActiveAppsLimit = false
+ // Disable isAppLimitDisabled if running iOS version that doesn't support MacDirtyCow.
+ UserDefaults.standard.isAppLimitDisabled = false
}
#if !BETA
diff --git a/AltStoreCore/Model/AppPermission.swift b/AltStoreCore/Model/AppPermission.swift
index d58fadbd..8f0bbf60 100644
--- a/AltStoreCore/Model/AppPermission.swift
+++ b/AltStoreCore/Model/AppPermission.swift
@@ -10,67 +10,6 @@ import CoreData
import UIKit
import AltSign
-public extension ALTAppPermissionType
-{
- var localizedShortName: String? {
- switch self
- {
- case .photos: return NSLocalizedString("Photos", comment: "")
- case .backgroundAudio: return NSLocalizedString("Audio (BG)", comment: "")
- case .backgroundFetch: return NSLocalizedString("Fetch (BG)", comment: "")
- default: return nil
- }
- }
-
- var localizedName: String? {
- switch self
- {
- case .photos: return NSLocalizedString("Photos", comment: "")
- case .camera: return NSLocalizedString("Camera", comment: "")
- case .location: return NSLocalizedString("Location", comment: "")
- case .contacts: return NSLocalizedString("Contacts", comment: "")
- case .reminders: return NSLocalizedString("Reminders", comment: "")
- case .appleMusic: return NSLocalizedString("Apple Music", comment: "")
- case .microphone: return NSLocalizedString("Microphone", comment: "")
- case .speechRecognition: return NSLocalizedString("Speech Recognition", comment: "")
- case .backgroundAudio: return NSLocalizedString("Background Audio", comment: "")
- case .backgroundFetch: return NSLocalizedString("Background Fetch", comment: "")
- case .bluetooth: return NSLocalizedString("Bluetooth", comment: "")
- case .network: return NSLocalizedString("Network", comment: "")
- case .calendars: return NSLocalizedString("Calendars", comment: "")
- case .touchID: return NSLocalizedString("Touch ID", comment: "")
- case .faceID: return NSLocalizedString("Face ID", comment: "")
- case .siri: return NSLocalizedString("Siri", comment: "")
- case .motion: return NSLocalizedString("Motion", comment: "")
- default: return nil
- }
- }
-
- var icon: UIImage? {
- switch self
- {
- case .photos: return UIImage(systemName: "photo.on.rectangle.angled")
- case .camera: return UIImage(systemName: "camera.fill")
- case .location: return UIImage(systemName: "location.fill")
- case .contacts: return UIImage(systemName: "person.2.fill")
- case .reminders: return UIImage(systemName: "checklist")
- case .appleMusic: return UIImage(systemName: "music.note")
- case .microphone: return UIImage(systemName: "mic.fill")
- case .speechRecognition: return UIImage(systemName: "waveform.and.mic")
- case .backgroundAudio: return UIImage(systemName: "speaker.fill")
- case .backgroundFetch: return UIImage(systemName: "square.and.arrow.down")
- case .bluetooth: return UIImage(systemName: "wave.3.right")
- case .network: return UIImage(systemName: "network")
- case .calendars: return UIImage(systemName: "calendar")
- case .touchID: return UIImage(systemName: "touchid")
- case .faceID: return UIImage(systemName: "faceid")
- case .siri: return UIImage(systemName: "mic.and.signal.meter.fill")
- case .motion: return UIImage(systemName: "figure.walk.motion")
- default:
- return nil
- }
- }
-}
@objc(AppPermission) @dynamicMemberLookup
public class AppPermission: NSManagedObject, Fetchable
diff --git a/AltStoreCore/Model/AppVersion.swift b/AltStoreCore/Model/AppVersion.swift
index 36c6c850..85e312bc 100644
--- a/AltStoreCore/Model/AppVersion.swift
+++ b/AltStoreCore/Model/AppVersion.swift
@@ -157,11 +157,15 @@ public extension AppVersion
}
var isSupported: Bool {
- if let minOSVersion = self.minOSVersion, !ProcessInfo.processInfo.isOperatingSystemAtLeast(minOSVersion) {
- return false
- } else if let maxOSVersion = self.maxOSVersion, ProcessInfo.processInfo.operatingSystemVersion > maxOSVersion {
+ if let minOSVersion = self.minOSVersion, !ProcessInfo.processInfo.isOperatingSystemAtLeast(minOSVersion)
+ {
return false
}
+ else if let maxOSVersion = self.maxOSVersion, ProcessInfo.processInfo.operatingSystemVersion > maxOSVersion
+ {
+ return false
+ }
+
return true
}
}
diff --git a/AltStoreCore/Model/DatabaseManager.swift b/AltStoreCore/Model/DatabaseManager.swift
index 9a72ea53..0b567c8d 100644
--- a/AltStoreCore/Model/DatabaseManager.swift
+++ b/AltStoreCore/Model/DatabaseManager.swift
@@ -53,6 +53,7 @@ public class DatabaseManager
private let coordinatorQueue = OperationQueue()
private var ignoreWillMigrateDatabaseNotification = false
+
private init()
{
self.persistentContainer = PersistentContainer(name: "AltStore", bundle: Bundle(for: DatabaseManager.self))
@@ -108,6 +109,7 @@ public extension DatabaseManager
self.ignoreWillMigrateDatabaseNotification = true
CFNotificationCenterPostNotification(CFNotificationCenterGetDarwinNotifyCenter(), .willMigrateDatabase, nil, nil, true)
}
+
self.migrateDatabaseToAppGroupIfNeeded { (result) in
switch result
{
diff --git a/AltStoreCore/Model/InstalledApp.swift b/AltStoreCore/Model/InstalledApp.swift
index c69c779e..01a4d6c2 100644
--- a/AltStoreCore/Model/InstalledApp.swift
+++ b/AltStoreCore/Model/InstalledApp.swift
@@ -15,7 +15,7 @@ import SemanticVersion
extension InstalledApp
{
public static var freeAccountActiveAppsLimit: Int {
- if UserDefaults.standard.ignoreActiveAppsLimit
+ if UserDefaults.standard.isAppLimitDisabled
{
// MacDirtyCow exploit allows users to remove 3-app limit, so return 10 to match App ID limit per-week.
// Don't return nil because that implies there is no limit, which isn't quite true due to App ID limit.
@@ -159,15 +159,17 @@ public extension InstalledApp
func loadIcon(completion: @escaping (Result) -> Void)
{
- if self.bundleIdentifier == StoreApp.altstoreAppID, let iconName = UIApplication.alt_shared?.alternateIconName
- {
- // Use alternate app icon for AltStore, if one is chosen.
-
- let image = UIImage(named: iconName)
- completion(.success(image))
-
- return
- }
+ // TODO: @mahee96: Fix this later (reason: alternateIcon is not available for appEx)
+// if self.bundleIdentifier == StoreApp.altstoreAppID,
+// let iconName = UIApplication.alt_shared?.alternateIconName
+// {
+// // Use alternate app icon for AltStore, if one is chosen.
+//
+// let image = UIImage(named: iconName)
+// completion(.success(image))
+//
+// return
+// }
let hasAlternateIcon = self.hasAlternateIcon
let alternateIconURL = self.alternateIconURL
@@ -211,30 +213,34 @@ public extension InstalledApp
{
let fetchRequest = InstalledApp.fetchRequest() as NSFetchRequest
- let predicateFormat = [
- // isActive && storeApp != nil && latestSupportedVersion != nil
- "%K == YES AND %K != nil AND %K != nil",
+ // let predicateFormat = [
+ // // isActive && storeApp != nil && latestSupportedVersion != nil
+ // "%K == YES AND %K != nil AND %K != nil",
- "AND",
+ // "AND",
- // latestSupportedVersion.version != installedApp.version || latestSupportedVersion.buildVersion != installedApp.storeBuildVersion
- //
- // We have to also check !(latestSupportedVersion.buildVersion == '' && installedApp.storeBuildVersion == nil)
- // because latestSupportedVersion.buildVersion stores an empty string for nil, while installedApp.storeBuildVersion uses NULL.
- "(%K != %K OR (%K != %K AND NOT (%K == '' AND %K == nil)))",
+ // // latestSupportedVersion.version != installedApp.version || latestSupportedVersion.buildVersion != installedApp.storeBuildVersion
+ // //
+ // // We have to also check !(latestSupportedVersion.buildVersion == '' && installedApp.storeBuildVersion == nil)
+ // // because latestSupportedVersion.buildVersion stores an empty string for nil, while installedApp.storeBuildVersion uses NULL.
+ // "(%K != %K OR (%K != %K AND NOT (%K == '' AND %K == nil)))",
- "AND",
+ // "AND",
- // !isPledgeRequired || isPledged
- "(%K == NO OR %K == YES)"
- ].joined(separator: " ")
+ // // !isPledgeRequired || isPledged
+ // "(%K == NO OR %K == YES)"
+ // ].joined(separator: " ")
- fetchRequest.predicate = NSPredicate(format: predicateFormat,
- #keyPath(InstalledApp.isActive), #keyPath(InstalledApp.storeApp), #keyPath(InstalledApp.storeApp.latestSupportedVersion),
- #keyPath(InstalledApp.storeApp.latestSupportedVersion.version), #keyPath(InstalledApp.version),
- #keyPath(InstalledApp.storeApp.latestSupportedVersion._buildVersion), #keyPath(InstalledApp.storeBuildVersion),
- #keyPath(InstalledApp.storeApp.latestSupportedVersion._buildVersion), #keyPath(InstalledApp.storeBuildVersion),
- #keyPath(InstalledApp.storeApp.isPledgeRequired), #keyPath(InstalledApp.storeApp.isPledged))
+ // fetchRequest.predicate = NSPredicate(format: predicateFormat,
+ // #keyPath(InstalledApp.isActive), #keyPath(InstalledApp.storeApp), #keyPath(InstalledApp.storeApp.latestSupportedVersion),
+ // #keyPath(InstalledApp.storeApp.latestSupportedVersion.version), #keyPath(InstalledApp.version),
+ // #keyPath(InstalledApp.storeApp.latestSupportedVersion._buildVersion), #keyPath(InstalledApp.storeBuildVersion),
+ // #keyPath(InstalledApp.storeApp.latestSupportedVersion._buildVersion), #keyPath(InstalledApp.storeBuildVersion),
+ // #keyPath(InstalledApp.storeApp.isPledgeRequired), #keyPath(InstalledApp.storeApp.isPledged))
+
+ fetchRequest.predicate = NSPredicate(format: "%K == YES AND %K == YES",
+ #keyPath(InstalledApp.isActive), #keyPath(InstalledApp.hasUpdate))
+
return fetchRequest
}
diff --git a/AltStoreCore/Model/MergePolicy.swift b/AltStoreCore/Model/MergePolicy.swift
index eea54b0e..dd556c01 100644
--- a/AltStoreCore/Model/MergePolicy.swift
+++ b/AltStoreCore/Model/MergePolicy.swift
@@ -356,11 +356,11 @@ open class MergePolicy: RSTRelationshipPreservingMergePolicy
// Screenshots
if let sortedScreenshotIDs = sortedScreenshotIDsByGlobalAppID[globallyUniqueID],
let sortedScreenshotIDsArray = sortedScreenshotIDs.array as? [String],
- case let databaseScreenshotIDs = databaseObject.allScreenshots.map({ $0.screenshotID }),
+ case let databaseScreenshotIDs = databaseObject.screenshots.map({ $0.screenshotID }),
databaseScreenshotIDs != sortedScreenshotIDsArray
{
// Screenshot order is incorrect, so attempt to fix by re-sorting.
- let fixedScreenshots = databaseObject.allScreenshots.sorted { (screenshotA, screenshotB) in
+ let fixedScreenshots = databaseObject.screenshots.sorted { (screenshotA, screenshotB) in
let indexA = sortedScreenshotIDs.index(of: screenshotA.screenshotID)
let indexB = sortedScreenshotIDs.index(of: screenshotB.screenshotID)
return indexA < indexB
diff --git a/AltStoreCore/Model/Patreon/PatreonAccount.swift b/AltStoreCore/Model/Patreon/PatreonAccount.swift
index e1afc1ef..6dce1b31 100644
--- a/AltStoreCore/Model/Patreon/PatreonAccount.swift
+++ b/AltStoreCore/Model/Patreon/PatreonAccount.swift
@@ -45,7 +45,8 @@ public class PatreonAccount: NSManagedObject, Fetchable
// {
// self.isPatron = false
// }
- self.isPatron = true
+// self.isPatron = true
+ self.isAltStorePatron = true
}
}
diff --git a/AltStoreCore/Model/Source.swift b/AltStoreCore/Model/Source.swift
index 88f031fb..3389d8d2 100644
--- a/AltStoreCore/Model/Source.swift
+++ b/AltStoreCore/Model/Source.swift
@@ -462,7 +462,7 @@ public extension Source
let source = Source(context: context)
source.name = "SideStore Offical"
source.identifier = Source.altStoreIdentifier
- source.sourceURL = Source.altStoreSourceURL
+ try! source.setSourceURL(Source.altStoreSourceURL)
return source
}
diff --git a/AltStoreCore/Model/StoreApp.swift b/AltStoreCore/Model/StoreApp.swift
index 9f9cbdd2..2f29446c 100644
--- a/AltStoreCore/Model/StoreApp.swift
+++ b/AltStoreCore/Model/StoreApp.swift
@@ -190,7 +190,7 @@ public class StoreApp: NSManagedObject, Decodable, Fetchable
permission.sourceID = self.sourceIdentifier ?? ""
}
- for screenshot in self.allScreenshots
+ for screenshot in self.screenshots
{
screenshot.sourceID = self.sourceIdentifier ?? ""
}
@@ -282,8 +282,6 @@ public class StoreApp: NSManagedObject, Decodable, Fetchable
case developerName
case localizedDescription
case iconURL
- case screenshotURLs
- case downloadURL
case platformURLs
case screenshots
case tintColor
@@ -606,7 +604,7 @@ public extension StoreApp
func screenshots(for deviceType: ALTDeviceType) -> [AppScreenshot]
{
//TODO: Support multiple device types
- let filteredScreenshots = self.allScreenshots.filter { $0.deviceType == deviceType }
+ let filteredScreenshots = self.screenshots.filter { $0.deviceType == deviceType }
return filteredScreenshots
}
@@ -626,7 +624,7 @@ public extension StoreApp
let preferredScreenshots = self.screenshots(for: deviceType)
guard !preferredScreenshots.isEmpty else {
// There are no screenshots for deviceType, so return _all_ screenshots instead.
- return self.allScreenshots
+ return self.screenshots
}
return preferredScreenshots
diff --git a/AltStoreCore/Patreon/PatreonAPI.swift b/AltStoreCore/Patreon/PatreonAPI.swift
index a5c43298..7aab67e7 100644
--- a/AltStoreCore/Patreon/PatreonAPI.swift
+++ b/AltStoreCore/Patreon/PatreonAPI.swift
@@ -300,7 +300,7 @@ public extension PatreonAPI
{
let account = try result.get()
- if let context = account.managedObjectContext, !account.isPatron
+ if let context = account.managedObjectContext, !account.isAltStorePatron
{
// Deactivate all beta apps now that we're no longer a patron.
//self.deactivateBetaApps(in: context)
diff --git a/AltStoreCore/Protocols/AppProtocol.swift b/AltStoreCore/Protocols/AppProtocol.swift
index 22467274..98cda889 100644
--- a/AltStoreCore/Protocols/AppProtocol.swift
+++ b/AltStoreCore/Protocols/AppProtocol.swift
@@ -63,15 +63,16 @@ extension InstalledApp: AppProtocol
}
}
-extension AppVersion: AppProtocol {
+extension AppVersion: AppProtocol
+{
public var name: String {
return self.app?.name ?? self.bundleIdentifier
}
-
+
public var bundleIdentifier: String {
return self.appBundleID
}
-
+
public var url: URL? {
return self.downloadURL
}
diff --git a/AltWidget/Assets.xcassets/SmallIcon.imageset/altminicon.pdf b/AltWidget/Assets.xcassets/SmallIcon.imageset/altminicon.pdf
deleted file mode 100644
index cdddd470..00000000
Binary files a/AltWidget/Assets.xcassets/SmallIcon.imageset/altminicon.pdf and /dev/null differ
diff --git a/AltWidget/Provider.swift b/AltWidget/Provider.swift
deleted file mode 100644
index ca0b013d..00000000
--- a/AltWidget/Provider.swift
+++ /dev/null
@@ -1,249 +0,0 @@
-//
-// Provider.swift
-// AltStore
-//
-// Created by Riley Testut on 6/26/20.
-// Copyright © 2020 Riley Testut. All rights reserved.
-//
-
-import WidgetKit
-import CoreData
-
-import AltStoreCore
-import AltSign
-
-struct AppEntry: TimelineEntry
-{
- var date: Date
- var relevance: TimelineEntryRelevance?
-
- var app: AppSnapshot?
- var isPlaceholder: Bool = false
-}
-
-struct Provider: IntentTimelineProvider
-{
- typealias Intent = ViewAppIntent
- typealias Entry = AppEntry
-
- func placeholder(in context: Context) -> AppEntry
- {
- return AppEntry(date: Date(), app: nil, isPlaceholder: true)
- }
-
- func getSnapshot(for configuration: ViewAppIntent, in context: Context, completion: @escaping (AppEntry) -> Void)
- {
- self.prepare { (result) in
- do
- {
- let context = try result.get()
- let snapshot = InstalledApp.fetchAltStore(in: context).map(AppSnapshot.init)
-
- let entry = AppEntry(date: Date(), app: snapshot)
- completion(entry)
- }
- catch
- {
- print("Error preparing widget snapshot:", error)
-
- let entry = AppEntry(date: Date(), app: nil)
- completion(entry)
- }
- }
- }
-
- func getTimeline(for configuration: ViewAppIntent, in context: Context, completion: @escaping (Timeline) -> Void) {
- self.prepare { (result) in
- autoreleasepool {
- do
- {
- let context = try result.get()
-
- let installedApp: InstalledApp?
-
- if let identifier = configuration.app?.identifier
- {
- let app = InstalledApp.first(satisfying: NSPredicate(format: "%K == %@", #keyPath(InstalledApp.bundleIdentifier), identifier),
- in: context)
- installedApp = app
- }
- else
- {
- installedApp = InstalledApp.fetchAltStore(in: context)
- }
-
- guard let snapshot = installedApp.map(AppSnapshot.init) else { throw ALTError(.invalidApp) }
-
- let currentDate = Calendar.current.startOfDay(for: Date())
- let numberOfDays = snapshot.expirationDate.numberOfCalendarDays(since: currentDate)
-
- // Generate a timeline consisting of one entry per day.
- var entries: [AppEntry] = []
-
- switch numberOfDays
- {
- case ..<0:
- let entry = AppEntry(date: currentDate, relevance: TimelineEntryRelevance(score: 0.0), app: snapshot)
- entries.append(entry)
-
- case 0:
- let entry = AppEntry(date: currentDate, relevance: TimelineEntryRelevance(score: 1.0), app: snapshot)
- entries.append(entry)
-
- default:
- // To reduce memory consumption, we only generate entries for the next week. This includes:
- // * 1 for each day the app is valid (up to 7)
- // * 1 "0 days remaining"
- // * 1 "Expired"
- let numberOfEntries = min(numberOfDays, 7) + 2
-
- let appEntries = (0 ..< numberOfEntries).map { (dayOffset) -> AppEntry in
- let entryDate = Calendar.current.date(byAdding: .day, value: dayOffset, to: currentDate) ?? currentDate.addingTimeInterval(Double(dayOffset) * 60 * 60 * 24)
-
- let daysSinceRefresh = entryDate.numberOfCalendarDays(since: snapshot.refreshedDate)
- let totalNumberOfDays = snapshot.expirationDate.numberOfCalendarDays(since: snapshot.refreshedDate)
-
- let score = (entryDate <= snapshot.expirationDate) ? Float(daysSinceRefresh + 1) / Float(totalNumberOfDays + 1) : 0 // Expired apps have a score of 0.
- let entry = AppEntry(date: entryDate, relevance: TimelineEntryRelevance(score: score), app: snapshot)
- return entry
- }
-
- entries.append(contentsOf: appEntries)
- }
-
- let timeline = Timeline(entries: entries, policy: .atEnd)
- completion(timeline)
- }
- catch
- {
- print("Error preparing widget timeline:", error)
-
- let entry = AppEntry(date: Date(), app: nil)
- let timeline = Timeline(entries: [entry], policy: .atEnd)
- completion(timeline)
- }
- }
- }
- }
-
- private func prepare(completion: @escaping (Result) -> Void)
- {
- DatabaseManager.shared.start { (error) in
- if let error = error
- {
- completion(.failure(error))
- }
- else
- {
- DatabaseManager.shared.viewContext.perform {
- completion(.success(DatabaseManager.shared.viewContext))
- }
- }
- }
- }
-}
-
-struct HomeScreenWidget: Widget
-{
- private let kind: String = "AppDetail"
-
- public var body: some WidgetConfiguration {
- let configuration = IntentConfiguration(kind: kind,
- intent: ViewAppIntent.self,
- provider: Provider()) { (entry) in
- WidgetView(entry: entry)
- }
- .supportedFamilies([.systemSmall])
- .configurationDisplayName("AltWidget")
- .description("View remaining days until your sideloaded apps expire.")
-
- if #available(iOS 17, *)
- {
- return configuration
- .contentMarginsDisabled()
- }
- else
- {
- return configuration
- }
- }
-}
-
-struct TextLockScreenWidget: Widget
-{
- private let kind: String = "TextLockAppDetail"
-
- public var body: some WidgetConfiguration {
- if #available(iOSApplicationExtension 16, *)
- {
- return IntentConfiguration(kind: kind,
- intent: ViewAppIntent.self,
- provider: Provider()) { (entry) in
- ComplicationView(entry: entry, style: .text)
- }
- .supportedFamilies([.accessoryCircular])
- .configurationDisplayName("AltWidget (Text)")
- .description("View remaining days until SideStore expires.")
- }
- else
- {
- return EmptyWidgetConfiguration()
- }
- }
-}
-
-struct IconLockScreenWidget: Widget
-{
- private let kind: String = "IconLockAppDetail"
-
- public var body: some WidgetConfiguration {
- if #available(iOSApplicationExtension 16, *)
- {
- return IntentConfiguration(kind: kind,
- intent: ViewAppIntent.self,
- provider: Provider()) { (entry) in
- ComplicationView(entry: entry, style: .icon)
- }
- .supportedFamilies([.accessoryCircular])
- .configurationDisplayName("AltWidget (Icon)")
- .description("View remaining days until SideStore expires.")
- }
- else
- {
- return EmptyWidgetConfiguration()
- }
- }
-}
-//
-//struct LockScreenWidget: Widget
-//{
-// private let kind: String = "LockAppDetail"
-//
-// public var body: some WidgetConfiguration {
-// if #available(iOSApplicationExtension 16, *)
-// {
-// return IntentConfiguration(kind: kind,
-// intent: ViewAppIntent.self,
-// provider: Provider()) { (entry) in
-// ComplicationView(entry: entry, style: .icon)
-// }
-// .supportedFamilies([.accessoryCircular])
-// .configurationDisplayName("AltWidget")
-// .description("View remaining days until SideStore expires.")
-// }
-// else
-// {
-// return EmptyWidgetConfiguration()
-// }
-// }
-//}
-
-@main
-struct AltWidgets: WidgetBundle
-{
- var body: some Widget {
- HomeScreenWidget()
- IconLockScreenWidget()
- TextLockScreenWidget()
- }
-}
diff --git a/Dependencies/AltSign b/Dependencies/AltSign
new file mode 160000
index 00000000..790b9ccd
--- /dev/null
+++ b/Dependencies/AltSign
@@ -0,0 +1 @@
+Subproject commit 790b9ccdaf2cec831689395c527e80f1f2838041
diff --git a/Podfile b/Podfile
index a9e069da..cf861ee5 100644
--- a/Podfile
+++ b/Podfile
@@ -1,6 +1,6 @@
inhibit_all_warnings!
-target 'AltStore' do
+target 'SideStore' do
platform :ios, '14.0'
use_frameworks!
@@ -8,17 +8,7 @@ target 'AltStore' do
# Pods for AltStore
pod 'Nuke', '~> 10.0'
pod 'AppCenter', '~> 5.0'
-
-end
-
-target 'AltServer' do
- platform :macos, '11'
-
- use_frameworks!
-
- # Pods for AltServer
- pod 'STPrivilegedTask', :git => 'https://github.com/rileytestut/STPrivilegedTask.git'
- pod 'Sparkle', '~> 2.3'
+ pod 'Starscream', '~> 4.0.0'
end
@@ -27,8 +17,12 @@ target 'AltStoreCore' do
use_frameworks!
- # Pods for AltServer
+ # Pods for AltStoreCore
pod 'KeychainAccess', '~> 4.2.0'
+ # pod 'SemanticVersion', '~> 0.3.5'
+ # Add the Swift Package using the repository URL
+ # pod 'SemanticVersion', :git => 'https://github.com/SwiftPackageIndex/SemanticVersion.git', :tag => '0.4.0'
+
end
@@ -39,4 +33,4 @@ post_install do |installer|
config.build_settings['MACOSX_DEPLOYMENT_TARGET'] = '11.0'
end
end
-end
\ No newline at end of file
+end
diff --git a/Podfile.lock b/Podfile.lock
index 8503f488..477ad177 100644
--- a/Podfile.lock
+++ b/Podfile.lock
@@ -9,39 +9,27 @@ PODS:
- AppCenter/Core
- KeychainAccess (4.2.2)
- Nuke (10.7.1)
- - Sparkle (2.3.2)
- - STPrivilegedTask (1.0.8)
+ - Starscream (4.0.8)
DEPENDENCIES:
- AppCenter (~> 5.0)
- KeychainAccess (~> 4.2.0)
- Nuke (~> 10.0)
- - Sparkle (~> 2.3)
- - STPrivilegedTask (from `https://github.com/rileytestut/STPrivilegedTask.git`)
+ - Starscream (~> 4.0.0)
SPEC REPOS:
trunk:
- AppCenter
- KeychainAccess
- Nuke
- - Sparkle
-
-EXTERNAL SOURCES:
- STPrivilegedTask:
- :git: https://github.com/rileytestut/STPrivilegedTask.git
-
-CHECKOUT OPTIONS:
- STPrivilegedTask:
- :commit: 02ab5081c4f1d7f6a70f5413c88d32dbbea66f4c
- :git: https://github.com/rileytestut/STPrivilegedTask.git
+ - Starscream
SPEC CHECKSUMS:
AppCenter: 18153bb6bc4241d14c8cce57466ac1c88136b476
KeychainAccess: c0c4f7f38f6fc7bbe58f5702e25f7bd2f65abf51
Nuke: 279f17a599fd1c83cf51de5e0e1f2db143a287b0
- Sparkle: b36a51855e81585a1c38e32e53101d36c00f4304
- STPrivilegedTask: 3a3f6add7c567b1be8c326328eb3dd6dc5daed91
+ Starscream: 19b5533ddb925208db698f0ac508a100b884a1b9
-PODFILE CHECKSUM: 3ca028c93d6c7f9f71be0028419da64855dba982
+PODFILE CHECKSUM: a8db3d0bf5da636c63e459c1ca0453c0937e1c1d
-COCOAPODS: 1.12.1
+COCOAPODS: 1.16.2
diff --git a/Shared/Categories/NSError+ALTServerError.m b/Shared/Categories/NSError+ALTServerError.m
index a933a07b..4685490e 100644
--- a/Shared/Categories/NSError+ALTServerError.m
+++ b/Shared/Categories/NSError+ALTServerError.m
@@ -8,12 +8,6 @@
#import "NSError+ALTServerError.h"
-#if TARGET_OS_OSX
-#import "AltServer-Swift.h"
-#else
-#import "AltStoreCore/AltStoreCore-Swift.h"
-#endif
-
#if ALTJIT
#import "AltJIT-Swift.h"
@import AltSign;
@@ -26,10 +20,9 @@
#endif
NSErrorDomain const AltServerErrorDomain = @"AltServer.ServerError";
-NSErrorDomain const AltServerInstallationErrorDomain = @"AltServer.InstallationError";
+NSErrorDomain const AltServerInstallationErrorDomain = @"Apple.InstallationError";
NSErrorDomain const AltServerConnectionErrorDomain = @"AltServer.ConnectionError";
-
NSErrorUserInfoKey const ALTUnderlyingErrorDomainErrorKey = @"underlyingErrorDomain";
NSErrorUserInfoKey const ALTUnderlyingErrorCodeErrorKey = @"underlyingErrorCode";
NSErrorUserInfoKey const ALTProvisioningProfileBundleIDErrorKey = @"bundleIdentifier";
@@ -219,7 +212,7 @@ NSErrorUserInfoKey const ALTNSCodingPathKey = @"NSCodingPath";
if (underlyingError != nil) {
return underlyingError.localizedFailureReason ?: underlyingError.localizedDescription;
}
- return NSLocalizedString(@"An error occured while installing the app.", @"");
+ return NSLocalizedString(@"An error occurred while installing the app.", @"");
}
case ALTServerErrorMaximumFreeAppLimitReached:
@@ -289,7 +282,9 @@ NSErrorUserInfoKey const ALTNSCodingPathKey = @"NSCodingPath";
if (underlyingError.localizedRecoverySuggestion != nil){
return underlyingError.localizedRecoverySuggestion;
}
- // If there is no underlying error found, fall through to AltServerErrorDeviceNotFound
+
+ // If there is no underlying error, fall through to ALTServerErrorDeviceNotFound.
+ // return nil;
}
case ALTServerErrorDeviceNotFound:
return NSLocalizedString(@"Make sure you have trusted this device with your computer and Wi-Fi sync is enabled.", @"");
diff --git a/Shared/Errors/ALTLocalizedError.swift b/Shared/Errors/ALTLocalizedError.swift
index 644936f2..53728288 100644
--- a/Shared/Errors/ALTLocalizedError.swift
+++ b/Shared/Errors/ALTLocalizedError.swift
@@ -75,8 +75,8 @@ public extension ALTLocalizedError
var userInfo: [String: Any?] = [
NSLocalizedFailureErrorKey: self.errorFailure,
ALTLocalizedTitleErrorKey: self.errorTitle,
-// ALTSourceFileErrorKey: self.sourceFile, // TODO: Figure out where these come from
-// ALTSourceLineErrorKey: self.sourceLine,
+ ALTSourceFileErrorKey: self.sourceFile,
+ ALTSourceLineErrorKey: self.sourceLine,
]
userInfo.merge(self.userInfoValues) { (_, new) in new }
diff --git a/Shared/Errors/ALTWrappedError.m b/Shared/Errors/ALTWrappedError.m
index 686e022a..13994057 100644
--- a/Shared/Errors/ALTWrappedError.m
+++ b/Shared/Errors/ALTWrappedError.m
@@ -30,6 +30,7 @@
_wrappedError = [error copy];
}
}
+
return self;
}
diff --git a/Shared/Errors/JITError.swift b/Shared/Errors/JITError.swift
deleted file mode 100644
index f22edce6..00000000
--- a/Shared/Errors/JITError.swift
+++ /dev/null
@@ -1,66 +0,0 @@
-//
-// JITError.swift
-// AltJIT
-//
-// Created by Riley Testut on 9/3/23.
-// Copyright © 2023 Riley Testut. All rights reserved.
-//
-
-import Foundation
-
-extension JITError
-{
- enum Code: Int, ALTErrorCode
- {
- typealias Error = JITError
-
- case processNotRunning
- case dependencyNotFound
- }
-
- static func processNotRunning(_ process: AppProcess, file: StaticString = #file, line: Int = #line) -> JITError {
- JITError(code: .processNotRunning, process: process, sourceFile: file, sourceLine: UInt(line))
- }
-
- static func dependencyNotFound(_ dependency: String?, file: StaticString = #file, line: Int = #line) -> JITError {
- let errorFailure = NSLocalizedString("AltServer requires additional dependencies to enable JIT on iOS 17.", comment: "")
- return JITError(code: .dependencyNotFound, errorFailure: errorFailure, dependency: dependency, faq: "https://faq.altstore.io/how-to-use-altstore/altjit", sourceFile: file, sourceLine: UInt(line))
- }
-}
-
-struct JITError: ALTLocalizedError
-{
- let code: Code
-
- var errorTitle: String?
- var errorFailure: String?
-
- @UserInfoValue var process: AppProcess?
-
- @UserInfoValue var dependency: String?
- @UserInfoValue var faq: String? // Show user FAQ URL in AltStore error log.
-
- var sourceFile: StaticString?
- var sourceLine: UInt?
-
- var errorFailureReason: String {
- switch self.code
- {
- case .processNotRunning:
- let targetName = self.process?.description ?? NSLocalizedString("The target app", comment: "")
- return String(format: NSLocalizedString("%@ is not running.", comment: ""), targetName)
-
- case .dependencyNotFound:
- let dependencyName = self.dependency.map { "'\($0)'" } ?? NSLocalizedString("A required dependency", comment: "")
- return String(format: NSLocalizedString("%@ is not installed.", comment: ""), dependencyName)
- }
- }
-
- var recoverySuggestion: String? {
- switch self.code
- {
- case .processNotRunning: return NSLocalizedString("Make sure the app is running in the foreground on your device then try again.", comment: "")
- case .dependencyNotFound: return NSLocalizedString("Please follow the instructions on the AltStore FAQ to install all required dependencies, then try again.", comment: "")
- }
- }
-}
diff --git a/Shared/Extensions/ALTServerError+Conveniences.swift b/Shared/Extensions/ALTServerError+Conveniences.swift
index 882d1b06..2078b25e 100644
--- a/Shared/Extensions/ALTServerError+Conveniences.swift
+++ b/Shared/Extensions/ALTServerError+Conveniences.swift
@@ -25,6 +25,7 @@ public extension ALTServerError
// because it'll still be accessible via error.underlyingError.underlyingError.
var userInfo = error.userInfo
userInfo[NSUnderlyingErrorKey] = error
+
self = ALTServerError(.underlyingError, userInfo: userInfo)
}
}
diff --git a/Shared/Extensions/Bundle+AltStore.swift b/Shared/Extensions/Bundle+AltStore.swift
index 91508a82..694beafe 100644
--- a/Shared/Extensions/Bundle+AltStore.swift
+++ b/Shared/Extensions/Bundle+AltStore.swift
@@ -17,6 +17,7 @@ public extension Bundle
public static let certificateID = "ALTCertificateID"
public static let appGroups = "ALTAppGroups"
public static let altBundleID = "ALTBundleIdentifier"
+
public static let orgbundleIdentifier = "com.SideStore"
public static let appbundleIdentifier = orgbundleIdentifier + ".SideStore"
public static let devicePairingString = "ALTPairingFile"
diff --git a/Shared/Extensions/NSError+AltStore.swift b/Shared/Extensions/NSError+AltStore.swift
index 81db64d4..fdb5ac77 100644
--- a/Shared/Extensions/NSError+AltStore.swift
+++ b/Shared/Extensions/NSError+AltStore.swift
@@ -34,7 +34,8 @@ public extension NSError
@objc(alt_localizedTitle)
var localizedTitle: String? {
- return self.userInfo[ALTLocalizedTitleErrorKey] as? String
+ let localizedTitle = self.userInfo[ALTLocalizedTitleErrorKey] as? String
+ return localizedTitle
}
@objc(alt_errorWithLocalizedFailure:)
@@ -48,14 +49,17 @@ public extension NSError
default:
var userInfo = self.userInfo
- userInfo[NSLocalizedFailureReasonErrorKey] = failure
+ userInfo[NSLocalizedFailureErrorKey] = failure
- return ALTWrappedError(error: self, userInfo: userInfo)
+ let error = ALTWrappedError(error: self, userInfo: userInfo)
+ return error
}
}
+
@objc(alt_errorWithLocalizedTitle:)
- func withLocalizedTitle(_ title: String) -> NSError {
- switch self
+ func withLocalizedTitle(_ title: String) -> NSError
+ {
+ switch self
{
case var error as any ALTLocalizedError:
error.errorTitle = title
@@ -64,8 +68,9 @@ public extension NSError
default:
var userInfo = self.userInfo
userInfo[ALTLocalizedTitleErrorKey] = title
- return ALTWrappedError(error: self, userInfo: userInfo)
+ let error = ALTWrappedError(error: self, userInfo: userInfo)
+ return error
}
}
@@ -77,6 +82,7 @@ public extension NSError
userInfo[NSLocalizedFailureReasonErrorKey] = self.localizedFailureReason
userInfo[NSLocalizedRecoverySuggestionErrorKey] = self.localizedRecoverySuggestion
userInfo[NSDebugDescriptionErrorKey] = self.localizedDebugDescription
+
// Remove userInfo values that don't conform to NSSecureEncoding.
userInfo = userInfo.filter { (key, value) in
guard let secureCodable = value as? NSSecureCoding else { return false }
@@ -111,13 +117,16 @@ public extension NSError
let error = NSError(domain: self.domain, code: self.code, userInfo: userInfo)
return error
}
- func formattedDetailedDescription(with font: ALTFont) -> NSAttributedString {
-#if canImport(UIKit)
+
+ func formattedDetailedDescription(with font: ALTFont) -> NSAttributedString
+ {
+ #if canImport(UIKit)
let boldFontDescriptor = font.fontDescriptor.withSymbolicTraits(.traitBold) ?? font.fontDescriptor
-#else
+ let boldFont = ALTFont(descriptor: boldFontDescriptor, size: font.pointSize)
+ #else
let boldFontDescriptor = font.fontDescriptor.withSymbolicTraits(.bold)
-#endif
let boldFont = ALTFont(descriptor: boldFontDescriptor, size: font.pointSize) ?? font
+ #endif
var preferredKeyOrder = [
NSDebugDescriptionErrorKey,
@@ -126,12 +135,13 @@ public extension NSError
NSLocalizedFailureReasonErrorKey,
NSLocalizedRecoverySuggestionErrorKey,
ALTLocalizedTitleErrorKey,
-// ALTSourceFileErrorKey,
-// ALTSourceLineErrorKey,
+ ALTSourceFileErrorKey,
+ ALTSourceLineErrorKey,
NSUnderlyingErrorKey
]
- if #available(iOS 14.5, macOS 11.3, *) {
+ if #available(iOS 14.5, macOS 11.3, *)
+ {
preferredKeyOrder.append(NSMultipleUnderlyingErrorsKey)
}
@@ -142,14 +152,16 @@ public extension NSError
userInfo[NSLocalizedFailureReasonErrorKey] = self.localizedFailureReason
userInfo[NSLocalizedRecoverySuggestionErrorKey] = self.localizedRecoverySuggestion
- let sortedUserInfo = userInfo.sorted { a, b in
+ let sortedUserInfo = userInfo.sorted { (a, b) in
let indexA = preferredKeyOrder.firstIndex(of: a.key)
let indexB = preferredKeyOrder.firstIndex(of: b.key)
- switch (indexA, indexB) {
+
+ switch (indexA, indexB)
+ {
case (let indexA?, let indexB?): return indexA < indexB
- case (_?, nil): return true // indexA exists, indexB is nil, indexA should come first
- case (nil, _?): return false // indexB exists, indexB is nil, indexB should come first
- case (nil, nil): return a.key < b.key // both nil, so sort alphabetically
+ case (_?, nil): return true // indexA exists, indexB is nil, so A should come first.
+ case (nil, _?): return false // indexA is nil, indexB exists, so B should come first.
+ case (nil, nil): return a.key < b.key // both indexes are nil, so sort alphabetically.
}
}
@@ -166,8 +178,8 @@ public extension NSError
case NSLocalizedFailureReasonErrorKey: keyName = NSLocalizedString("Failure Reason", comment: "")
case NSLocalizedRecoverySuggestionErrorKey: keyName = NSLocalizedString("Recovery Suggestion", comment: "")
case ALTLocalizedTitleErrorKey: keyName = NSLocalizedString("Title", comment: "")
-// case ALTSourceFileErrorKey: keyName = NSLocalizedString("Source File", comment: "")
-// case ALTSourceLineErrorKey: keyName = NSLocalizedString("Source Line", comment: "")
+ case ALTSourceFileErrorKey: keyName = NSLocalizedString("Source File", comment: "")
+ case ALTSourceLineErrorKey: keyName = NSLocalizedString("Source Line", comment: "")
case NSUnderlyingErrorKey: keyName = NSLocalizedString("Underlying Error", comment: "")
default:
if #available(iOS 14.5, macOS 11.3, *), key == NSMultipleUnderlyingErrorsKey
@@ -214,27 +226,32 @@ public extension NSError
typealias UserInfoProvider = (Error, String) -> Any?
@objc
- class func alt_setUserInfoValueProvider(forDomain domain: String, provider: UserInfoProvider?) {
- NSError.setUserInfoValueProvider(forDomain: domain) { error, key in
+ class func alt_setUserInfoValueProvider(forDomain domain: String, provider: UserInfoProvider?)
+ {
+ NSError.setUserInfoValueProvider(forDomain: domain) { (error, key) in
let nsError = error as NSError
- switch key{
+ switch key
+ {
case NSLocalizedDescriptionKey:
- if nsError.localizedFailure != nil {
- // Error has localizedFailure, so return nil to construct localizedDescription from it + localizedFailureReason
+ if nsError.localizedFailure != nil
+ {
+ // Error has localizedFailure, so return nil to construct localizedDescription from it + localizedFailureReason.
return nil
- } else if let localizedDescription = provider?(error, NSLocalizedDescriptionKey) as? String {
- // Only call provider() if there is no localizedFailure
+ }
+ else if let localizedDescription = provider?(error, NSLocalizedDescriptionKey) as? String
+ {
+ // Only call provider() if there is no localizedFailure.
return localizedDescription
}
- /* Otherwise return failureReason for localizedDescription to avoid system prepending "Operation Failed" message
- Do NOT return provider(NSLocalizedFailureReason) which might be unexpectedly nil if unrecognized error code. */
-
+ // Otherwise, return failureReason for localizedDescription to avoid system prepending "Operation Failed" message.
+ // Do NOT return provider(NSLocalizedFailureReason), which might be unexpectedly nil if unrecognized error code.
return nsError.localizedFailureReason
default:
- return provider?(error, key)
+ let value = provider?(error, key)
+ return value
}
}
}
@@ -243,21 +260,27 @@ public extension NSError
public extension Error
{
var underlyingError: Error? {
- return (self as NSError).userInfo[NSUnderlyingErrorKey] as? Error
+ let underlyingError = (self as NSError).userInfo[NSUnderlyingErrorKey] as? Error
+ return underlyingError
}
var localizedErrorCode: String {
- return String(format: NSLocalizedString("%@ %@", comment: ""), (self as NSError).domain, self.displayCode as NSNumber)
+ let nsError = self as NSError
+ let localizedErrorCode = String(format: NSLocalizedString("%@ %@", comment: ""), nsError.domain, self.displayCode as NSNumber)
+ return localizedErrorCode
}
var displayCode: Int {
guard let serverError = self as? ALTServerError else {
+ // Not ALTServerError, so display regular code.
return (self as NSError).code
}
- /* We want AltServerError codes to start at 2000, but we can't change them without breaking AltServer compatibility.
- Instead we just add 2000 when displaying code to the user to make it appear as if the codes start at 2000 anyway.
- */
- return 2000 + serverError.code.rawValue
+ // We want ALTServerError codes to start at 2000,
+ // but we can't change them without breaking AltServer compatibility.
+ // Instead, we just add 2000 when displaying code to user
+ // to make it appear as if codes start at 2000 normally.
+ let code = 2000 + serverError.code.rawValue
+ return code
}
}
diff --git a/Shared/Extensions/OperatingSystemVersion+Comparable.swift b/Shared/Extensions/OperatingSystemVersion+Comparable.swift
index 5f54b9f4..8c97ead8 100644
--- a/Shared/Extensions/OperatingSystemVersion+Comparable.swift
+++ b/Shared/Extensions/OperatingSystemVersion+Comparable.swift
@@ -2,17 +2,21 @@
// OperatingSystemVersion+Comparable.swift
// AltStoreCore
//
-// Created by nythepegasus on 5/9/24.
+// Created by Riley Testut on 11/15/22.
+// Copyright © 2022 Riley Testut. All rights reserved.
//
import Foundation
-extension OperatingSystemVersion: Comparable {
- public static func ==(lhs: OperatingSystemVersion, rhs: OperatingSystemVersion) -> Bool {
+extension OperatingSystemVersion: Comparable
+{
+ public static func ==(lhs: OperatingSystemVersion, rhs: OperatingSystemVersion) -> Bool
+ {
return lhs.majorVersion == rhs.majorVersion && lhs.minorVersion == rhs.minorVersion && lhs.patchVersion == rhs.patchVersion
}
- public static func <(lhs: OperatingSystemVersion, rhs: OperatingSystemVersion) -> Bool {
+ public static func <(lhs: OperatingSystemVersion, rhs: OperatingSystemVersion) -> Bool
+ {
return lhs.stringValue.compare(rhs.stringValue, options: .numeric) == .orderedAscending
}
}
diff --git a/Shared/Server Protocol/CodableError.swift b/Shared/Server Protocol/CodableError.swift
index 6d688443..4d601eba 100644
--- a/Shared/Server Protocol/CodableError.swift
+++ b/Shared/Server Protocol/CodableError.swift
@@ -30,6 +30,7 @@ extension CodableError
case codableError(CodableError)
indirect case array([UserInfoValue])
indirect case dictionary([String: UserInfoValue])
+
var value: Any? {
switch self
{
@@ -42,6 +43,7 @@ extension CodableError
case .dictionary(let dictionary): return dictionary.compactMapValues { $0.value } // .compactMapValues instead of .mapValues to ensure nil values are removed.
}
}
+
var codableValue: Codable? {
switch self
{
@@ -52,10 +54,12 @@ extension CodableError
let sanitizedError = nsError.sanitizedForSerialization()
let data = try? NSKeyedArchiver.archivedData(withRootObject: sanitizedError, requiringSecureCoding: true)
return data
+
case .array(let array): return array
case .dictionary(let dictionary): return dictionary
}
}
+
init(_ rawValue: Any?)
{
switch rawValue
@@ -69,6 +73,7 @@ extension CodableError
default: self = .unknown(rawValue)
}
}
+
init(from decoder: Decoder) throws
{
let container = try decoder.singleValueContainer()
@@ -104,11 +109,11 @@ extension CodableError
self = .unknown(nil)
}
}
-
+
func encode(to encoder: Encoder) throws
{
var container = encoder.singleValueContainer()
-
+
if let value = self.codableValue
{
try container.encode(value)
@@ -127,11 +132,11 @@ struct CodableError: Codable
return self.rawError ?? NSError(domain: self.errorDomain, code: self.errorCode, userInfo: self.userInfo ?? [:])
}
private var rawError: Error?
-
+
private var errorDomain: String
private var errorCode: Int
private var userInfo: [String: Any]?
-
+
private enum CodingKeys: String, CodingKey
{
case errorDomain
@@ -143,58 +148,63 @@ struct CodableError: Codable
init(error: Error)
{
self.rawError = error
-
+
let nsError = error as NSError
self.errorDomain = nsError.domain
self.errorCode = nsError.code
-
+
if !nsError.userInfo.isEmpty
{
self.userInfo = nsError.userInfo
}
}
-
+
init(from decoder: Decoder) throws
{
let container = try decoder.container(keyedBy: CodingKeys.self)
-
+
// Assume ALTServerError.errorDomain if no explicit domain provided.
self.errorDomain = try container.decodeIfPresent(String.self, forKey: .errorDomain) ?? ALTServerError.errorDomain
self.errorCode = try container.decode(Int.self, forKey: .errorCode)
-
+
if let rawUserInfo = try container.decodeIfPresent([String: UserInfoValue].self, forKey: .errorUserInfo)
{
// Attempt decoding from .errorUserInfo first, because it will gracefully handle unknown user info values.
-
+
// Copy ALTLocalized... values to NSLocalized... if provider is nil or if error is unrecognized.
// This ensures we preserve error messages if receiving an unknown error.
var userInfo = rawUserInfo.compactMapValues { $0.value }
-
+
// Recognized == the provider returns value for NSLocalizedFailureReasonErrorKey, or error is ALTServerError.underlyingError.
let provider = NSError.userInfoValueProvider(forDomain: self.errorDomain)
let isRecognizedError = (
provider?(self.error, NSLocalizedFailureReasonErrorKey) != nil ||
(self.error._domain == ALTServerError.errorDomain && self.error._code == ALTServerError.underlyingError.rawValue)
)
+
if !isRecognizedError
{
// Error not recognized, so copy over NSLocalizedDescriptionKey and NSLocalizedFailureReasonErrorKey.
userInfo[NSLocalizedDescriptionKey] = userInfo[ErrorUserInfoKey.altLocalizedDescription]
userInfo[NSLocalizedFailureReasonErrorKey] = userInfo[ErrorUserInfoKey.altLocalizedFailureReason]
}
+
// Copy over NSLocalizedRecoverySuggestionErrorKey and NSDebugDescriptionErrorKey if provider returns nil.
if provider?(self.error, NSLocalizedRecoverySuggestionErrorKey) == nil
{
userInfo[NSLocalizedRecoverySuggestionErrorKey] = userInfo[ErrorUserInfoKey.altLocalizedRecoverySuggestion]
}
+
if provider?(self.error, NSDebugDescriptionErrorKey) == nil
{
userInfo[NSDebugDescriptionErrorKey] = userInfo[ErrorUserInfoKey.altDebugDescription]
}
+
userInfo[ErrorUserInfoKey.altLocalizedDescription] = nil
userInfo[ErrorUserInfoKey.altLocalizedFailureReason] = nil
userInfo[ErrorUserInfoKey.altLocalizedRecoverySuggestion] = nil
userInfo[ErrorUserInfoKey.altDebugDescription] = nil
+
self.userInfo = userInfo
}
else if let rawUserInfo = try container.decodeIfPresent([String: UserInfoValue].self, forKey: .legacyUserInfo)
@@ -204,11 +214,13 @@ struct CodableError: Codable
self.userInfo = userInfo
}
}
+
func encode(to encoder: Encoder) throws
{
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(self.errorDomain, forKey: .errorDomain)
try container.encode(self.errorCode, forKey: .errorCode)
+
let rawLegacyUserInfo = self.userInfo?.compactMapValues { (value) -> UserInfoValue? in
// .legacyUserInfo only supports String and NSError values.
switch value
@@ -219,19 +231,19 @@ struct CodableError: Codable
}
}
try container.encodeIfPresent(rawLegacyUserInfo, forKey: .legacyUserInfo)
-
+
let nsError = self.error as NSError
-
+
var userInfo = self.userInfo ?? [:]
userInfo[ErrorUserInfoKey.altLocalizedDescription] = nsError.localizedDescription
userInfo[ErrorUserInfoKey.altLocalizedFailureReason] = nsError.localizedFailureReason
userInfo[ErrorUserInfoKey.altLocalizedRecoverySuggestion] = nsError.localizedRecoverySuggestion
userInfo[ErrorUserInfoKey.altDebugDescription] = nsError.localizedDebugDescription
-
+
// No need to use alternate key. This is a no-op if userInfo already contains localizedFailure,
// but it caches the UserInfoProvider value if one exists.
userInfo[NSLocalizedFailureErrorKey] = nsError.localizedFailure
-
+
let rawUserInfo = userInfo.compactMapValues { UserInfoValue($0) }
try container.encodeIfPresent(rawUserInfo, forKey: .errorUserInfo)
}
diff --git a/Shared/Server Protocol/ServerProtocol.swift b/Shared/Server Protocol/ServerProtocol.swift
index 2a82b2ed..5295aa69 100644
--- a/Shared/Server Protocol/ServerProtocol.swift
+++ b/Shared/Server Protocol/ServerProtocol.swift
@@ -201,6 +201,7 @@ public struct ErrorResponse: ServerMessageProtocol
public var identifier = "ErrorResponse"
public var error: ALTServerError {
+ // Must be ALTServerError
return self.serverError.map { ALTServerError($0.error) } ?? ALTServerError(self.errorCode)
}
private var serverError: CodableError?
diff --git a/Shared/XPC/AltXPCProtocol.h b/Shared/XPC/AltXPCProtocol.h
deleted file mode 100644
index 629e1f42..00000000
--- a/Shared/XPC/AltXPCProtocol.h
+++ /dev/null
@@ -1,18 +0,0 @@
-//
-// AltXPCProtocol.h
-// AltXPC
-//
-// Created by Riley Testut on 12/2/20.
-// Copyright © 2020 Riley Testut. All rights reserved.
-//
-
-#import
-
-@class ALTAnisetteData;
-
-@protocol AltXPCProtocol
-
-- (void)ping:(void (^_Nonnull)(void))completionHandler;
-- (void)requestAnisetteDataWithCompletionHandler:(void (^_Nonnull)(ALTAnisetteData *_Nullable anisetteData, NSError *_Nullable error))completionHandler;
-
-@end