mirror of
https://github.com/SideStore/SideStore.git
synced 2026-03-29 14:55:39 +02:00
Compare commits
57 Commits
nightly
...
1c8541fdd4
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1c8541fdd4 | ||
|
|
4e6882423d | ||
|
|
7c3add0e70 | ||
|
|
c4139473fa | ||
|
|
0837f82a69 | ||
|
|
c04ebd3ec6 | ||
|
|
0e81515af9 | ||
|
|
dd4c0be75d | ||
|
|
7500dd5b17 | ||
|
|
dba84ed015 | ||
|
|
dbb1e0ff3e | ||
|
|
431900368a | ||
|
|
8843a95bfc | ||
|
|
4810f3a624 | ||
|
|
954a96b988 | ||
|
|
afd32a285d | ||
|
|
f8a0ee2c84 | ||
|
|
9d01a1c116 | ||
|
|
f6db823816 | ||
|
|
dfb018bb89 | ||
|
|
adb91439e4 | ||
|
|
368a2afad4 | ||
|
|
830b66c364 | ||
|
|
40a2137069 | ||
|
|
fa752e3ae6 | ||
|
|
71b319c8e6 | ||
|
|
fd12d36980 | ||
|
|
cdc41c7954 | ||
|
|
1fe3e5a6ca | ||
|
|
bf65bce7b5 | ||
|
|
7f3647a230 | ||
|
|
850180273c | ||
|
|
6a20d50fb6 | ||
|
|
79dc65f1c8 | ||
|
|
a9a2d8780b | ||
|
|
2286e78a55 | ||
|
|
3aa3b5df65 | ||
|
|
6cdfc211ea | ||
|
|
58ff20c690 | ||
|
|
0b865729a7 | ||
|
|
7c4cf2ae62 | ||
|
|
b0c65b04f2 | ||
|
|
f3f8036693 | ||
|
|
ee7c97fd3e | ||
|
|
f5eb669a74 | ||
|
|
3af3aa071c | ||
|
|
857c1e03e0 | ||
|
|
c09c290973 | ||
|
|
7b8884a8ac | ||
|
|
fd797fdf88 | ||
|
|
b18ce43a64 | ||
|
|
e90b8a0e32 | ||
|
|
bb578316f1 | ||
|
|
9579d46bed | ||
|
|
a916293585 | ||
|
|
f634b52e44 | ||
|
|
a6baf59649 |
File diff suppressed because it is too large
Load Diff
@@ -1,67 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<Scheme
|
|
||||||
LastUpgradeVersion = "2610"
|
|
||||||
version = "1.7">
|
|
||||||
<BuildAction
|
|
||||||
parallelizeBuildables = "YES"
|
|
||||||
buildImplicitDependencies = "YES"
|
|
||||||
buildArchitectures = "Automatic">
|
|
||||||
<BuildActionEntries>
|
|
||||||
<BuildActionEntry
|
|
||||||
buildForTesting = "YES"
|
|
||||||
buildForRunning = "YES"
|
|
||||||
buildForProfiling = "YES"
|
|
||||||
buildForArchiving = "YES"
|
|
||||||
buildForAnalyzing = "YES">
|
|
||||||
<BuildableReference
|
|
||||||
BuildableIdentifier = "primary"
|
|
||||||
BlueprintIdentifier = "CA60C44C93D7A30E3695DD59"
|
|
||||||
BuildableName = "libem_proxy_static.a"
|
|
||||||
BlueprintName = "em_proxy-staticlib"
|
|
||||||
ReferencedContainer = "container:Dependencies/em_proxy.xcodeproj">
|
|
||||||
</BuildableReference>
|
|
||||||
</BuildActionEntry>
|
|
||||||
</BuildActionEntries>
|
|
||||||
</BuildAction>
|
|
||||||
<TestAction
|
|
||||||
buildConfiguration = "Debug"
|
|
||||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
|
||||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
|
||||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
|
||||||
shouldAutocreateTestPlan = "YES">
|
|
||||||
</TestAction>
|
|
||||||
<LaunchAction
|
|
||||||
buildConfiguration = "Debug"
|
|
||||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
|
||||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
|
||||||
launchStyle = "0"
|
|
||||||
useCustomWorkingDirectory = "NO"
|
|
||||||
ignoresPersistentStateOnLaunch = "NO"
|
|
||||||
debugDocumentVersioning = "YES"
|
|
||||||
debugServiceExtension = "internal"
|
|
||||||
allowLocationSimulation = "YES">
|
|
||||||
</LaunchAction>
|
|
||||||
<ProfileAction
|
|
||||||
buildConfiguration = "Release"
|
|
||||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
|
||||||
savedToolIdentifier = ""
|
|
||||||
useCustomWorkingDirectory = "NO"
|
|
||||||
debugDocumentVersioning = "YES">
|
|
||||||
<MacroExpansion>
|
|
||||||
<BuildableReference
|
|
||||||
BuildableIdentifier = "primary"
|
|
||||||
BlueprintIdentifier = "CA60C44C93D7A30E3695DD59"
|
|
||||||
BuildableName = "libem_proxy_static.a"
|
|
||||||
BlueprintName = "em_proxy-staticlib"
|
|
||||||
ReferencedContainer = "container:Dependencies/em_proxy.xcodeproj">
|
|
||||||
</BuildableReference>
|
|
||||||
</MacroExpansion>
|
|
||||||
</ProfileAction>
|
|
||||||
<AnalyzeAction
|
|
||||||
buildConfiguration = "Debug">
|
|
||||||
</AnalyzeAction>
|
|
||||||
<ArchiveAction
|
|
||||||
buildConfiguration = "Release"
|
|
||||||
revealArchiveInOrganizer = "YES">
|
|
||||||
</ArchiveAction>
|
|
||||||
</Scheme>
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<Scheme
|
<Scheme
|
||||||
LastUpgradeVersion = "2620"
|
LastUpgradeVersion = "2630"
|
||||||
version = "1.7">
|
version = "1.7">
|
||||||
<BuildAction
|
<BuildAction
|
||||||
parallelizeBuildables = "YES"
|
parallelizeBuildables = "YES"
|
||||||
@@ -15,10 +15,10 @@
|
|||||||
buildForAnalyzing = "YES">
|
buildForAnalyzing = "YES">
|
||||||
<BuildableReference
|
<BuildableReference
|
||||||
BuildableIdentifier = "primary"
|
BuildableIdentifier = "primary"
|
||||||
BlueprintIdentifier = "CA60C44C93D7A30E3695DD59"
|
BlueprintIdentifier = "A85A51412F4B4532002E2E11"
|
||||||
BuildableName = "libem_proxy_static.a"
|
BuildableName = "libem_proxy_swift.a"
|
||||||
BlueprintName = "em_proxy-staticlib"
|
BlueprintName = "em_proxy-swift"
|
||||||
ReferencedContainer = "container:em_proxy.xcodeproj">
|
ReferencedContainer = "container:AltStore.xcodeproj">
|
||||||
</BuildableReference>
|
</BuildableReference>
|
||||||
</BuildActionEntry>
|
</BuildActionEntry>
|
||||||
</BuildActionEntries>
|
</BuildActionEntries>
|
||||||
@@ -50,10 +50,10 @@
|
|||||||
<MacroExpansion>
|
<MacroExpansion>
|
||||||
<BuildableReference
|
<BuildableReference
|
||||||
BuildableIdentifier = "primary"
|
BuildableIdentifier = "primary"
|
||||||
BlueprintIdentifier = "CA60C44C93D7A30E3695DD59"
|
BlueprintIdentifier = "A85A51412F4B4532002E2E11"
|
||||||
BuildableName = "libem_proxy_static.a"
|
BuildableName = "libem_proxy_swift.a"
|
||||||
BlueprintName = "em_proxy-staticlib"
|
BlueprintName = "em_proxy-swift"
|
||||||
ReferencedContainer = "container:em_proxy.xcodeproj">
|
ReferencedContainer = "container:AltStore.xcodeproj">
|
||||||
</BuildableReference>
|
</BuildableReference>
|
||||||
</MacroExpansion>
|
</MacroExpansion>
|
||||||
</ProfileAction>
|
</ProfileAction>
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<Scheme
|
|
||||||
LastUpgradeVersion = "2610"
|
|
||||||
version = "1.7">
|
|
||||||
<BuildAction
|
|
||||||
parallelizeBuildables = "YES"
|
|
||||||
buildImplicitDependencies = "YES"
|
|
||||||
buildArchitectures = "Automatic">
|
|
||||||
<BuildActionEntries>
|
|
||||||
<BuildActionEntry
|
|
||||||
buildForTesting = "YES"
|
|
||||||
buildForRunning = "YES"
|
|
||||||
buildForProfiling = "YES"
|
|
||||||
buildForArchiving = "YES"
|
|
||||||
buildForAnalyzing = "YES">
|
|
||||||
<BuildableReference
|
|
||||||
BuildableIdentifier = "primary"
|
|
||||||
BlueprintIdentifier = "CA609C732349A560B9642892"
|
|
||||||
BuildableName = "libminimuxer_static.a"
|
|
||||||
BlueprintName = "minimuxer-staticlib"
|
|
||||||
ReferencedContainer = "container:Dependencies/minimuxer.xcodeproj">
|
|
||||||
</BuildableReference>
|
|
||||||
</BuildActionEntry>
|
|
||||||
</BuildActionEntries>
|
|
||||||
</BuildAction>
|
|
||||||
<TestAction
|
|
||||||
buildConfiguration = "Debug"
|
|
||||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
|
||||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
|
||||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
|
||||||
shouldAutocreateTestPlan = "YES">
|
|
||||||
</TestAction>
|
|
||||||
<LaunchAction
|
|
||||||
buildConfiguration = "Debug"
|
|
||||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
|
||||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
|
||||||
launchStyle = "0"
|
|
||||||
useCustomWorkingDirectory = "NO"
|
|
||||||
ignoresPersistentStateOnLaunch = "NO"
|
|
||||||
debugDocumentVersioning = "YES"
|
|
||||||
debugServiceExtension = "internal"
|
|
||||||
allowLocationSimulation = "YES">
|
|
||||||
</LaunchAction>
|
|
||||||
<ProfileAction
|
|
||||||
buildConfiguration = "Release"
|
|
||||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
|
||||||
savedToolIdentifier = ""
|
|
||||||
useCustomWorkingDirectory = "NO"
|
|
||||||
debugDocumentVersioning = "YES">
|
|
||||||
<MacroExpansion>
|
|
||||||
<BuildableReference
|
|
||||||
BuildableIdentifier = "primary"
|
|
||||||
BlueprintIdentifier = "CA609C732349A560B9642892"
|
|
||||||
BuildableName = "libminimuxer_static.a"
|
|
||||||
BlueprintName = "minimuxer-staticlib"
|
|
||||||
ReferencedContainer = "container:Dependencies/minimuxer.xcodeproj">
|
|
||||||
</BuildableReference>
|
|
||||||
</MacroExpansion>
|
|
||||||
</ProfileAction>
|
|
||||||
<AnalyzeAction
|
|
||||||
buildConfiguration = "Debug">
|
|
||||||
</AnalyzeAction>
|
|
||||||
<ArchiveAction
|
|
||||||
buildConfiguration = "Release"
|
|
||||||
revealArchiveInOrganizer = "YES">
|
|
||||||
</ArchiveAction>
|
|
||||||
</Scheme>
|
|
||||||
3
AltStore.xcworkspace/contents.xcworkspacedata
generated
3
AltStore.xcworkspace/contents.xcworkspacedata
generated
@@ -7,6 +7,9 @@
|
|||||||
<FileRef
|
<FileRef
|
||||||
location = "group:Dependencies/AltSign">
|
location = "group:Dependencies/AltSign">
|
||||||
</FileRef>
|
</FileRef>
|
||||||
|
<FileRef
|
||||||
|
location = "group:Dependencies/minimuxer">
|
||||||
|
</FileRef>
|
||||||
<FileRef
|
<FileRef
|
||||||
location = "group:Dependencies/Roxas/Roxas.xcodeproj">
|
location = "group:Dependencies/Roxas/Roxas.xcodeproj">
|
||||||
</FileRef>
|
</FileRef>
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import AltStoreCore
|
|||||||
import Roxas
|
import Roxas
|
||||||
|
|
||||||
import Nuke
|
import Nuke
|
||||||
|
import Minimuxer
|
||||||
|
|
||||||
class BrowseViewController: UICollectionViewController, PeekPopPreviewing
|
class BrowseViewController: UICollectionViewController, PeekPopPreviewing
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -87,7 +87,7 @@ final class LaunchViewController: UIViewController, UIDocumentPickerDelegate {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func start_minimuxer_threads(_ pairing_file: String) {
|
func start_minimuxer_threads(_ pairing_file: String) {
|
||||||
targetMinimuxerAddress()
|
retargetUsbmuxdAddr()
|
||||||
let documentsDirectory = FileManager.default.documentsDirectory.absoluteString
|
let documentsDirectory = FileManager.default.documentsDirectory.absoluteString
|
||||||
do {
|
do {
|
||||||
let loggingEnabled = UserDefaults.standard.isMinimuxerConsoleLoggingEnabled
|
let loggingEnabled = UserDefaults.standard.isMinimuxerConsoleLoggingEnabled
|
||||||
@@ -96,7 +96,7 @@ final class LaunchViewController: UIViewController, UIDocumentPickerDelegate {
|
|||||||
try! FileManager.default.removeItem(at: FileManager.default.documentsDirectory.appendingPathComponent(pairingFileName))
|
try! FileManager.default.removeItem(at: FileManager.default.documentsDirectory.appendingPathComponent(pairingFileName))
|
||||||
displayError("minimuxer failed to start, please restart SideStore. \((error as? LocalizedError)?.failureReason ?? "UNKNOWN ERROR")")
|
displayError("minimuxer failed to start, please restart SideStore. \((error as? LocalizedError)?.failureReason ?? "UNKNOWN ERROR")")
|
||||||
}
|
}
|
||||||
start_auto_mounter(documentsDirectory)
|
startAutoMounter(documentsDirectory)
|
||||||
}
|
}
|
||||||
|
|
||||||
func fetchPairingFile() -> String? { PairingFileManager.shared.fetchPairingFile(presentingVC: self) }
|
func fetchPairingFile() -> String? { PairingFileManager.shared.fetchPairingFile(presentingVC: self) }
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ import WidgetKit
|
|||||||
import AltStoreCore
|
import AltStoreCore
|
||||||
import AltSign
|
import AltSign
|
||||||
import Roxas
|
import Roxas
|
||||||
|
import Minimuxer
|
||||||
|
|
||||||
extension AppManager
|
extension AppManager
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -701,7 +701,7 @@ private extension AuthenticationOperation
|
|||||||
|
|
||||||
func registerCurrentDevice(for team: ALTTeam, session: ALTAppleAPISession, completionHandler: @escaping (Result<ALTDevice, Error>) -> Void)
|
func registerCurrentDevice(for team: ALTTeam, session: ALTAppleAPISession, completionHandler: @escaping (Result<ALTDevice, Error>) -> Void)
|
||||||
{
|
{
|
||||||
guard let udid = fetch_udid()?.toString() else {
|
guard let udid = fetchUDID() else {
|
||||||
return completionHandler(.failure(OperationError.unknownUDID))
|
return completionHandler(.failure(OperationError.unknownUDID))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -101,7 +101,7 @@ final class BackgroundRefreshAppsOperation: ResultOperation<[String: Result<Inst
|
|||||||
if UserDefaults.standard.enableEMPforWireguard {
|
if UserDefaults.standard.enableEMPforWireguard {
|
||||||
startEMProxy(bind_addr: AppConstants.Proxy.serverURL)
|
startEMProxy(bind_addr: AppConstants.Proxy.serverURL)
|
||||||
}
|
}
|
||||||
targetMinimuxerAddress()
|
retargetUsbmuxdAddr()
|
||||||
let documentsDirectory = FileManager.default.documentsDirectory.absoluteString
|
let documentsDirectory = FileManager.default.documentsDirectory.absoluteString
|
||||||
do {
|
do {
|
||||||
// enable minimuxer console logging only if enabled in settings
|
// enable minimuxer console logging only if enabled in settings
|
||||||
@@ -118,7 +118,7 @@ final class BackgroundRefreshAppsOperation: ResultOperation<[String: Result<Inst
|
|||||||
if #available(iOS 17, *) {
|
if #available(iOS 17, *) {
|
||||||
// TODO: iOS 17 and above have a new JIT implementation that is completely broken in SideStore :(
|
// TODO: iOS 17 and above have a new JIT implementation that is completely broken in SideStore :(
|
||||||
} else {
|
} else {
|
||||||
start_auto_mounter(documentsDirectory)
|
startAutoMounter(documentsDirectory)
|
||||||
}
|
}
|
||||||
|
|
||||||
self.managedObjectContext.perform {
|
self.managedObjectContext.perform {
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ final class DeactivateAppOperation: ResultOperation<InstalledApp>
|
|||||||
|
|
||||||
for profile in allIdentifiers {
|
for profile in allIdentifiers {
|
||||||
do {
|
do {
|
||||||
try remove_provisioning_profile(profile)
|
try removeProvisioningProfile(profile)
|
||||||
self.progress.completedUnitCount += 1
|
self.progress.completedUnitCount += 1
|
||||||
installedApp.isActive = false
|
installedApp.isActive = false
|
||||||
self.finish(.success(installedApp))
|
self.finish(.success(installedApp))
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ final class EnableJITOperation<Context: EnableJITContext>: ResultOperation<Void>
|
|||||||
var retries = 3
|
var retries = 3
|
||||||
while (retries > 0){
|
while (retries > 0){
|
||||||
do {
|
do {
|
||||||
try debug_app(installedApp.resignedBundleIdentifier)
|
try debugApp(installedApp.resignedBundleIdentifier)
|
||||||
self.finish(.success(()))
|
self.finish(.success(()))
|
||||||
retries = 0
|
retries = 0
|
||||||
} catch {
|
} catch {
|
||||||
@@ -105,7 +105,7 @@ final class EnableJITOperation<Context: EnableJITContext>: ResultOperation<Void>
|
|||||||
|
|
||||||
@available(iOS 17, *)
|
@available(iOS 17, *)
|
||||||
func enableJITSideJITServer(serverURL: URL, installedApp: InstalledApp, completion: @escaping (Result<Void, SideJITServerErrorType>) -> Void) {
|
func enableJITSideJITServer(serverURL: URL, installedApp: InstalledApp, completion: @escaping (Result<Void, SideJITServerErrorType>) -> Void) {
|
||||||
guard let udid = fetch_udid()?.toString() else {
|
guard let udid = fetchUDID() else {
|
||||||
completion(.failure(.other("Unable to get UDID")))
|
completion(.failure(.other("Unable to get UDID")))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -214,10 +214,13 @@ final class InstallAppOperation: ResultOperation<InstalledApp>
|
|||||||
alert.addAction(UIAlertAction(title: NSLocalizedString("Continue", comment: ""), style: .default, handler: { _ in
|
alert.addAction(UIAlertAction(title: NSLocalizedString("Continue", comment: ""), style: .default, handler: { _ in
|
||||||
print("Going home")
|
print("Going home")
|
||||||
// Cell Shortcut
|
// Cell Shortcut
|
||||||
UIApplication.shared.open(shortcutURLonDelay, options: [:]) { _ in
|
|
||||||
print("Cell OFF Shortcut finished execution.")}
|
|
||||||
|
|
||||||
UIApplication.shared.perform(#selector(NSXPCConnection.suspend))
|
DispatchQueue.main.async{
|
||||||
|
// UIApplication.shared.open(shortcutURLonDelay, options: [:]) { _ in
|
||||||
|
// print("Cell OFF Shortcut finished execution.")
|
||||||
|
// }
|
||||||
|
UIApplication.shared.perform(#selector(NSXPCConnection.suspend))
|
||||||
|
}
|
||||||
}))
|
}))
|
||||||
|
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
@@ -233,9 +236,14 @@ final class InstallAppOperation: ResultOperation<InstalledApp>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Cell Shortcut
|
|
||||||
UIApplication.shared.open(shortcutURLonDelay, options: [:]) { _ in print("Cell OFF Shortcut finished execution.")}
|
DispatchQueue.main.async {
|
||||||
UIApplication.shared.perform(#selector(NSXPCConnection.suspend))
|
// Cell Shortcut
|
||||||
|
// UIApplication.shared.open(shortcutURLonDelay, options: [:]) { _ in
|
||||||
|
// print("Cell OFF Shortcut finished execution.")
|
||||||
|
// }
|
||||||
|
UIApplication.shared.perform(#selector(NSXPCConnection.suspend))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,8 @@ import AltStoreCore
|
|||||||
import AltSign
|
import AltSign
|
||||||
import Roxas
|
import Roxas
|
||||||
|
|
||||||
|
import Minimuxer
|
||||||
|
|
||||||
@objc(RefreshAppOperation)
|
@objc(RefreshAppOperation)
|
||||||
final class RefreshAppOperation: ResultOperation<InstalledApp>
|
final class RefreshAppOperation: ResultOperation<InstalledApp>
|
||||||
{
|
{
|
||||||
@@ -46,7 +48,6 @@ final class RefreshAppOperation: ResultOperation<InstalledApp>
|
|||||||
|
|
||||||
for p in profiles {
|
for p in profiles {
|
||||||
do {
|
do {
|
||||||
let bytes =
|
|
||||||
try installProvisioningProfiles(p.value.data)
|
try installProvisioningProfiles(p.value.data)
|
||||||
} catch {
|
} catch {
|
||||||
self.finish(.failure(MinimuxerError.ProfileInstall))
|
self.finish(.failure(MinimuxerError.ProfileInstall))
|
||||||
|
|||||||
@@ -201,7 +201,7 @@ private extension ResignAppOperation
|
|||||||
|
|
||||||
if app.isAltStoreApp
|
if app.isAltStoreApp
|
||||||
{
|
{
|
||||||
guard let udid = fetch_udid()?.toString() as? String else { throw OperationError.unknownUDID }
|
guard let udid = fetchUDID() else { throw OperationError.unknownUDID }
|
||||||
guard Bundle.main.object(forInfoDictionaryKey: Bundle.Info.devicePairingString) is String else { throw OperationError.unknownUDID }
|
guard Bundle.main.object(forInfoDictionaryKey: Bundle.Info.devicePairingString) is String else { throw OperationError.unknownUDID }
|
||||||
additionalValues[Bundle.Info.devicePairingString] = "<insert pairing file here>"
|
additionalValues[Bundle.Info.devicePairingString] = "<insert pairing file here>"
|
||||||
additionalValues[Bundle.Info.deviceID] = udid
|
additionalValues[Bundle.Info.deviceID] = udid
|
||||||
|
|||||||
@@ -8,6 +8,8 @@
|
|||||||
import Foundation
|
import Foundation
|
||||||
import Network
|
import Network
|
||||||
import AltStoreCore
|
import AltStoreCore
|
||||||
|
import Minimuxer
|
||||||
|
|
||||||
|
|
||||||
@objc(SendAppOperation)
|
@objc(SendAppOperation)
|
||||||
final class SendAppOperation: ResultOperation<()>
|
final class SendAppOperation: ResultOperation<()>
|
||||||
@@ -43,12 +45,14 @@ final class SendAppOperation: ResultOperation<()>
|
|||||||
print("AFC App `fileURL`: \(fileURL.absoluteString)")
|
print("AFC App `fileURL`: \(fileURL.absoluteString)")
|
||||||
|
|
||||||
// Wait for Shortcut to Finish Before Proceeding
|
// Wait for Shortcut to Finish Before Proceeding
|
||||||
UIApplication.shared.open(shortcutURLoff, options: [:]) { _ in
|
DispatchQueue.main.async {
|
||||||
print("Shortcut finished execution. Proceeding with file transfer.")
|
// UIApplication.shared.open(shortcutURLoff, options: [:]) { _ in
|
||||||
|
// print("Shortcut finished execution. Proceeding with file transfer.")
|
||||||
|
|
||||||
DispatchQueue.global().async {
|
DispatchQueue.global().async {
|
||||||
self.processFile(at: fileURL, for: app.bundleIdentifier)
|
self.processFile(at: fileURL, for: app.bundleIdentifier)
|
||||||
}
|
}
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<color key="separatorColor" white="1" alpha="0.25" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="separatorColor" white="1" alpha="0.25" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<stackView key="tableFooterView" opaque="NO" contentMode="scaleToFill" axis="vertical" distribution="equalCentering" alignment="center" spacing="15" id="48g-cT-stR">
|
<stackView key="tableFooterView" opaque="NO" contentMode="scaleToFill" axis="vertical" distribution="equalCentering" alignment="center" spacing="15" id="48g-cT-stR">
|
||||||
<rect key="frame" x="0.0" y="2442.6666641235352" width="402" height="125"/>
|
<rect key="frame" x="0.0" y="2469.3333282470703" width="402" height="125"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="900" text="Follow SideStore for updates" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="XFa-MY-7cV">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="900" text="Follow SideStore for updates" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="XFa-MY-7cV">
|
||||||
@@ -494,7 +494,7 @@
|
|||||||
<tableViewSection id="1fc-f1-ALD">
|
<tableViewSection id="1fc-f1-ALD">
|
||||||
<cells>
|
<cells>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="7Ek-Ls-QVO" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="7Ek-Ls-QVO" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="793.66666412353516" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="794.66666412353516" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="7Ek-Ls-QVO" id="KjD-M3-oNg">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="7Ek-Ls-QVO" id="KjD-M3-oNg">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
@@ -531,13 +531,13 @@
|
|||||||
</connections>
|
</connections>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="hFh-X1-ZAi" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="hFh-X1-ZAi" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="844.66666412353516" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="845.66666412353516" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="hFh-X1-ZAi" id="nCs-Ro-A6t">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="hFh-X1-ZAi" id="nCs-Ro-A6t">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Clear Cache…" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="j4e-Mz-DlL">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Clear Cache…" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="j4e-Mz-DlL">
|
||||||
<rect key="frame" x="29.999999999999993" y="15.333333333333334" width="114.33333333333331" height="20.333333333333329"/>
|
<rect key="frame" x="29.999999999999993" y="15.333333333333334" width="114.33333333333331" height="20.333333333333329"/>
|
||||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
||||||
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
@@ -563,28 +563,28 @@
|
|||||||
<tableViewSection headerTitle="" id="J90-vn-u2O">
|
<tableViewSection headerTitle="" id="J90-vn-u2O">
|
||||||
<cells>
|
<cells>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="i4T-2q-jF3" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="i4T-2q-jF3" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="931.33333015441895" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="932.33333015441895" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="i4T-2q-jF3" id="VTQ-H4-aCM">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="i4T-2q-jF3" id="VTQ-H4-aCM">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Developers" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="hRA-OK-Vjw">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Developers" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="hRA-OK-Vjw">
|
||||||
<rect key="frame" x="30" y="15.333333333333334" width="86" height="20.333333333333329"/>
|
<rect key="frame" x="30" y="15.333333333333334" width="86" height="20.333333333333329"/>
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||||
<color key="textColor" white="1" alpha="0.80000000000000004" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="textColor" white="1" alpha="0.80000000000000004" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<stackView opaque="NO" contentMode="scaleToFill" ambiguous="YES" spacing="14" translatesAutoresizingMaskIntoConstraints="NO" id="lx9-35-OSk">
|
<stackView opaque="NO" contentMode="scaleToFill" spacing="14" translatesAutoresizingMaskIntoConstraints="NO" id="lx9-35-OSk">
|
||||||
<rect key="frame" x="217" y="15.333333333333336" width="155" height="20.333333333333329"/>
|
<rect key="frame" x="217" y="15.333333333333334" width="155" height="20.333333333333329"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="SideStore Team" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="JAA-iZ-VGb">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="SideStore Team" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="JAA-iZ-VGb">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="125.33333333333333" height="20.333333333333332"/>
|
<rect key="frame" x="0.0" y="0.0" width="125.33333333333333" height="20.333333333333332"/>
|
||||||
<fontDescription key="fontDescription" type="system" weight="semibold" pointSize="17"/>
|
<fontDescription key="fontDescription" type="system" weight="semibold" pointSize="17"/>
|
||||||
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Mmj-3V-fTb">
|
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="Mmj-3V-fTb">
|
||||||
<rect key="frame" x="139.33333333333331" y="-1" width="15.666666666666657" height="22.333333333333332"/>
|
<rect key="frame" x="139.33333333333331" y="-1" width="15.666666666666657" height="22.333333333333332"/>
|
||||||
<imageReference key="image" image="chevron.right" catalog="system" symbolScale="large"/>
|
<imageReference key="image" image="chevron.right" catalog="system" symbolScale="large"/>
|
||||||
</imageView>
|
</imageView>
|
||||||
@@ -608,29 +608,29 @@
|
|||||||
</userDefinedRuntimeAttributes>
|
</userDefinedRuntimeAttributes>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="oHX-oR-nwJ" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="oHX-oR-nwJ" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="982.33333015441895" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="983.33333015441895" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="oHX-oR-nwJ" id="hN4-i5-igu">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="oHX-oR-nwJ" id="hN4-i5-igu">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="UI Designer" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="oqY-wY-1Vf">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="UI Designer" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="oqY-wY-1Vf">
|
||||||
<rect key="frame" x="30" y="15.333333333333334" width="89" height="20.333333333333329"/>
|
<rect key="frame" x="30" y="15.333333333333334" width="89" height="20.333333333333329"/>
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||||
<color key="textColor" white="1" alpha="0.80000000000000004" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="textColor" white="1" alpha="0.80000000000000004" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<stackView opaque="NO" contentMode="scaleToFill" ambiguous="YES" spacing="14" translatesAutoresizingMaskIntoConstraints="NO" id="gUq-6Q-t5X">
|
<stackView opaque="NO" contentMode="scaleToFill" spacing="14" translatesAutoresizingMaskIntoConstraints="NO" id="gUq-6Q-t5X">
|
||||||
<rect key="frame" x="227.33333333333337" y="15.333333333333336" width="144.66666666666663" height="20.333333333333329"/>
|
<rect key="frame" x="227.33333333333337" y="15.333333333333334" width="144.66666666666663" height="20.333333333333329"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Fabian (thdev)" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ylE-VL-7Fq">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Fabian (thdev)" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ylE-VL-7Fq">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="115" height="20.333333333333332"/>
|
<rect key="frame" x="0.0" y="0.0" width="115" height="20.333333333333332"/>
|
||||||
<fontDescription key="fontDescription" type="system" weight="semibold" pointSize="17"/>
|
<fontDescription key="fontDescription" type="system" weight="semibold" pointSize="17"/>
|
||||||
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" translatesAutoresizingMaskIntoConstraints="NO" id="e3L-vR-Jae">
|
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="e3L-vR-Jae">
|
||||||
<rect key="frame" x="129" y="-1" width="15.666666666666657" height="22.333333333333332"/>
|
<rect key="frame" x="128.99999999999997" y="-1" width="15.666666666666657" height="22.333333333333332"/>
|
||||||
<imageReference key="image" image="chevron.right" catalog="system" symbolScale="large"/>
|
<imageReference key="image" image="chevron.right" catalog="system" symbolScale="large"/>
|
||||||
</imageView>
|
</imageView>
|
||||||
</subviews>
|
</subviews>
|
||||||
@@ -653,29 +653,29 @@
|
|||||||
</userDefinedRuntimeAttributes>
|
</userDefinedRuntimeAttributes>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="0MT-ht-Sit" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="0MT-ht-Sit" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="1033.3333301544189" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="1034.3333301544189" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="0MT-ht-Sit" id="OZp-WM-5H7">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="0MT-ht-Sit" id="OZp-WM-5H7">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Asset Designer" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="fGU-Fp-XgM">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Asset Designer" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="fGU-Fp-XgM">
|
||||||
<rect key="frame" x="29.999999999999993" y="15.333333333333334" width="115.33333333333331" height="20.333333333333329"/>
|
<rect key="frame" x="29.999999999999993" y="15.333333333333334" width="115.33333333333331" height="20.333333333333329"/>
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||||
<color key="textColor" white="1" alpha="0.80000000000000004" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="textColor" white="1" alpha="0.80000000000000004" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<stackView opaque="NO" contentMode="scaleToFill" ambiguous="YES" spacing="14" translatesAutoresizingMaskIntoConstraints="NO" id="R8B-DW-7mY">
|
<stackView opaque="NO" contentMode="scaleToFill" spacing="14" translatesAutoresizingMaskIntoConstraints="NO" id="R8B-DW-7mY">
|
||||||
<rect key="frame" x="235.33333333333337" y="15.333333333333336" width="136.66666666666663" height="20.333333333333329"/>
|
<rect key="frame" x="235.33333333333337" y="15.333333333333334" width="136.66666666666663" height="20.333333333333329"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Chris (LitRitt)" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="hId-3P-41T">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Chris (LitRitt)" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="hId-3P-41T">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="107" height="20.333333333333332"/>
|
<rect key="frame" x="0.0" y="0.0" width="107" height="20.333333333333332"/>
|
||||||
<fontDescription key="fontDescription" type="system" weight="semibold" pointSize="17"/>
|
<fontDescription key="fontDescription" type="system" weight="semibold" pointSize="17"/>
|
||||||
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" translatesAutoresizingMaskIntoConstraints="NO" id="baq-cE-fMY">
|
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="baq-cE-fMY">
|
||||||
<rect key="frame" x="120.99999999999997" y="-1" width="15.666666666666657" height="22.333333333333332"/>
|
<rect key="frame" x="120.99999999999999" y="-1" width="15.666666666666671" height="22.333333333333332"/>
|
||||||
<imageReference key="image" image="chevron.right" catalog="system" symbolScale="large"/>
|
<imageReference key="image" image="chevron.right" catalog="system" symbolScale="large"/>
|
||||||
</imageView>
|
</imageView>
|
||||||
</subviews>
|
</subviews>
|
||||||
@@ -698,19 +698,19 @@
|
|||||||
</userDefinedRuntimeAttributes>
|
</userDefinedRuntimeAttributes>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="O5R-Al-lGj" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="O5R-Al-lGj" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="1084.3333301544189" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="1085.3333301544189" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="O5R-Al-lGj" id="CrG-Mr-xQq">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="O5R-Al-lGj" id="CrG-Mr-xQq">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Licenses" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="D6b-cd-pVK">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Licenses" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="D6b-cd-pVK">
|
||||||
<rect key="frame" x="30" y="15.333333333333334" width="67.333333333333329" height="20.333333333333329"/>
|
<rect key="frame" x="30" y="15.333333333333334" width="67.333333333333329" height="20.333333333333329"/>
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||||
<color key="textColor" white="1" alpha="0.80000000000000004" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="textColor" white="1" alpha="0.80000000000000004" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" translatesAutoresizingMaskIntoConstraints="NO" id="s79-GQ-khr">
|
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="s79-GQ-khr">
|
||||||
<rect key="frame" x="356.33333333333331" y="14.333333333333334" width="15.666666666666686" height="22.333333333333329"/>
|
<rect key="frame" x="356.33333333333331" y="14.333333333333334" width="15.666666666666686" height="22.333333333333329"/>
|
||||||
<imageReference key="image" image="chevron.right" catalog="system" symbolScale="large"/>
|
<imageReference key="image" image="chevron.right" catalog="system" symbolScale="large"/>
|
||||||
</imageView>
|
</imageView>
|
||||||
@@ -739,19 +739,19 @@
|
|||||||
<tableViewSection headerTitle="" id="swj-Wc-IR6">
|
<tableViewSection headerTitle="" id="swj-Wc-IR6">
|
||||||
<cells>
|
<cells>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="xGq-wV-SCd" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="xGq-wV-SCd" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="1170.9999961853027" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="1171.9999961853027" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="xGq-wV-SCd" id="G7G-sK-oO3">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="xGq-wV-SCd" id="G7G-sK-oO3">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Enable Beta Updates" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="1B5-BJ-Rkb">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Enable Beta Updates" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="1B5-BJ-Rkb">
|
||||||
<rect key="frame" x="30" y="15.333333333333334" width="169" height="20.333333333333329"/>
|
<rect key="frame" x="30" y="15.333333333333334" width="169" height="20.333333333333329"/>
|
||||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
||||||
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" ambiguous="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Blb-Dp-9QF">
|
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Blb-Dp-9QF">
|
||||||
<rect key="frame" x="311" y="11.666666666666664" width="63" height="28"/>
|
<rect key="frame" x="311" y="11.666666666666664" width="63" height="28"/>
|
||||||
<connections>
|
<connections>
|
||||||
<action selector="toggleEnableBetaUpdates:" destination="aMk-Xp-UL8" eventType="valueChanged" id="9Ea-BQ-DAE"/>
|
<action selector="toggleEnableBetaUpdates:" destination="aMk-Xp-UL8" eventType="valueChanged" id="9Ea-BQ-DAE"/>
|
||||||
@@ -774,19 +774,19 @@
|
|||||||
</userDefinedRuntimeAttributes>
|
</userDefinedRuntimeAttributes>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="eHa-Cd-p4h" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="eHa-Cd-p4h" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="1221.9999961853027" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="1222.9999961853027" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="eHa-Cd-p4h" id="V9s-7b-vkR">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="eHa-Cd-p4h" id="V9s-7b-vkR">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Beta Updates Track" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="nSh-L8-ca0" userLabel="Beta Track Label">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Beta Updates Track" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="nSh-L8-ca0" userLabel="Beta Track Label">
|
||||||
<rect key="frame" x="30" y="15.333333333333334" width="159.66666666666666" height="20.333333333333329"/>
|
<rect key="frame" x="30" y="15.333333333333334" width="159.66666666666666" height="20.333333333333329"/>
|
||||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
||||||
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<button opaque="NO" contentMode="scaleToFill" ambiguous="YES" showsMenuAsPrimaryAction="YES" contentHorizontalAlignment="right" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" changesSelectionAsPrimaryAction="YES" translatesAutoresizingMaskIntoConstraints="NO" id="kYQ-zz-vjQ" userLabel="Beta Track Drop Down Button">
|
<button opaque="NO" contentMode="scaleToFill" showsMenuAsPrimaryAction="YES" contentHorizontalAlignment="right" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" changesSelectionAsPrimaryAction="YES" translatesAutoresizingMaskIntoConstraints="NO" id="kYQ-zz-vjQ" userLabel="Beta Track Drop Down Button">
|
||||||
<rect key="frame" x="301.66666666666669" y="8.3333333333333321" width="70.333333333333314" height="34.333333333333343"/>
|
<rect key="frame" x="301.66666666666669" y="8.3333333333333321" width="70.333333333333314" height="34.333333333333343"/>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="50" id="n1r-LA-2uh"/>
|
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="50" id="n1r-LA-2uh"/>
|
||||||
@@ -815,19 +815,19 @@
|
|||||||
<tableViewSection headerTitle="" id="OMa-EK-hRI">
|
<tableViewSection headerTitle="" id="OMa-EK-hRI">
|
||||||
<cells>
|
<cells>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="FMZ-as-Ljo" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="FMZ-as-Ljo" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="1308.6666622161865" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="1309.6666622161865" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="FMZ-as-Ljo" id="JzL-Of-A3T">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="FMZ-as-Ljo" id="JzL-Of-A3T">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Send Feedback" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="pMI-Aj-nQF">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Send Feedback" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="pMI-Aj-nQF">
|
||||||
<rect key="frame" x="29.999999999999993" y="15.333333333333334" width="125.33333333333331" height="20.333333333333329"/>
|
<rect key="frame" x="29.999999999999993" y="15.333333333333334" width="125.33333333333331" height="20.333333333333329"/>
|
||||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
||||||
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Jyy-x0-Owj">
|
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="Jyy-x0-Owj">
|
||||||
<rect key="frame" x="356.33333333333331" y="14.333333333333334" width="15.666666666666686" height="22.333333333333329"/>
|
<rect key="frame" x="356.33333333333331" y="14.333333333333334" width="15.666666666666686" height="22.333333333333329"/>
|
||||||
<imageReference key="image" image="chevron.right" catalog="system" symbolScale="large"/>
|
<imageReference key="image" image="chevron.right" catalog="system" symbolScale="large"/>
|
||||||
</imageView>
|
</imageView>
|
||||||
@@ -849,19 +849,19 @@
|
|||||||
</userDefinedRuntimeAttributes>
|
</userDefinedRuntimeAttributes>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="Qca-pU-sJh" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="Qca-pU-sJh" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="1359.6666622161865" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="1360.6666622161865" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="Qca-pU-sJh" id="QtU-8J-VQN">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="Qca-pU-sJh" id="QtU-8J-VQN">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="View Refresh Attempts" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="sni-07-q0M">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="View Refresh Attempts" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="sni-07-q0M">
|
||||||
<rect key="frame" x="30" y="15.333333333333334" width="187.66666666666666" height="20.333333333333329"/>
|
<rect key="frame" x="30" y="15.333333333333334" width="187.66666666666666" height="20.333333333333329"/>
|
||||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
||||||
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" translatesAutoresizingMaskIntoConstraints="NO" id="4d3-me-Hqc">
|
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="4d3-me-Hqc">
|
||||||
<rect key="frame" x="356.33333333333331" y="14.333333333333334" width="15.666666666666686" height="22.333333333333329"/>
|
<rect key="frame" x="356.33333333333331" y="14.333333333333334" width="15.666666666666686" height="22.333333333333329"/>
|
||||||
<imageReference key="image" image="chevron.right" catalog="system" symbolScale="large"/>
|
<imageReference key="image" image="chevron.right" catalog="system" symbolScale="large"/>
|
||||||
</imageView>
|
</imageView>
|
||||||
@@ -886,19 +886,19 @@
|
|||||||
</connections>
|
</connections>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="VrV-qI-zXF" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="VrV-qI-zXF" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="1410.6666622161865" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="1411.6666622161865" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="VrV-qI-zXF" id="w1r-uY-4pD">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="VrV-qI-zXF" id="w1r-uY-4pD">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="SideJITServer" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="46q-DB-5nc">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="SideJITServer" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="46q-DB-5nc">
|
||||||
<rect key="frame" x="29.999999999999993" y="15.333333333333334" width="115.33333333333331" height="20.333333333333329"/>
|
<rect key="frame" x="29.999999999999993" y="15.333333333333334" width="115.33333333333331" height="20.333333333333329"/>
|
||||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
||||||
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" translatesAutoresizingMaskIntoConstraints="NO" id="wvD-eZ-nQI">
|
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="wvD-eZ-nQI">
|
||||||
<rect key="frame" x="356.33333333333331" y="14.333333333333334" width="15.666666666666686" height="22.333333333333329"/>
|
<rect key="frame" x="356.33333333333331" y="14.333333333333334" width="15.666666666666686" height="22.333333333333329"/>
|
||||||
<imageReference key="image" image="chevron.right" catalog="system" symbolScale="large"/>
|
<imageReference key="image" image="chevron.right" catalog="system" symbolScale="large"/>
|
||||||
</imageView>
|
</imageView>
|
||||||
@@ -920,19 +920,19 @@
|
|||||||
</userDefinedRuntimeAttributes>
|
</userDefinedRuntimeAttributes>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="VNn-u4-cN8" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="VNn-u4-cN8" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="1461.6666622161865" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="1462.6666622161865" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="VNn-u4-cN8" id="4bh-qe-l2N">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="VNn-u4-cN8" id="4bh-qe-l2N">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Reset Pairing File" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ysS-9s-dXm">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Reset Pairing File" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ysS-9s-dXm">
|
||||||
<rect key="frame" x="30" y="15.333333333333334" width="140" height="20.333333333333329"/>
|
<rect key="frame" x="30" y="15.333333333333334" width="140" height="20.333333333333329"/>
|
||||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
||||||
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" translatesAutoresizingMaskIntoConstraints="NO" id="r09-mH-pOD">
|
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="r09-mH-pOD">
|
||||||
<rect key="frame" x="356.33333333333331" y="14.333333333333334" width="15.666666666666686" height="22.333333333333329"/>
|
<rect key="frame" x="356.33333333333331" y="14.333333333333334" width="15.666666666666686" height="22.333333333333329"/>
|
||||||
<imageReference key="image" image="chevron.right" catalog="system" symbolScale="large"/>
|
<imageReference key="image" image="chevron.right" catalog="system" symbolScale="large"/>
|
||||||
</imageView>
|
</imageView>
|
||||||
@@ -954,19 +954,19 @@
|
|||||||
</userDefinedRuntimeAttributes>
|
</userDefinedRuntimeAttributes>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="e7s-hL-kv9" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="e7s-hL-kv9" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="1512.6666622161865" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="1513.6666622161865" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="e7s-hL-kv9" id="yjL-Mu-HTk">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="e7s-hL-kv9" id="yjL-Mu-HTk">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Anisette Servers" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="eds-Dj-36y">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Anisette Servers" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="eds-Dj-36y">
|
||||||
<rect key="frame" x="30" y="15.333333333333334" width="135.66666666666666" height="20.333333333333329"/>
|
<rect key="frame" x="30" y="15.333333333333334" width="135.66666666666666" height="20.333333333333329"/>
|
||||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
||||||
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" translatesAutoresizingMaskIntoConstraints="NO" id="0dh-yd-7i9">
|
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="0dh-yd-7i9">
|
||||||
<rect key="frame" x="356.33333333333331" y="14.333333333333334" width="15.666666666666686" height="22.333333333333329"/>
|
<rect key="frame" x="356.33333333333331" y="14.333333333333334" width="15.666666666666686" height="22.333333333333329"/>
|
||||||
<imageReference key="image" image="chevron.right" catalog="system" symbolScale="large"/>
|
<imageReference key="image" image="chevron.right" catalog="system" symbolScale="large"/>
|
||||||
</imageView>
|
</imageView>
|
||||||
@@ -987,20 +987,54 @@
|
|||||||
<userDefinedRuntimeAttribute type="boolean" keyPath="isSelectable" value="YES"/>
|
<userDefinedRuntimeAttribute type="boolean" keyPath="isSelectable" value="YES"/>
|
||||||
</userDefinedRuntimeAttributes>
|
</userDefinedRuntimeAttributes>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="LEH-wv-o2q" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
|
<rect key="frame" x="0.0" y="1564.6666622161865" width="402" height="51"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="LEH-wv-o2q" id="AP9-UO-vZk">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<subviews>
|
||||||
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="VPN Configuration" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="iie-Nj-lki" userLabel="VPN Configuration">
|
||||||
|
<rect key="frame" x="30" y="15.333333333333334" width="151.66666666666666" height="20.333333333333329"/>
|
||||||
|
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
||||||
|
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
|
<nil key="highlightedColor"/>
|
||||||
|
</label>
|
||||||
|
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="639-RC-1ii">
|
||||||
|
<rect key="frame" x="356.33333333333331" y="14.333333333333334" width="15.666666666666686" height="22.333333333333329"/>
|
||||||
|
<imageReference key="image" image="chevron.right" catalog="system" symbolScale="large"/>
|
||||||
|
</imageView>
|
||||||
|
</subviews>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstItem="iie-Nj-lki" firstAttribute="centerY" secondItem="AP9-UO-vZk" secondAttribute="centerY" id="Mxs-Yx-TRW"/>
|
||||||
|
<constraint firstItem="iie-Nj-lki" firstAttribute="leading" secondItem="AP9-UO-vZk" secondAttribute="leadingMargin" id="f7R-Ql-UHL"/>
|
||||||
|
<constraint firstItem="639-RC-1ii" firstAttribute="centerY" secondItem="AP9-UO-vZk" secondAttribute="centerY" id="tew-j2-B3V"/>
|
||||||
|
<constraint firstAttribute="trailingMargin" secondItem="639-RC-1ii" secondAttribute="trailing" id="ygE-k7-OKf"/>
|
||||||
|
</constraints>
|
||||||
|
</tableViewCellContentView>
|
||||||
|
<color key="backgroundColor" white="1" alpha="0.14999999999999999" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
|
<edgeInsets key="layoutMargins" top="8" left="30" bottom="8" right="30"/>
|
||||||
|
<userDefinedRuntimeAttributes>
|
||||||
|
<userDefinedRuntimeAttribute type="number" keyPath="style">
|
||||||
|
<integer key="value" value="2"/>
|
||||||
|
</userDefinedRuntimeAttribute>
|
||||||
|
<userDefinedRuntimeAttribute type="boolean" keyPath="isSelectable" value="YES"/>
|
||||||
|
</userDefinedRuntimeAttributes>
|
||||||
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="7rt-MT-kFH" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="7rt-MT-kFH" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="1563.6666622161865" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="1615.6666622161865" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="7rt-MT-kFH" id="mZL-UA-6V0">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="7rt-MT-kFH" id="mZL-UA-6V0">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Enable EMP for wireguard" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ZH7-ZA-Epf" userLabel="Enable EMP for wireguard">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Enable EMP for wireguard" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ZH7-ZA-Epf" userLabel="Enable EMP for wireguard">
|
||||||
<rect key="frame" x="30" y="15.333333333333334" width="209" height="20.333333333333329"/>
|
<rect key="frame" x="30" y="15.333333333333334" width="209" height="20.333333333333329"/>
|
||||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
||||||
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" ambiguous="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="8qE-hE-Ujn">
|
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="8qE-hE-Ujn">
|
||||||
<rect key="frame" x="311" y="11.666666666666664" width="63" height="28"/>
|
<rect key="frame" x="311" y="11.666666666666664" width="63" height="28"/>
|
||||||
<connections>
|
<connections>
|
||||||
<action selector="toggleEnableEMPforWireguard:" destination="aMk-Xp-UL8" eventType="valueChanged" id="B0Q-Jb-fox"/>
|
<action selector="toggleEnableEMPforWireguard:" destination="aMk-Xp-UL8" eventType="valueChanged" id="B0Q-Jb-fox"/>
|
||||||
@@ -1023,19 +1057,19 @@
|
|||||||
</userDefinedRuntimeAttributes>
|
</userDefinedRuntimeAttributes>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="q6e-PG-mTq" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="q6e-PG-mTq" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="1614.6666622161865" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="1666.6666622161865" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="q6e-PG-mTq" id="PRJ-Ed-P86">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="q6e-PG-mTq" id="PRJ-Ed-P86">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Enable AppId Customization" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Fq4-2u-Lgd" userLabel="Enable AppId Customization">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Enable AppId Customization" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Fq4-2u-Lgd" userLabel="Enable AppId Customization">
|
||||||
<rect key="frame" x="30" y="15.333333333333334" width="230" height="20.333333333333329"/>
|
<rect key="frame" x="30" y="15.333333333333334" width="230" height="20.333333333333329"/>
|
||||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
||||||
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" ambiguous="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" translatesAutoresizingMaskIntoConstraints="NO" id="fXx-wl-F5H">
|
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" translatesAutoresizingMaskIntoConstraints="NO" id="fXx-wl-F5H">
|
||||||
<rect key="frame" x="311" y="11.666666666666664" width="63" height="28"/>
|
<rect key="frame" x="311" y="11.666666666666664" width="63" height="28"/>
|
||||||
<connections>
|
<connections>
|
||||||
<action selector="toggleEnableAppIdCustomization:" destination="aMk-Xp-UL8" eventType="valueChanged" id="gtP-5M-9Ms"/>
|
<action selector="toggleEnableAppIdCustomization:" destination="aMk-Xp-UL8" eventType="valueChanged" id="gtP-5M-9Ms"/>
|
||||||
@@ -1062,7 +1096,7 @@
|
|||||||
<tableViewSection id="ZhW-yK-wdJ">
|
<tableViewSection id="ZhW-yK-wdJ">
|
||||||
<cells>
|
<cells>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="qjD-UK-myl" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="qjD-UK-myl" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="1701.6666622161865" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="1752.6666622161865" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="qjD-UK-myl" id="bcu-KT-Xee">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="qjD-UK-myl" id="bcu-KT-Xee">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
@@ -1090,7 +1124,7 @@
|
|||||||
</userDefinedRuntimeAttributes>
|
</userDefinedRuntimeAttributes>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="dNh-fp-vBs" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="dNh-fp-vBs" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="1752.6666622161865" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="1803.6666622161865" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="dNh-fp-vBs" id="Meb-tV-6br">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="dNh-fp-vBs" id="Meb-tV-6br">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
@@ -1118,7 +1152,7 @@
|
|||||||
</userDefinedRuntimeAttributes>
|
</userDefinedRuntimeAttributes>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="Y6h-Bo-yec" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="Y6h-Bo-yec" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="1803.6666622161865" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="1854.6666622161865" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="Y6h-Bo-yec" id="4Jf-I6-v7z">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="Y6h-Bo-yec" id="4Jf-I6-v7z">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
@@ -1146,7 +1180,7 @@
|
|||||||
</userDefinedRuntimeAttributes>
|
</userDefinedRuntimeAttributes>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="dLk-d6-X4T" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="dLk-d6-X4T" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="1854.6666622161865" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="1905.6666622161865" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="dLk-d6-X4T" id="Okl-3m-rde">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="dLk-d6-X4T" id="Okl-3m-rde">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
@@ -1178,7 +1212,7 @@
|
|||||||
<tableViewSection headerTitle="" id="lLQ-K0-XSb">
|
<tableViewSection headerTitle="" id="lLQ-K0-XSb">
|
||||||
<cells>
|
<cells>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="daQ-mk-yqC" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="daQ-mk-yqC" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="1941.3333282470703" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="1992.3333282470703" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="daQ-mk-yqC" id="ZkW-ZR-twy">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="daQ-mk-yqC" id="ZkW-ZR-twy">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
@@ -1213,7 +1247,7 @@
|
|||||||
</userDefinedRuntimeAttributes>
|
</userDefinedRuntimeAttributes>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="hRP-jU-2hd" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="hRP-jU-2hd" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="1992.3333282470703" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="2043.3333282470703" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="hRP-jU-2hd" id="JhE-O4-pRg">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="hRP-jU-2hd" id="JhE-O4-pRg">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
@@ -1248,7 +1282,7 @@
|
|||||||
</userDefinedRuntimeAttributes>
|
</userDefinedRuntimeAttributes>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="JoN-Aj-XtZ" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="JoN-Aj-XtZ" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="2043.3333282470703" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="2094.3333282470703" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="JoN-Aj-XtZ" id="v8Q-VQ-Q1h">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="JoN-Aj-XtZ" id="v8Q-VQ-Q1h">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
@@ -1283,7 +1317,7 @@
|
|||||||
</userDefinedRuntimeAttributes>
|
</userDefinedRuntimeAttributes>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="QOO-bO-4M5" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="QOO-bO-4M5" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="2094.3333282470703" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="2145.3333282470703" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="QOO-bO-4M5" id="VTT-z5-C89">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="QOO-bO-4M5" id="VTT-z5-C89">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
@@ -1311,7 +1345,7 @@
|
|||||||
</userDefinedRuntimeAttributes>
|
</userDefinedRuntimeAttributes>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="ToB-H7-2lR" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="ToB-H7-2lR" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="2145.3333282470703" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="2196.3333282470703" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="ToB-H7-2lR" id="Acf-xV-Isn">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="ToB-H7-2lR" id="Acf-xV-Isn">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
@@ -1339,7 +1373,7 @@
|
|||||||
</userDefinedRuntimeAttributes>
|
</userDefinedRuntimeAttributes>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="xtI-eU-LFb" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="xtI-eU-LFb" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="2196.3333282470703" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="2247.3333282470703" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="xtI-eU-LFb" id="bc9-41-6mE">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="xtI-eU-LFb" id="bc9-41-6mE">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
@@ -1373,7 +1407,7 @@
|
|||||||
</userDefinedRuntimeAttributes>
|
</userDefinedRuntimeAttributes>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="pvu-IV-Poa" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="pvu-IV-Poa" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="2247.3333282470703" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="2298.3333282470703" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="pvu-IV-Poa" id="zck-an-8cK">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="pvu-IV-Poa" id="zck-an-8cK">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
@@ -1408,7 +1442,7 @@
|
|||||||
</userDefinedRuntimeAttributes>
|
</userDefinedRuntimeAttributes>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="9By-QW-Jw9" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="9By-QW-Jw9" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="2298.3333282470703" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="2349.3333282470703" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="9By-QW-Jw9" id="Dzq-gE-zyT">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="9By-QW-Jw9" id="Dzq-gE-zyT">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
@@ -1443,7 +1477,7 @@
|
|||||||
</userDefinedRuntimeAttributes>
|
</userDefinedRuntimeAttributes>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="LzP-Qb-bmC" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="LzP-Qb-bmC" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="2349.3333282470703" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="2400.3333282470703" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="LzP-Qb-bmC" id="3rE-h0-8kb">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="LzP-Qb-bmC" id="3rE-h0-8kb">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
|
|||||||
@@ -77,6 +77,7 @@ extension SettingsViewController
|
|||||||
case refreshSideJITServer
|
case refreshSideJITServer
|
||||||
case resetPairingFile
|
case resetPairingFile
|
||||||
case anisetteServers
|
case anisetteServers
|
||||||
|
case vpnConfiguration
|
||||||
case enableEMPForWiregaurd
|
case enableEMPForWiregaurd
|
||||||
case customizeAppId
|
case customizeAppId
|
||||||
}
|
}
|
||||||
@@ -1364,9 +1365,19 @@ extension SettingsViewController
|
|||||||
handleRefreshResult(result)
|
handleRefreshResult(result)
|
||||||
})
|
})
|
||||||
|
|
||||||
let anisetteServersController = UIHostingController(rootView: anisetteServersView)
|
let vc = UIHostingController(rootView: anisetteServersView)
|
||||||
|
self.prepare(for: UIStoryboardSegue(identifier: "anisetteServers", source: self, destination: vc), sender: nil)
|
||||||
|
|
||||||
self.prepare(for: UIStoryboardSegue(identifier: "anisetteServers", source: self, destination: anisetteServersController), sender: nil)
|
case .vpnConfiguration:
|
||||||
|
let vpnConfigurationView = VPNConfigurationView()
|
||||||
|
let vc = UIHostingController(rootView: vpnConfigurationView)
|
||||||
|
|
||||||
|
let appearance = UINavigationBarAppearance()
|
||||||
|
appearance.configureWithDefaultBackground() // gives solid background
|
||||||
|
vc.navigationItem.scrollEdgeAppearance = appearance
|
||||||
|
vc.navigationItem.standardAppearance = appearance
|
||||||
|
|
||||||
|
navigationController?.pushViewController(vc, animated: true)
|
||||||
case .refreshAttempts, .enableEMPForWiregaurd, .customizeAppId: break
|
case .refreshAttempts, .enableEMPForWiregaurd, .customizeAppId: break
|
||||||
}
|
}
|
||||||
case .signing:
|
case .signing:
|
||||||
|
|||||||
124
AltStore/Settings/VPNConfigurationView.swift
Normal file
124
AltStore/Settings/VPNConfigurationView.swift
Normal file
@@ -0,0 +1,124 @@
|
|||||||
|
//
|
||||||
|
// VPNConfiguration.swift
|
||||||
|
// AltStore
|
||||||
|
//
|
||||||
|
// Created by Magesh K on 02/03/26.
|
||||||
|
// Copyright © 2026 SideStore. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import SwiftUI
|
||||||
|
import Combine
|
||||||
|
|
||||||
|
private typealias SButton = SwiftUI.Button
|
||||||
|
|
||||||
|
struct VPNConfigurationView: View {
|
||||||
|
@Environment(\.presentationMode) var presentationMode
|
||||||
|
@StateObject private var config = TunnelConfig.shared
|
||||||
|
|
||||||
|
var body: some View {
|
||||||
|
List {
|
||||||
|
Section(header: Text("Discovered from network")) {
|
||||||
|
Group {
|
||||||
|
networkConfigRow(label: "Tunnel IP", text: $config.deviceIP, editable: false)
|
||||||
|
networkConfigRow(label: "Device IP", text: $config.fakeIP, editable: false)
|
||||||
|
networkConfigRow(label: "Subnet Mask", text: $config.subnetMask, editable: false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Section {
|
||||||
|
networkConfigRow(
|
||||||
|
label: "Device IP",
|
||||||
|
text: Binding<String?>(get: { config.overrideFakeIP }, set: { config.overrideFakeIP = $0 ?? "" }),
|
||||||
|
editable: true
|
||||||
|
)
|
||||||
|
networkConfigRow(
|
||||||
|
label: "Active",
|
||||||
|
text: Binding<String?>(get: { config.overrideActive }, set: { _ in }),
|
||||||
|
editable: false
|
||||||
|
)
|
||||||
|
} header: {
|
||||||
|
Text("Override Configuration")
|
||||||
|
} footer: {
|
||||||
|
HStack(alignment: .top, spacing: 0) {
|
||||||
|
Text("Note: ")
|
||||||
|
Text("if override configuration is invalid or unusable SideStore may use auto-discovered config as fallback.")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.navigationTitle("VPN Configuration")
|
||||||
|
.toolbar {
|
||||||
|
ToolbarItem(placement: .topBarTrailing) {
|
||||||
|
SButton("Confirm") {
|
||||||
|
commitChanges()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func commitChanges() {
|
||||||
|
TunnelConfig.shared.commitFakeIP()
|
||||||
|
bindTunnelConfig()
|
||||||
|
}
|
||||||
|
|
||||||
|
private func dismiss() {
|
||||||
|
presentationMode.wrappedValue.dismiss()
|
||||||
|
}
|
||||||
|
|
||||||
|
private func networkConfigRow(
|
||||||
|
label: LocalizedStringKey,
|
||||||
|
text: Binding<String?>,
|
||||||
|
editable: Bool
|
||||||
|
) -> some View {
|
||||||
|
|
||||||
|
let proxy = Binding<String>(
|
||||||
|
get: { text.wrappedValue ?? "N/A" },
|
||||||
|
set: { text.wrappedValue = $0.isEmpty || $0 == "N/A" ? nil : $0 }
|
||||||
|
)
|
||||||
|
|
||||||
|
return HStack {
|
||||||
|
Text(label)
|
||||||
|
.foregroundColor(editable ? .primary : .gray)
|
||||||
|
Spacer()
|
||||||
|
TextField(label, text: proxy)
|
||||||
|
.multilineTextAlignment(.trailing)
|
||||||
|
.foregroundColor(editable ? .secondary : .gray)
|
||||||
|
.disabled(!editable)
|
||||||
|
.keyboardType(.numbersAndPunctuation)
|
||||||
|
.onChange(of: proxy.wrappedValue) { newValue in
|
||||||
|
guard editable else { return }
|
||||||
|
proxy.wrappedValue =
|
||||||
|
newValue.filter { "0123456789.".contains($0) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
final class TunnelConfig: ObservableObject {
|
||||||
|
|
||||||
|
static let shared = TunnelConfig()
|
||||||
|
|
||||||
|
private static let defaultOverrideIP: String = {
|
||||||
|
if #available(iOS 26.4, *) { return "192.168.1.50" }
|
||||||
|
return "10.7.0.1"
|
||||||
|
}()
|
||||||
|
|
||||||
|
@Published var deviceIP: String?
|
||||||
|
@Published var subnetMask: String?
|
||||||
|
@Published var fakeIP: String?
|
||||||
|
@Published var overrideFakeIP: String = overrideIPStorage {
|
||||||
|
didSet { Self.overrideIPStorage = overrideFakeIP }
|
||||||
|
}
|
||||||
|
@Published var overrideEffective: Bool = false
|
||||||
|
|
||||||
|
private static var overrideIPStorage: String {
|
||||||
|
get { UserDefaults.standard.string(forKey: "TunnelOverrideFakeIP") ?? defaultOverrideIP }
|
||||||
|
set { UserDefaults.standard.set(newValue, forKey: "TunnelOverrideFakeIP") }
|
||||||
|
}
|
||||||
|
|
||||||
|
var overrideActive: String { overrideEffective ? "Yes" : "No" }
|
||||||
|
|
||||||
|
func commitFakeIP() {
|
||||||
|
fakeIP = overrideFakeIP
|
||||||
|
}
|
||||||
|
}
|
||||||
2
Dependencies/em_proxy
vendored
2
Dependencies/em_proxy
vendored
Submodule Dependencies/em_proxy updated: c151b90652...fcaa590843
254
Dependencies/em_proxy.xcodeproj/project.pbxproj
vendored
254
Dependencies/em_proxy.xcodeproj/project.pbxproj
vendored
@@ -1,254 +0,0 @@
|
|||||||
// !$*UTF8*$!
|
|
||||||
{
|
|
||||||
archiveVersion = 1;
|
|
||||||
classes = {
|
|
||||||
};
|
|
||||||
objectVersion = 53;
|
|
||||||
objects = {
|
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
|
||||||
A8A5B08D2F4C387300572B4A /* em_proxy.h in Sources */ = {isa = PBXBuildFile; fileRef = 9999259129A45319005CF020 /* em_proxy.h */; };
|
|
||||||
/* End PBXBuildFile section */
|
|
||||||
|
|
||||||
/* Begin PBXBuildRule section */
|
|
||||||
CA6094FFF692AC6C1400ACA8 /* PBXBuildRule */ = {
|
|
||||||
isa = PBXBuildRule;
|
|
||||||
compilerSpec = com.apple.compilers.proxy.script;
|
|
||||||
filePatterns = "*/em_proxy.h";
|
|
||||||
fileType = pattern.proxy;
|
|
||||||
inputFiles = (
|
|
||||||
);
|
|
||||||
isEditable = 0;
|
|
||||||
name = "Cargo project build";
|
|
||||||
outputFiles = (
|
|
||||||
"$(OBJECT_FILE_DIR)/$(CARGO_XCODE_TARGET_ARCH)-$(EXECUTABLE_NAME)",
|
|
||||||
"$(TARGET_BUILD_DIR)/$(FULL_PRODUCT_NAME)",
|
|
||||||
"$(SRCROOT)/Dependencies/em_proxy/em_proxy.h",
|
|
||||||
);
|
|
||||||
script = "# generated with cargo-xcode 1.5.0\n# modified to use prebuilt binaries\n\nset -eu;\n\nBUILT_SRC=\"./em_proxy/$LIB_FILE_NAME.a\"\necho Generating Static lib: $BUILT_SRC\nln -f -- \"$BUILT_SRC\" \"$TARGET_BUILD_DIR/$EXECUTABLE_PATH\" || cp \"$BUILT_SRC\" \"$TARGET_BUILD_DIR/$EXECUTABLE_PATH\"\necho \"$BUILT_SRC -> $TARGET_BUILD_DIR/$EXECUTABLE_PATH\"\n\n# xcode generates dep file, but for its own path, so append our rename to it\n#DEP_FILE_SRC=\"minimuxer/target/${CARGO_XCODE_TARGET_TRIPLE}/release/${CARGO_XCODE_CARGO_DEP_FILE_NAME}\"\n#if [ -f \"$DEP_FILE_SRC\" ]; then\n# DEP_FILE_DST=\"${DERIVED_FILE_DIR}/${CARGO_XCODE_TARGET_ARCH}-${EXECUTABLE_NAME}.d\"\n# cp -f \"$DEP_FILE_SRC\" \"$DEP_FILE_DST\"\n# echo >> \"$DEP_FILE_DST\" \"$SCRIPT_OUTPUT_FILE_0: $BUILT_SRC\"\n#fi\n\n# lipo script needs to know all the platform-specific files that have been built\n# archs is in the file name, so that paths don't stay around after archs change\n# must match input for LipoScript\n#FILE_LIST=\"${DERIVED_FILE_DIR}/${ARCHS}-${EXECUTABLE_NAME}.xcfilelist\"\n#touch \"$FILE_LIST\"\n#if ! egrep -q \"$SCRIPT_OUTPUT_FILE_0\" \"$FILE_LIST\" ; then\n# echo >> \"$FILE_LIST\" \"$SCRIPT_OUTPUT_FILE_0\"\n#fi\n";
|
|
||||||
};
|
|
||||||
/* End PBXBuildRule section */
|
|
||||||
|
|
||||||
/* Begin PBXFileReference section */
|
|
||||||
9999259129A45319005CF020 /* em_proxy.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = em_proxy.h; path = em_proxy/em_proxy.h; sourceTree = "<group>"; };
|
|
||||||
CA60C44C93D7916DE57E6EBD /* libem_proxy_static.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libem_proxy_static.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
|
||||||
/* End PBXFileReference section */
|
|
||||||
|
|
||||||
/* Begin PBXGroup section */
|
|
||||||
CA6094FFF69222869D176AE5 /* Products */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
CA60C44C93D7916DE57E6EBD /* libem_proxy_static.a */,
|
|
||||||
);
|
|
||||||
name = Products;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
CA6094FFF692D65BC3C892A8 = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
9999259129A45319005CF020 /* em_proxy.h */,
|
|
||||||
CA6094FFF69222869D176AE5 /* Products */,
|
|
||||||
);
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
/* End PBXGroup section */
|
|
||||||
|
|
||||||
/* Begin PBXNativeTarget section */
|
|
||||||
CA60C44C93D7A30E3695DD59 /* em_proxy-staticlib */ = {
|
|
||||||
isa = PBXNativeTarget;
|
|
||||||
buildConfigurationList = CA603DD75FB4A30E3695DD59 /* Build configuration list for PBXNativeTarget "em_proxy-staticlib" */;
|
|
||||||
buildPhases = (
|
|
||||||
9987603529A4610700818586 /* Fetch prebuilt binaries */,
|
|
||||||
CA60445C3036A30E3695DD59 /* Sources */,
|
|
||||||
);
|
|
||||||
buildRules = (
|
|
||||||
CA6094FFF692AC6C1400ACA8 /* PBXBuildRule */,
|
|
||||||
);
|
|
||||||
dependencies = (
|
|
||||||
);
|
|
||||||
name = "em_proxy-staticlib";
|
|
||||||
productName = libem_proxy_static.a;
|
|
||||||
productReference = CA60C44C93D7916DE57E6EBD /* libem_proxy_static.a */;
|
|
||||||
productType = "com.apple.product-type.library.static";
|
|
||||||
};
|
|
||||||
/* End PBXNativeTarget section */
|
|
||||||
|
|
||||||
/* Begin PBXProject section */
|
|
||||||
CA6094FFF692E04653AD465F /* Project object */ = {
|
|
||||||
isa = PBXProject;
|
|
||||||
attributes = {
|
|
||||||
LastUpgradeCheck = 1300;
|
|
||||||
TargetAttributes = {
|
|
||||||
CA60C44C93D7A30E3695DD59 = {
|
|
||||||
CreatedOnToolsVersion = 9.2;
|
|
||||||
ProvisioningStyle = Automatic;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
buildConfigurationList = CA6094FFF69280E02D6C7F57 /* Build configuration list for PBXProject "em_proxy" */;
|
|
||||||
compatibilityVersion = "Xcode 11.4";
|
|
||||||
developmentRegion = en;
|
|
||||||
hasScannedForEncodings = 0;
|
|
||||||
knownRegions = (
|
|
||||||
en,
|
|
||||||
Base,
|
|
||||||
);
|
|
||||||
mainGroup = CA6094FFF692D65BC3C892A8;
|
|
||||||
productRefGroup = CA6094FFF69222869D176AE5 /* Products */;
|
|
||||||
projectDirPath = "";
|
|
||||||
projectRoot = "";
|
|
||||||
targets = (
|
|
||||||
CA60C44C93D7A30E3695DD59 /* em_proxy-staticlib */,
|
|
||||||
);
|
|
||||||
};
|
|
||||||
/* End PBXProject section */
|
|
||||||
|
|
||||||
/* Begin PBXShellScriptBuildPhase section */
|
|
||||||
9987603529A4610700818586 /* Fetch prebuilt binaries */ = {
|
|
||||||
isa = PBXShellScriptBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
);
|
|
||||||
inputFileListPaths = (
|
|
||||||
);
|
|
||||||
inputPaths = (
|
|
||||||
);
|
|
||||||
name = "Fetch prebuilt binaries";
|
|
||||||
outputFileListPaths = (
|
|
||||||
);
|
|
||||||
outputPaths = (
|
|
||||||
./em_proxy/em_proxy.h,
|
|
||||||
./em_proxy/em_proxy.swift,
|
|
||||||
"./em_proxy/libem_proxy-ios.a",
|
|
||||||
"./em_proxy/libem_proxy-sim.a",
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
shellPath = /bin/sh;
|
|
||||||
shellScript = "#!bash\npwd\nchmod +x ./fetch-prebuilt.sh \n./fetch-prebuilt.sh em_proxy\n";
|
|
||||||
};
|
|
||||||
/* End PBXShellScriptBuildPhase section */
|
|
||||||
|
|
||||||
/* Begin PBXSourcesBuildPhase section */
|
|
||||||
CA60445C3036A30E3695DD59 /* Sources */ = {
|
|
||||||
isa = PBXSourcesBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
A8A5B08D2F4C387300572B4A /* em_proxy.h in Sources */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
/* End PBXSourcesBuildPhase section */
|
|
||||||
|
|
||||||
/* Begin XCBuildConfiguration section */
|
|
||||||
CA604DFE779BA30E3695DD59 /* Release */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
CARGO_XCODE_CARGO_DEP_FILE_NAME = libem_proxy.d;
|
|
||||||
CARGO_XCODE_CARGO_FILE_NAME = libem_proxy.a;
|
|
||||||
INSTALL_GROUP = "";
|
|
||||||
INSTALL_MODE_FLAG = "";
|
|
||||||
INSTALL_OWNER = "";
|
|
||||||
LIB_FILE_NAME = "";
|
|
||||||
"LIB_FILE_NAME[sdk=iphoneos*]" = "libem_proxy-ios";
|
|
||||||
"LIB_FILE_NAME[sdk=iphonesimulator*]" = "libem_proxy-sim";
|
|
||||||
MACOSX_DEPLOYMENT_TARGET = 11.5;
|
|
||||||
PRODUCT_NAME = em_proxy_static;
|
|
||||||
SKIP_INSTALL = YES;
|
|
||||||
SUPPORTED_PLATFORMS = "macosx iphonesimulator iphoneos appletvsimulator appletvos";
|
|
||||||
TVOS_DEPLOYMENT_TARGET = 11.5;
|
|
||||||
};
|
|
||||||
name = Release;
|
|
||||||
};
|
|
||||||
CA609A517351228BE02872F8 /* Debug */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
|
||||||
CARGO_TARGET_DIR = "$(PROJECT_TEMP_DIR)/cargo_target";
|
|
||||||
CARGO_XCODE_BUILD_MODE = debug;
|
|
||||||
CARGO_XCODE_FEATURES = "";
|
|
||||||
"CARGO_XCODE_TARGET_ARCH[arch=arm64*]" = aarch64;
|
|
||||||
"CARGO_XCODE_TARGET_ARCH[arch=i386]" = i686;
|
|
||||||
"CARGO_XCODE_TARGET_ARCH[arch=x86_64*]" = x86_64;
|
|
||||||
"CARGO_XCODE_TARGET_OS[sdk=appletvos*]" = tvos;
|
|
||||||
"CARGO_XCODE_TARGET_OS[sdk=appletvsimulator*]" = tvos;
|
|
||||||
"CARGO_XCODE_TARGET_OS[sdk=iphoneos*]" = ios;
|
|
||||||
"CARGO_XCODE_TARGET_OS[sdk=iphonesimulator*]" = "ios-sim";
|
|
||||||
"CARGO_XCODE_TARGET_OS[sdk=iphonesimulator*][arch=x86_64*]" = ios;
|
|
||||||
"CARGO_XCODE_TARGET_OS[sdk=macosx*]" = darwin;
|
|
||||||
CURRENT_PROJECT_VERSION = 0.1;
|
|
||||||
MARKETING_VERSION = 0.1.0;
|
|
||||||
ONLY_ACTIVE_ARCH = YES;
|
|
||||||
PRODUCT_NAME = em_proxy;
|
|
||||||
SDKROOT = macosx;
|
|
||||||
SUPPORTS_MACCATALYST = YES;
|
|
||||||
};
|
|
||||||
name = Debug;
|
|
||||||
};
|
|
||||||
CA609A5173513CC16B37690B /* Release */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
|
||||||
CARGO_TARGET_DIR = "$(PROJECT_TEMP_DIR)/cargo_target";
|
|
||||||
CARGO_XCODE_BUILD_MODE = release;
|
|
||||||
CARGO_XCODE_FEATURES = "";
|
|
||||||
"CARGO_XCODE_TARGET_ARCH[arch=arm64*]" = aarch64;
|
|
||||||
"CARGO_XCODE_TARGET_ARCH[arch=i386]" = i686;
|
|
||||||
"CARGO_XCODE_TARGET_ARCH[arch=x86_64*]" = x86_64;
|
|
||||||
"CARGO_XCODE_TARGET_OS[sdk=appletvos*]" = tvos;
|
|
||||||
"CARGO_XCODE_TARGET_OS[sdk=appletvsimulator*]" = tvos;
|
|
||||||
"CARGO_XCODE_TARGET_OS[sdk=iphoneos*]" = ios;
|
|
||||||
"CARGO_XCODE_TARGET_OS[sdk=iphonesimulator*]" = "ios-sim";
|
|
||||||
"CARGO_XCODE_TARGET_OS[sdk=iphonesimulator*][arch=x86_64*]" = ios;
|
|
||||||
"CARGO_XCODE_TARGET_OS[sdk=macosx*]" = darwin;
|
|
||||||
CURRENT_PROJECT_VERSION = 0.1;
|
|
||||||
MARKETING_VERSION = 0.1.0;
|
|
||||||
PRODUCT_NAME = em_proxy;
|
|
||||||
SDKROOT = macosx;
|
|
||||||
SUPPORTS_MACCATALYST = YES;
|
|
||||||
};
|
|
||||||
name = Release;
|
|
||||||
};
|
|
||||||
CA60DE07A83FA30E3695DD59 /* Debug */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
CARGO_XCODE_CARGO_DEP_FILE_NAME = libem_proxy.d;
|
|
||||||
CARGO_XCODE_CARGO_FILE_NAME = libem_proxy.a;
|
|
||||||
INSTALL_GROUP = "";
|
|
||||||
INSTALL_MODE_FLAG = "";
|
|
||||||
INSTALL_OWNER = "";
|
|
||||||
LIB_FILE_NAME = "";
|
|
||||||
"LIB_FILE_NAME[sdk=iphoneos*]" = "libem_proxy-ios";
|
|
||||||
"LIB_FILE_NAME[sdk=iphonesimulator*]" = "libem_proxy-sim";
|
|
||||||
MACOSX_DEPLOYMENT_TARGET = 11.5;
|
|
||||||
PRODUCT_NAME = em_proxy_static;
|
|
||||||
SKIP_INSTALL = YES;
|
|
||||||
SUPPORTED_PLATFORMS = "macosx iphonesimulator iphoneos appletvsimulator appletvos";
|
|
||||||
TVOS_DEPLOYMENT_TARGET = 11.5;
|
|
||||||
};
|
|
||||||
name = Debug;
|
|
||||||
};
|
|
||||||
/* End XCBuildConfiguration section */
|
|
||||||
|
|
||||||
/* Begin XCConfigurationList section */
|
|
||||||
CA603DD75FB4A30E3695DD59 /* Build configuration list for PBXNativeTarget "em_proxy-staticlib" */ = {
|
|
||||||
isa = XCConfigurationList;
|
|
||||||
buildConfigurations = (
|
|
||||||
CA604DFE779BA30E3695DD59 /* Release */,
|
|
||||||
CA60DE07A83FA30E3695DD59 /* Debug */,
|
|
||||||
);
|
|
||||||
defaultConfigurationIsVisible = 0;
|
|
||||||
defaultConfigurationName = Release;
|
|
||||||
};
|
|
||||||
CA6094FFF69280E02D6C7F57 /* Build configuration list for PBXProject "em_proxy" */ = {
|
|
||||||
isa = XCConfigurationList;
|
|
||||||
buildConfigurations = (
|
|
||||||
CA609A5173513CC16B37690B /* Release */,
|
|
||||||
CA609A517351228BE02872F8 /* Debug */,
|
|
||||||
);
|
|
||||||
defaultConfigurationIsVisible = 0;
|
|
||||||
defaultConfigurationName = Release;
|
|
||||||
};
|
|
||||||
/* End XCConfigurationList section */
|
|
||||||
};
|
|
||||||
rootObject = CA6094FFF692E04653AD465F /* Project object */;
|
|
||||||
}
|
|
||||||
118
Dependencies/fetch-prebuilt.sh
vendored
118
Dependencies/fetch-prebuilt.sh
vendored
@@ -1,118 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
# Ensure we are in Dependencies directory
|
|
||||||
cd "$(dirname "$0")"
|
|
||||||
|
|
||||||
# Detect if Homebrew is in /opt/homebrew (Apple Silicon) or /usr/local (Intel)
|
|
||||||
if [[ -d "/opt/homebrew" ]]; then
|
|
||||||
export PATH="/opt/homebrew/bin:$PATH"
|
|
||||||
elif [[ -d "/usr/local" ]]; then
|
|
||||||
export PATH="/usr/local/bin:$PATH"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Check if wget and curl are installed; if not, install them via Homebrew
|
|
||||||
if ! command -v wget &> /dev/null; then
|
|
||||||
echo "wget not found, attempting to install via Homebrew..."
|
|
||||||
if command -v brew &> /dev/null; then
|
|
||||||
brew install wget
|
|
||||||
else
|
|
||||||
echo "Homebrew is not installed. Please install Homebrew and rerun the script."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if ! command -v curl &> /dev/null; then
|
|
||||||
echo "curl not found, attempting to install via Homebrew..."
|
|
||||||
if command -v brew &> /dev/null; then
|
|
||||||
brew install curl
|
|
||||||
else
|
|
||||||
echo "Homebrew is not installed. Please install Homebrew and rerun the script."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
check_for_update() {
|
|
||||||
if [ -f ".skip-prebuilt-fetch-$1" ]; then
|
|
||||||
echo "Skipping prebuilt fetch for $1 since .skip-prebuilt-fetch-$1 exists. If you are developing $1 alongside SideStore, don't remove this file, or this script will replace your locally built binaries with the ones built by GitHub Actions."
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ ! -f ".last-prebuilt-fetch-$1" ]; then
|
|
||||||
echo "0,none" > ".last-prebuilt-fetch-$1"
|
|
||||||
fi
|
|
||||||
|
|
||||||
LAST_FETCH=`cat .last-prebuilt-fetch-$1 | perl -n -e '/([0-9]*),([^ ]*)$/ && print $1'`
|
|
||||||
LAST_COMMIT=`cat .last-prebuilt-fetch-$1 | perl -n -e '/([0-9]*),([^ ]*)$/ && print $2'`
|
|
||||||
|
|
||||||
# Check if required library files exist
|
|
||||||
FORCE_DOWNLOAD=false
|
|
||||||
if [ ! -f "$1/lib$1-sim.a" ] || [ ! -f "$1/lib$1-ios.a" ]; then
|
|
||||||
echo "Required libraries missing for $1, forcing download..."
|
|
||||||
FORCE_DOWNLOAD=true
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Download if:
|
|
||||||
# 1. Libraries are missing (FORCE_DOWNLOAD), or
|
|
||||||
# 2. Last fetch was over 1 hour ago, or
|
|
||||||
# 3. Force flag was passed
|
|
||||||
if [ "$FORCE_DOWNLOAD" = true ] || [[ $LAST_FETCH -lt $(expr $(date +%s) - 3600) ]] || [[ "$2" == "force" ]]; then
|
|
||||||
echo "Checking $1 for update"
|
|
||||||
echo
|
|
||||||
LATEST_COMMIT=`curl https://api.github.com/repos/SideStore/$1/releases/latest | perl -n -e '/Commit: https:\\/\\/github\\.com\\/[^\\/]*\\/[^\\/]*\\/commit\\/([^"]*)/ && print $1'`
|
|
||||||
echo
|
|
||||||
echo "Last commit: $LAST_COMMIT"
|
|
||||||
echo "Latest commit: $LATEST_COMMIT"
|
|
||||||
|
|
||||||
NOT_UPTODATE=false
|
|
||||||
if [[ "$LAST_COMMIT" != "$LATEST_COMMIT" ]]; then
|
|
||||||
echo "Found update on the remote: https://api.github.com/repos/SideStore/$1/releases/latest"
|
|
||||||
NOT_UPTODATE=true
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Download if:
|
|
||||||
# 1. Libraries are missing (FORCE_DOWNLOAD), or
|
|
||||||
# 2. New commit is available
|
|
||||||
if [ "$FORCE_DOWNLOAD" = true ] || [ "$NOT_UPTODATE" = true ] ;then
|
|
||||||
echo "downloading binaries"
|
|
||||||
echo
|
|
||||||
if [[ "$1" != "minimuxer" ]]; then
|
|
||||||
wget -O "$1/lib$1-sim.a" "https://github.com/SideStore/$1/releases/latest/download/lib$1-sim.a"
|
|
||||||
wget -O "$1/lib$1-ios.a" "https://github.com/SideStore/$1/releases/latest/download/lib$1-ios.a"
|
|
||||||
wget -O "$1/$1.h" "https://github.com/SideStore/$1/releases/latest/download/$1.h"
|
|
||||||
wget -O "$1/$1.swift" "https://github.com/SideStore/$1/releases/latest/download/$1.swift"
|
|
||||||
echo
|
|
||||||
else
|
|
||||||
wget -O "$1/lib$1-sim.a" "https://github.com/SideStore/$1/releases/latest/download/lib$1-sim.a"
|
|
||||||
wget -O "$1/lib$1-ios.a" "https://github.com/SideStore/$1/releases/latest/download/lib$1-ios.a"
|
|
||||||
wget -O "$1/generated.zip" "https://github.com/SideStore/$1/releases/latest/download/generated.zip"
|
|
||||||
echo
|
|
||||||
echo "Unzipping generated.zip"
|
|
||||||
cd "$1"
|
|
||||||
unzip ./generated.zip
|
|
||||||
cp -v generated/* .
|
|
||||||
# Remove all files except ones that comes checked-in from minimuxer repository
|
|
||||||
find generated -type f ! -name 'minimuxer-Bridging-Header.h' ! -name 'minimuxer-helpers.swift' -exec rm -v {} \;
|
|
||||||
rm generated.zip
|
|
||||||
rmdir generated/
|
|
||||||
cd ..
|
|
||||||
echo "Done"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo "Up-to-date"
|
|
||||||
fi
|
|
||||||
echo "$(date +%s),$LATEST_COMMIT" > ".last-prebuilt-fetch-$1"
|
|
||||||
else
|
|
||||||
echo "It hasn't been 1 hour and force was not specified, skipping update check for $1"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Allow for Xcode to check minimuxer and em_proxy separately by skipping the update check if the other one is specified as an argument
|
|
||||||
if [[ "$1" != "em_proxy" ]]; then
|
|
||||||
check_for_update minimuxer "$1"
|
|
||||||
if [[ "$1" != "minimuxer" ]]; then
|
|
||||||
echo
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
if [[ "$1" != "minimuxer" ]]; then
|
|
||||||
check_for_update em_proxy "$1"
|
|
||||||
fi
|
|
||||||
2
Dependencies/minimuxer
vendored
2
Dependencies/minimuxer
vendored
Submodule Dependencies/minimuxer updated: 9ceaaf01ea...c9236c844a
264
Dependencies/minimuxer.xcodeproj/project.pbxproj
vendored
264
Dependencies/minimuxer.xcodeproj/project.pbxproj
vendored
@@ -1,264 +0,0 @@
|
|||||||
// !$*UTF8*$!
|
|
||||||
{
|
|
||||||
archiveVersion = 1;
|
|
||||||
classes = {
|
|
||||||
};
|
|
||||||
objectVersion = 53;
|
|
||||||
objects = {
|
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
|
||||||
A8A5B07F2F4C355800572B4A /* minimuxer.h in Sources */ = {isa = PBXBuildFile; fileRef = A8A5B07D2F4C34FF00572B4A /* minimuxer.h */; };
|
|
||||||
A8A5B0802F4C355800572B4A /* SwiftBridgeCore.h in Sources */ = {isa = PBXBuildFile; fileRef = A8A5B07E2F4C34FF00572B4A /* SwiftBridgeCore.h */; };
|
|
||||||
/* End PBXBuildFile section */
|
|
||||||
|
|
||||||
/* Begin PBXBuildRule section */
|
|
||||||
CA6012A875F9AC6C1400ACA8 /* PBXBuildRule */ = {
|
|
||||||
isa = PBXBuildRule;
|
|
||||||
compilerSpec = com.apple.compilers.proxy.script;
|
|
||||||
filePatterns = "*/minimuxer.h";
|
|
||||||
fileType = pattern.proxy;
|
|
||||||
inputFiles = (
|
|
||||||
);
|
|
||||||
isEditable = 0;
|
|
||||||
name = "Cargo project build";
|
|
||||||
outputFiles = (
|
|
||||||
"$(OBJECT_FILE_DIR)/$(CARGO_XCODE_TARGET_ARCH)-$(EXECUTABLE_NAME)",
|
|
||||||
"$(TARGET_BUILD_DIR)/$(FULL_PRODUCT_NAME)",
|
|
||||||
"$(SRCROOT)/Dependencies/minimuxer/minimuxer.h",
|
|
||||||
);
|
|
||||||
script = "# generated with cargo-xcode 1.5.0\n# modified to use prebuilt binaries\n\nset -eu;\n\nBUILT_SRC=\"./minimuxer/${LIB_FILE_NAME}.a\"\necho Generating Static lib: $BUILT_SRC\nln -f -- \"$BUILT_SRC\" \"$TARGET_BUILD_DIR/$EXECUTABLE_PATH\" || cp \"$BUILT_SRC\" \"$TARGET_BUILD_DIR/$EXECUTABLE_PATH\"\necho \"$BUILT_SRC -> $TARGET_BUILD_DIR/$EXECUTABLE_PATH\"\n\n# xcode generates dep file, but for its own path, so append our rename to it\n#DEP_FILE_SRC=\"minimuxer/target/${CARGO_XCODE_TARGET_TRIPLE}/release/${CARGO_XCODE_CARGO_DEP_FILE_NAME}\"\n#if [ -f \"$DEP_FILE_SRC\" ]; then\n# DEP_FILE_DST=\"${DERIVED_FILE_DIR}/${CARGO_XCODE_TARGET_ARCH}-${EXECUTABLE_NAME}.d\"\n# cp -f \"$DEP_FILE_SRC\" \"$DEP_FILE_DST\"\n# echo >> \"$DEP_FILE_DST\" \"$SCRIPT_OUTPUT_FILE_0: $BUILT_SRC\"\n#fi\n\n# lipo script needs to know all the platform-specific files that have been built\n# archs is in the file name, so that paths don't stay around after archs change\n# must match input for LipoScript\n#FILE_LIST=\"${DERIVED_FILE_DIR}/${ARCHS}-${EXECUTABLE_NAME}.xcfilelist\"\n#touch \"$FILE_LIST\"\n#if ! egrep -q \"$SCRIPT_OUTPUT_FILE_0\" \"$FILE_LIST\" ; then\n# echo >> \"$FILE_LIST\" \"$SCRIPT_OUTPUT_FILE_0\"\n#fi\n";
|
|
||||||
};
|
|
||||||
/* End PBXBuildRule section */
|
|
||||||
|
|
||||||
/* Begin PBXFileReference section */
|
|
||||||
A8A5B07D2F4C34FF00572B4A /* minimuxer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = minimuxer.h; path = minimuxer/minimuxer.h; sourceTree = "<group>"; };
|
|
||||||
A8A5B07E2F4C34FF00572B4A /* SwiftBridgeCore.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SwiftBridgeCore.h; path = minimuxer/SwiftBridgeCore.h; sourceTree = "<group>"; };
|
|
||||||
A8A5B09C2F4C454900572B4A /* minimuxer-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "minimuxer-Bridging-Header.h"; path = "minimuxer/minimuxer-Bridging-Header.h"; sourceTree = "<group>"; };
|
|
||||||
CA609C732349C7AAD9FA67C4 /* libminimuxer_static.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libminimuxer_static.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
|
||||||
/* End PBXFileReference section */
|
|
||||||
|
|
||||||
/* Begin PBXGroup section */
|
|
||||||
CA6012A875F922869D176AE5 /* Products */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
CA609C732349C7AAD9FA67C4 /* libminimuxer_static.a */,
|
|
||||||
);
|
|
||||||
name = Products;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
CA6012A875F9D65BC3C892A8 = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A8A5B07D2F4C34FF00572B4A /* minimuxer.h */,
|
|
||||||
A8A5B07E2F4C34FF00572B4A /* SwiftBridgeCore.h */,
|
|
||||||
A8A5B09C2F4C454900572B4A /* minimuxer-Bridging-Header.h */,
|
|
||||||
CA6012A875F922869D176AE5 /* Products */,
|
|
||||||
);
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
/* End PBXGroup section */
|
|
||||||
|
|
||||||
/* Begin PBXNativeTarget section */
|
|
||||||
CA609C732349A560B9642892 /* minimuxer-staticlib */ = {
|
|
||||||
isa = PBXNativeTarget;
|
|
||||||
buildConfigurationList = CA600589A243A560B9642892 /* Build configuration list for PBXNativeTarget "minimuxer-staticlib" */;
|
|
||||||
buildPhases = (
|
|
||||||
9987603629A4611D00818586 /* Fetch prebuilt binaries */,
|
|
||||||
CA600F638141A560B9642892 /* Sources */,
|
|
||||||
);
|
|
||||||
buildRules = (
|
|
||||||
CA6012A875F9AC6C1400ACA8 /* PBXBuildRule */,
|
|
||||||
);
|
|
||||||
dependencies = (
|
|
||||||
);
|
|
||||||
name = "minimuxer-staticlib";
|
|
||||||
productName = libminimuxer_static.a;
|
|
||||||
productReference = CA609C732349C7AAD9FA67C4 /* libminimuxer_static.a */;
|
|
||||||
productType = "com.apple.product-type.library.static";
|
|
||||||
};
|
|
||||||
/* End PBXNativeTarget section */
|
|
||||||
|
|
||||||
/* Begin PBXProject section */
|
|
||||||
CA6012A875F9E04653AD465F /* Project object */ = {
|
|
||||||
isa = PBXProject;
|
|
||||||
attributes = {
|
|
||||||
LastUpgradeCheck = 1300;
|
|
||||||
TargetAttributes = {
|
|
||||||
CA609C732349A560B9642892 = {
|
|
||||||
CreatedOnToolsVersion = 9.2;
|
|
||||||
ProvisioningStyle = Automatic;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
buildConfigurationList = CA6012A875F980E02D6C7F57 /* Build configuration list for PBXProject "minimuxer" */;
|
|
||||||
compatibilityVersion = "Xcode 11.4";
|
|
||||||
developmentRegion = en;
|
|
||||||
hasScannedForEncodings = 0;
|
|
||||||
knownRegions = (
|
|
||||||
en,
|
|
||||||
Base,
|
|
||||||
);
|
|
||||||
mainGroup = CA6012A875F9D65BC3C892A8;
|
|
||||||
productRefGroup = CA6012A875F922869D176AE5 /* Products */;
|
|
||||||
projectDirPath = "";
|
|
||||||
projectRoot = "";
|
|
||||||
targets = (
|
|
||||||
CA609C732349A560B9642892 /* minimuxer-staticlib */,
|
|
||||||
);
|
|
||||||
};
|
|
||||||
/* End PBXProject section */
|
|
||||||
|
|
||||||
/* Begin PBXShellScriptBuildPhase section */
|
|
||||||
9987603629A4611D00818586 /* Fetch prebuilt binaries */ = {
|
|
||||||
isa = PBXShellScriptBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
);
|
|
||||||
inputFileListPaths = (
|
|
||||||
);
|
|
||||||
inputPaths = (
|
|
||||||
);
|
|
||||||
name = "Fetch prebuilt binaries";
|
|
||||||
outputFileListPaths = (
|
|
||||||
);
|
|
||||||
outputPaths = (
|
|
||||||
./minimuxer/minimuxer.h,
|
|
||||||
./minimuxer/SwiftBridgeCore.h,
|
|
||||||
./minimuxer/minimuxer.swift,
|
|
||||||
./minimuxer/SwiftBridgeCore.swift,
|
|
||||||
"./minimuxer/minimuxer-Bridging-Header.h",
|
|
||||||
"./minimuxer/minimuxer-helpers.swift",
|
|
||||||
"./minimuxer/libminimuxer-ios.a",
|
|
||||||
"./minimuxer/libminimuxer-sim.a",
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
shellPath = /bin/sh;
|
|
||||||
shellScript = "#!bash\npwd\nchmod +x ./fetch-prebuilt.sh \n./fetch-prebuilt.sh minimuxer\n";
|
|
||||||
};
|
|
||||||
/* End PBXShellScriptBuildPhase section */
|
|
||||||
|
|
||||||
/* Begin PBXSourcesBuildPhase section */
|
|
||||||
CA600F638141A560B9642892 /* Sources */ = {
|
|
||||||
isa = PBXSourcesBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
A8A5B07F2F4C355800572B4A /* minimuxer.h in Sources */,
|
|
||||||
A8A5B0802F4C355800572B4A /* SwiftBridgeCore.h in Sources */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
/* End PBXSourcesBuildPhase section */
|
|
||||||
|
|
||||||
/* Begin XCBuildConfiguration section */
|
|
||||||
CA6008D36272A560B9642892 /* Debug */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
CARGO_XCODE_CARGO_DEP_FILE_NAME = libminimuxer.d;
|
|
||||||
CARGO_XCODE_CARGO_FILE_NAME = libminimuxer.a;
|
|
||||||
INSTALL_GROUP = "";
|
|
||||||
INSTALL_MODE_FLAG = "";
|
|
||||||
INSTALL_OWNER = "";
|
|
||||||
LIB_FILE_NAME = "";
|
|
||||||
"LIB_FILE_NAME[sdk=iphoneos*]" = "libminimuxer-ios";
|
|
||||||
"LIB_FILE_NAME[sdk=iphonesimulator*]" = "libminimuxer-sim";
|
|
||||||
MACOSX_DEPLOYMENT_TARGET = 11.5;
|
|
||||||
PRODUCT_NAME = minimuxer_static;
|
|
||||||
SKIP_INSTALL = YES;
|
|
||||||
SUPPORTED_PLATFORMS = "macosx iphonesimulator iphoneos appletvsimulator appletvos";
|
|
||||||
TVOS_DEPLOYMENT_TARGET = 11.5;
|
|
||||||
};
|
|
||||||
name = Debug;
|
|
||||||
};
|
|
||||||
CA602DE9FCEDA560B9642892 /* Release */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
CARGO_XCODE_CARGO_DEP_FILE_NAME = libminimuxer.d;
|
|
||||||
CARGO_XCODE_CARGO_FILE_NAME = libminimuxer.a;
|
|
||||||
INSTALL_GROUP = "";
|
|
||||||
INSTALL_MODE_FLAG = "";
|
|
||||||
INSTALL_OWNER = "";
|
|
||||||
LIB_FILE_NAME = "";
|
|
||||||
"LIB_FILE_NAME[sdk=iphoneos*]" = "libminimuxer-ios";
|
|
||||||
"LIB_FILE_NAME[sdk=iphonesimulator*]" = "libminimuxer-sim";
|
|
||||||
MACOSX_DEPLOYMENT_TARGET = 11.5;
|
|
||||||
PRODUCT_NAME = minimuxer_static;
|
|
||||||
SKIP_INSTALL = YES;
|
|
||||||
SUPPORTED_PLATFORMS = "macosx iphonesimulator iphoneos appletvsimulator appletvos";
|
|
||||||
TVOS_DEPLOYMENT_TARGET = 11.5;
|
|
||||||
};
|
|
||||||
name = Release;
|
|
||||||
};
|
|
||||||
CA60A20F8EA6228BE02872F8 /* Debug */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
|
||||||
CARGO_TARGET_DIR = "$(PROJECT_TEMP_DIR)/cargo_target";
|
|
||||||
CARGO_XCODE_BUILD_MODE = debug;
|
|
||||||
CARGO_XCODE_FEATURES = "";
|
|
||||||
"CARGO_XCODE_TARGET_ARCH[arch=arm64*]" = aarch64;
|
|
||||||
"CARGO_XCODE_TARGET_ARCH[arch=i386]" = i686;
|
|
||||||
"CARGO_XCODE_TARGET_ARCH[arch=x86_64*]" = x86_64;
|
|
||||||
"CARGO_XCODE_TARGET_OS[sdk=appletvos*]" = tvos;
|
|
||||||
"CARGO_XCODE_TARGET_OS[sdk=appletvsimulator*]" = tvos;
|
|
||||||
"CARGO_XCODE_TARGET_OS[sdk=iphoneos*]" = ios;
|
|
||||||
"CARGO_XCODE_TARGET_OS[sdk=iphonesimulator*]" = "ios-sim";
|
|
||||||
"CARGO_XCODE_TARGET_OS[sdk=iphonesimulator*][arch=x86_64*]" = ios;
|
|
||||||
"CARGO_XCODE_TARGET_OS[sdk=macosx*]" = darwin;
|
|
||||||
CURRENT_PROJECT_VERSION = 0.1;
|
|
||||||
MARKETING_VERSION = 0.1.0;
|
|
||||||
ONLY_ACTIVE_ARCH = YES;
|
|
||||||
PRODUCT_NAME = minimuxer;
|
|
||||||
SDKROOT = macosx;
|
|
||||||
SUPPORTS_MACCATALYST = YES;
|
|
||||||
};
|
|
||||||
name = Debug;
|
|
||||||
};
|
|
||||||
CA60A20F8EA63CC16B37690B /* Release */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
|
||||||
CARGO_TARGET_DIR = "$(PROJECT_TEMP_DIR)/cargo_target";
|
|
||||||
CARGO_XCODE_BUILD_MODE = release;
|
|
||||||
CARGO_XCODE_FEATURES = "";
|
|
||||||
"CARGO_XCODE_TARGET_ARCH[arch=arm64*]" = aarch64;
|
|
||||||
"CARGO_XCODE_TARGET_ARCH[arch=i386]" = i686;
|
|
||||||
"CARGO_XCODE_TARGET_ARCH[arch=x86_64*]" = x86_64;
|
|
||||||
"CARGO_XCODE_TARGET_OS[sdk=appletvos*]" = tvos;
|
|
||||||
"CARGO_XCODE_TARGET_OS[sdk=appletvsimulator*]" = tvos;
|
|
||||||
"CARGO_XCODE_TARGET_OS[sdk=iphoneos*]" = ios;
|
|
||||||
"CARGO_XCODE_TARGET_OS[sdk=iphonesimulator*]" = "ios-sim";
|
|
||||||
"CARGO_XCODE_TARGET_OS[sdk=iphonesimulator*][arch=x86_64*]" = ios;
|
|
||||||
"CARGO_XCODE_TARGET_OS[sdk=macosx*]" = darwin;
|
|
||||||
CURRENT_PROJECT_VERSION = 0.1;
|
|
||||||
MARKETING_VERSION = 0.1.0;
|
|
||||||
PRODUCT_NAME = minimuxer;
|
|
||||||
SDKROOT = macosx;
|
|
||||||
SUPPORTS_MACCATALYST = YES;
|
|
||||||
};
|
|
||||||
name = Release;
|
|
||||||
};
|
|
||||||
/* End XCBuildConfiguration section */
|
|
||||||
|
|
||||||
/* Begin XCConfigurationList section */
|
|
||||||
CA600589A243A560B9642892 /* Build configuration list for PBXNativeTarget "minimuxer-staticlib" */ = {
|
|
||||||
isa = XCConfigurationList;
|
|
||||||
buildConfigurations = (
|
|
||||||
CA602DE9FCEDA560B9642892 /* Release */,
|
|
||||||
CA6008D36272A560B9642892 /* Debug */,
|
|
||||||
);
|
|
||||||
defaultConfigurationIsVisible = 0;
|
|
||||||
defaultConfigurationName = Release;
|
|
||||||
};
|
|
||||||
CA6012A875F980E02D6C7F57 /* Build configuration list for PBXProject "minimuxer" */ = {
|
|
||||||
isa = XCConfigurationList;
|
|
||||||
buildConfigurations = (
|
|
||||||
CA60A20F8EA63CC16B37690B /* Release */,
|
|
||||||
CA60A20F8EA6228BE02872F8 /* Debug */,
|
|
||||||
);
|
|
||||||
defaultConfigurationIsVisible = 0;
|
|
||||||
defaultConfigurationName = Release;
|
|
||||||
};
|
|
||||||
/* End XCConfigurationList section */
|
|
||||||
};
|
|
||||||
rootObject = CA6012A875F9E04653AD465F /* Project object */;
|
|
||||||
}
|
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<Scheme
|
|
||||||
LastUpgradeVersion = "2620"
|
|
||||||
version = "1.7">
|
|
||||||
<BuildAction
|
|
||||||
parallelizeBuildables = "YES"
|
|
||||||
buildImplicitDependencies = "YES"
|
|
||||||
buildArchitectures = "Automatic">
|
|
||||||
<BuildActionEntries>
|
|
||||||
<BuildActionEntry
|
|
||||||
buildForTesting = "YES"
|
|
||||||
buildForRunning = "YES"
|
|
||||||
buildForProfiling = "YES"
|
|
||||||
buildForArchiving = "YES"
|
|
||||||
buildForAnalyzing = "YES">
|
|
||||||
<BuildableReference
|
|
||||||
BuildableIdentifier = "primary"
|
|
||||||
BlueprintIdentifier = "CA609C732349A560B9642892"
|
|
||||||
BuildableName = "libminimuxer_static.a"
|
|
||||||
BlueprintName = "minimuxer-staticlib"
|
|
||||||
ReferencedContainer = "container:minimuxer.xcodeproj">
|
|
||||||
</BuildableReference>
|
|
||||||
</BuildActionEntry>
|
|
||||||
</BuildActionEntries>
|
|
||||||
</BuildAction>
|
|
||||||
<TestAction
|
|
||||||
buildConfiguration = "Debug"
|
|
||||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
|
||||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
|
||||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
|
||||||
shouldAutocreateTestPlan = "YES">
|
|
||||||
</TestAction>
|
|
||||||
<LaunchAction
|
|
||||||
buildConfiguration = "Debug"
|
|
||||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
|
||||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
|
||||||
launchStyle = "0"
|
|
||||||
useCustomWorkingDirectory = "NO"
|
|
||||||
ignoresPersistentStateOnLaunch = "NO"
|
|
||||||
debugDocumentVersioning = "YES"
|
|
||||||
debugServiceExtension = "internal"
|
|
||||||
allowLocationSimulation = "YES">
|
|
||||||
</LaunchAction>
|
|
||||||
<ProfileAction
|
|
||||||
buildConfiguration = "Release"
|
|
||||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
|
||||||
savedToolIdentifier = ""
|
|
||||||
useCustomWorkingDirectory = "NO"
|
|
||||||
debugDocumentVersioning = "YES">
|
|
||||||
<MacroExpansion>
|
|
||||||
<BuildableReference
|
|
||||||
BuildableIdentifier = "primary"
|
|
||||||
BlueprintIdentifier = "CA609C732349A560B9642892"
|
|
||||||
BuildableName = "libminimuxer_static.a"
|
|
||||||
BlueprintName = "minimuxer-staticlib"
|
|
||||||
ReferencedContainer = "container:minimuxer.xcodeproj">
|
|
||||||
</BuildableReference>
|
|
||||||
</MacroExpansion>
|
|
||||||
</ProfileAction>
|
|
||||||
<AnalyzeAction
|
|
||||||
buildConfiguration = "Debug">
|
|
||||||
</AnalyzeAction>
|
|
||||||
<ArchiveAction
|
|
||||||
buildConfiguration = "Release"
|
|
||||||
revealArchiveInOrganizer = "YES">
|
|
||||||
</ArchiveAction>
|
|
||||||
</Scheme>
|
|
||||||
@@ -1,132 +0,0 @@
|
|||||||
//
|
|
||||||
// IfManager.swift
|
|
||||||
// AltStore
|
|
||||||
//
|
|
||||||
// Created by ny on 2/27/26.
|
|
||||||
// Copyright © 2026 SideStore. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
import Foundation
|
|
||||||
import Network
|
|
||||||
|
|
||||||
fileprivate func uti(_ uint: UInt32) -> String? {
|
|
||||||
var buf = [CChar](repeating: 0, count: Int(NI_MAXHOST))
|
|
||||||
var addr = in_addr(s_addr: uint.bigEndian)
|
|
||||||
guard inet_ntop(AF_INET, &addr, &buf, UInt32(INET_ADDRSTRLEN)) != nil,
|
|
||||||
let str = String(utf8String: buf) else { return nil }
|
|
||||||
return str
|
|
||||||
}
|
|
||||||
|
|
||||||
fileprivate func socktouint(_ sock: inout sockaddr) -> UInt32 {
|
|
||||||
var buf = [CChar](repeating: 0, count: Int(NI_MAXHOST))
|
|
||||||
guard getnameinfo(&sock, socklen_t(sock.sa_len), &buf, socklen_t(buf.count), nil, socklen_t(0), NI_NUMERICHOST) == 0,
|
|
||||||
let name = String(utf8String: buf) else {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
var addr = in_addr()
|
|
||||||
guard name.withCString({ cString in
|
|
||||||
inet_pton(AF_INET, cString, &addr)
|
|
||||||
}) == 1 else { return 0 }
|
|
||||||
return addr.s_addr.bigEndian
|
|
||||||
}
|
|
||||||
|
|
||||||
public struct NetInfo: Hashable, CustomStringConvertible {
|
|
||||||
public let name: String
|
|
||||||
public let hostIP: String
|
|
||||||
public let destIP: String
|
|
||||||
public let maskIP: String
|
|
||||||
|
|
||||||
private let host: UInt32
|
|
||||||
private let dest: UInt32
|
|
||||||
private let mask: UInt32
|
|
||||||
|
|
||||||
init(name: String, host: UInt32, dest: UInt32, mask: UInt32) {
|
|
||||||
self.name = name
|
|
||||||
self.host = host
|
|
||||||
self.dest = dest
|
|
||||||
self.mask = mask
|
|
||||||
self.hostIP = uti(host) ?? "10.7.0.0"
|
|
||||||
self.destIP = uti(dest) ?? "10.7.0.1"
|
|
||||||
self.maskIP = uti(mask) ?? "255.255.255.0"
|
|
||||||
}
|
|
||||||
|
|
||||||
init?(_ ifaddr: ifaddrs) {
|
|
||||||
guard
|
|
||||||
let ianame = String(utf8String: ifaddr.ifa_name)
|
|
||||||
else { return nil }
|
|
||||||
|
|
||||||
let host = socktouint(&ifaddr.ifa_addr.pointee)
|
|
||||||
let dest = socktouint(&ifaddr.ifa_dstaddr.pointee)
|
|
||||||
let mask = socktouint(&ifaddr.ifa_netmask.pointee)
|
|
||||||
|
|
||||||
self.init(name: ianame, host: host, dest: dest, mask: mask)
|
|
||||||
}
|
|
||||||
|
|
||||||
// computed networking values (still numeric internally)
|
|
||||||
public var minIP: UInt32 { host & mask }
|
|
||||||
public var maxIP: UInt32 { host | ~mask }
|
|
||||||
|
|
||||||
public var minIPString: String { uti(minIP) ?? "nil" }
|
|
||||||
public var maxIPString: String { uti(maxIP) ?? "nil" }
|
|
||||||
|
|
||||||
public var description: String {
|
|
||||||
"\(name) | ip=\(hostIP) dest=\(destIP) mask=\(maskIP) range=\(minIPString)-\(maxIPString)"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
final class IfManager: Sendable {
|
|
||||||
public static let shared = IfManager()
|
|
||||||
nonisolated(unsafe) private(set) var addrs: Set<NetInfo> = Set()
|
|
||||||
|
|
||||||
private init() {
|
|
||||||
self.addrs = IfManager.query()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public func query() {
|
|
||||||
addrs = IfManager.query()
|
|
||||||
}
|
|
||||||
|
|
||||||
private static func query() -> Set<NetInfo> {
|
|
||||||
var addrs = Set<NetInfo>()
|
|
||||||
var head: UnsafeMutablePointer<ifaddrs>? = nil
|
|
||||||
guard getifaddrs(&head) == 0, let first = head else { return addrs }
|
|
||||||
defer { freeifaddrs(head) }
|
|
||||||
|
|
||||||
var cursor: UnsafeMutablePointer<ifaddrs>? = first
|
|
||||||
while let current = cursor {
|
|
||||||
// we only want v4 interfaces that aren't loopback and aren't masked 255.255.255.255
|
|
||||||
let entry = current.pointee
|
|
||||||
let flags = Int32(entry.ifa_flags)
|
|
||||||
|
|
||||||
let isIPv4 = entry.ifa_addr.pointee.sa_family == UInt8(AF_INET)
|
|
||||||
let isActive = (flags & (IFF_UP | IFF_RUNNING | IFF_LOOPBACK)) == (IFF_UP | IFF_RUNNING)
|
|
||||||
|
|
||||||
if isIPv4, isActive, let info = NetInfo(entry), info.maskIP != "255.255.255.255" {
|
|
||||||
addrs.insert(info)
|
|
||||||
}
|
|
||||||
|
|
||||||
cursor = entry.ifa_next
|
|
||||||
}
|
|
||||||
return addrs
|
|
||||||
}
|
|
||||||
|
|
||||||
private var nextLAN: NetInfo? {
|
|
||||||
addrs.first { $0.name.starts(with: "en") }
|
|
||||||
}
|
|
||||||
|
|
||||||
var nextProbableSideVPN: NetInfo? {
|
|
||||||
// try old 10.7.0.1 first, then fallback to next v4
|
|
||||||
// user should only be connected to StosVPN/LocalDevVPN
|
|
||||||
addrs.first {
|
|
||||||
$0.hostIP == "10.7.0.1" ||
|
|
||||||
$0.name.starts(with: "utun")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var sideVPNPatched: Bool {
|
|
||||||
nextLAN?.maskIP == nextProbableSideVPN?.maskIP &&
|
|
||||||
nextLAN?.maxIP == nextProbableSideVPN?.maxIP
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -6,90 +6,178 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
private import minimuxer
|
import Minimuxer
|
||||||
|
|
||||||
|
func bindTunnelConfig() {
|
||||||
|
defer { print("[SideStore] bindTunnelConfig() completed") }
|
||||||
|
|
||||||
var isMinimuxerReady: Bool {
|
|
||||||
#if targetEnvironment(simulator)
|
#if targetEnvironment(simulator)
|
||||||
print("isMinimuxerReady property is always true on simulator")
|
print("[SideStore] bindTunnelConfig() is no-op on simulator")
|
||||||
return true
|
|
||||||
#else
|
#else
|
||||||
IfManager.shared.query()
|
print("[SideStore] bindTunnelConfig() invoked")
|
||||||
let dest = IfManager.shared.nextProbableSideVPN?.destIP
|
|
||||||
if #available(iOS 26.4, *) {
|
Task { @MainActor in
|
||||||
return minimuxer.ready(dest) && IfManager.shared.sideVPNPatched
|
let config = TunnelConfig.shared
|
||||||
} else {
|
Minimuxer.bindTunnelConfig(
|
||||||
return minimuxer.ready(dest)
|
TunnelConfigBinding(
|
||||||
|
setDeviceIP: { value in Task { @MainActor in config.deviceIP = value } },
|
||||||
|
setFakeIP: { value in Task { @MainActor in config.fakeIP = value } },
|
||||||
|
setSubnetMask: { value in Task { @MainActor in config.subnetMask = value } },
|
||||||
|
getOverrideFakeIP: { config.overrideFakeIP },
|
||||||
|
setOverrideEffective: { value in Task { @MainActor in config.overrideEffective = value } }
|
||||||
|
)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
func minimuxerStartWithLogger(_ pairingFile: String, _ logPath: String, _ loggingEnabled: Bool) throws {
|
|
||||||
|
var isMinimuxerReady: Bool {
|
||||||
|
var result = true
|
||||||
#if targetEnvironment(simulator)
|
#if targetEnvironment(simulator)
|
||||||
print("minimuxerStartWithLogger(\(pairingFile), \(logPath), \(loggingEnabled)) is no-op on simulator")
|
print("[SideStore] isMinimuxerReady = true on simulator")
|
||||||
#else
|
#else
|
||||||
IfManager.shared.query()
|
result = Minimuxer.ready()
|
||||||
let dest = IfManager.shared.nextProbableSideVPN?.destIP
|
print("[SideStore] isMinimuxerReady = \(result)")
|
||||||
print("minimuxerStartWithLogger(\(pairingFile), \(logPath), \(dest), \(loggingEnabled)) is no-op on simulator")
|
#endif
|
||||||
try minimuxer.startWithLogger(pairingFile, logPath, dest, loggingEnabled)
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func retargetUsbmuxdAddr() {
|
||||||
|
defer { print("[SideStore] retargetUsbmuxdAddr() completed") }
|
||||||
|
#if targetEnvironment(simulator)
|
||||||
|
print("[SideStore] retargetUsbmuxdAddr() is no-op on simulator")
|
||||||
|
#else
|
||||||
|
print("[SideStore] retargetUsbmuxdAddr() invoked")
|
||||||
|
Minimuxer.retargetUsbmuxdAddr()
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
func targetMinimuxerAddress() {
|
func minimuxerStartWithLogger(_ pairingFile: String, _ logPath: String, _ loggingEnabled: Bool) throws {
|
||||||
|
defer { print("[SideStore] minimuxerStartWithLogger(pairingFile, logPath, dest, loggingEnabled) completed") }
|
||||||
#if targetEnvironment(simulator)
|
#if targetEnvironment(simulator)
|
||||||
print("targetMinimuxerAddress() is no-op on simulator")
|
print("[SideStore] minimuxerStartWithLogger(pairingFile, logPath, loggingEnabled) is no-op on simulator")
|
||||||
#else
|
#else
|
||||||
minimuxer.target_minimuxer_address()
|
// refresh config if any
|
||||||
|
bindTunnelConfig()
|
||||||
|
// observe network route changes (and update device endpoint from vpn(utun))
|
||||||
|
NetworkObserver.shared.start()
|
||||||
|
|
||||||
|
print("[SideStore] minimuxerStartWithLogger(pairingFile, logPath, dest, loggingEnabled) invoked")
|
||||||
|
try Minimuxer.startWithLogger(pairingFile: pairingFile,
|
||||||
|
logPath: logPath,
|
||||||
|
isConsoleLoggingEnabled: loggingEnabled)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
func installProvisioningProfiles(_ profileData: Data) throws {
|
func installProvisioningProfiles(_ profileData: Data) throws {
|
||||||
|
defer { print("[SideStore] installProvisioningProfiles(profileData) completed") }
|
||||||
#if targetEnvironment(simulator)
|
#if targetEnvironment(simulator)
|
||||||
print("installProvisioningProfiles(\(profileData)) is no-op on simulator")
|
print("[SideStore] installProvisioningProfiles(profileData) is no-op on simulator")
|
||||||
#else
|
#else
|
||||||
let slice = profileData.toRustByteSlice()
|
print("[SideStore] installProvisioningProfiles(profileData) invoked")
|
||||||
try minimuxer.install_provisioning_profile(slice.forRust())
|
try Minimuxer.installProvisioningProfile(profile: profileData)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func removeProvisioningProfile(_ id: String) throws {
|
||||||
|
defer { print("[SideStore] removeProvisioningProfile(id) completed") }
|
||||||
|
#if targetEnvironment(simulator)
|
||||||
|
print("[SideStore] removeProvisioningProfile(id) is no-op on simulator")
|
||||||
|
#else
|
||||||
|
print("[SideStore] removeProvisioningProfile(id) invoked")
|
||||||
|
try Minimuxer.removeProvisioningProfile(id: id)
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
func removeApp(_ bundleId: String) throws {
|
func removeApp(_ bundleId: String) throws {
|
||||||
|
defer { print("[SideStore] removeApp(bundleId) completed") }
|
||||||
#if targetEnvironment(simulator)
|
#if targetEnvironment(simulator)
|
||||||
print("removeApp(\(bundleId)) is no-op on simulator")
|
print("[SideStore] removeApp(bundleId) is no-op on simulator")
|
||||||
#else
|
#else
|
||||||
try minimuxer.remove_app(bundleId)
|
print("[SideStore] removeApp(bundleId) invoked")
|
||||||
|
try Minimuxer.removeApp(bundleId: bundleId)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func yeetAppAFC(_ bundleId: String, _ rawBytes: Data) throws {
|
func yeetAppAFC(_ bundleId: String, _ rawBytes: Data) throws {
|
||||||
|
defer { print("[SideStore] yeetAppAFC(bundleId, rawBytes) completed") }
|
||||||
#if targetEnvironment(simulator)
|
#if targetEnvironment(simulator)
|
||||||
print("yeetAppAFC(\(bundleId), \(rawBytes)) is no-op on simulator")
|
print("[SideStore] yeetAppAFC(bundleId, rawBytes) is no-op on simulator")
|
||||||
#else
|
#else
|
||||||
let slice = rawBytes.toRustByteSlice()
|
print("[SideStore] yeetAppAFC(bundleId, rawBytes) invoked")
|
||||||
try minimuxer.yeet_app_afc(bundleId, slice.forRust())
|
try Minimuxer.yeetAppAfc(bundleId: bundleId, ipaBytes: rawBytes)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func installIPA(_ bundleId: String) throws {
|
func installIPA(_ bundleId: String) throws {
|
||||||
|
defer { print("[SideStore] installIPA(bundleId) completed") }
|
||||||
#if targetEnvironment(simulator)
|
#if targetEnvironment(simulator)
|
||||||
print("installIPA(\(bundleId)) is no-op on simulator")
|
print("[SideStore] installIPA(bundleId) is no-op on simulator")
|
||||||
#else
|
#else
|
||||||
try minimuxer.install_ipa(bundleId)
|
print("[SideStore] installIPA(bundleId) invoked")
|
||||||
|
try Minimuxer.installIpa(bundleId: bundleId)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func fetchUDID() -> String? {
|
func fetchUDID() -> String? {
|
||||||
|
defer { print("[SideStore] fetchUDID() completed") }
|
||||||
#if targetEnvironment(simulator)
|
#if targetEnvironment(simulator)
|
||||||
print("fetchUDID() is no-op on simulator")
|
print("[SideStore] fetchUDID() is no-op on simulator")
|
||||||
return "XXXXX-XXXX-XXXXX-XXXX"
|
return "XXXXX-XXXX-XXXXX-XXXX"
|
||||||
#else
|
#else
|
||||||
return minimuxer.fetch_udid()?.toString()
|
print("[SideStore] fetchUDID() invoked")
|
||||||
|
return Minimuxer.fetchUDID()
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func debugApp(_ appId: String) throws {
|
||||||
|
defer { print("[SideStore] debugApp(appId) completed") }
|
||||||
|
#if targetEnvironment(simulator)
|
||||||
|
print("[SideStore] debugApp(appId) is no-op on simulator")
|
||||||
|
#else
|
||||||
|
print("[SideStore] debugApp(appId) invoked")
|
||||||
|
try Minimuxer.debugApp(appId: appId)
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
func attachDebugger(_ pid: UInt32) throws {
|
||||||
|
defer { print("[SideStore] attachDebugger(pid) completed") }
|
||||||
|
#if targetEnvironment(simulator)
|
||||||
|
print("[SideStore] attachDebugger(pid) is no-op on simulator")
|
||||||
|
#else
|
||||||
|
print("[SideStore] attachDebugger(pid) invoked")
|
||||||
|
try Minimuxer.attachDebugger(pid: pid)
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
func startAutoMounter(_ docsPath: String) {
|
||||||
|
defer { print("[SideStore] startAutoMounter(docsPath) completed") }
|
||||||
|
#if targetEnvironment(simulator)
|
||||||
|
print("[SideStore] startAutoMounter(docsPath) is no-op on simulator")
|
||||||
|
#else
|
||||||
|
print("[SideStore] startAutoMounter(docsPath) invoked")
|
||||||
|
Minimuxer.startAutoMounter(docsPath: docsPath)
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
func dumpProfiles(_ docsPath: String) throws -> String {
|
||||||
|
defer { print("[SideStore] dumpProfiles(docsPath) completed") }
|
||||||
|
#if targetEnvironment(simulator)
|
||||||
|
print("[SideStore] dumpProfiles(docsPath) is no-op on simulator")
|
||||||
|
return ""
|
||||||
|
#else
|
||||||
|
print("[SideStore] dumpProfiles(docsPath) invoked")
|
||||||
|
return try Minimuxer.dumpProfiles(docsPath: docsPath)
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
func setMinimuxerDebug(_ debug: Bool) {
|
||||||
|
defer { print("[SideStore] setMinimuxerDebug(debug) completed") }
|
||||||
|
print("[SideStore] setMinimuxerDebug(debug) invoked")
|
||||||
|
Minimuxer.setDebug(debug)
|
||||||
|
}
|
||||||
|
|
||||||
extension MinimuxerError: @retroactive LocalizedError {
|
extension MinimuxerError: @retroactive LocalizedError {
|
||||||
public var failureReason: String? {
|
public var failureReason: String? {
|
||||||
@@ -100,41 +188,38 @@ extension MinimuxerError: @retroactive LocalizedError {
|
|||||||
return NSLocalizedString("Unable to connect to the device, make sure LocalDevVPN is enabled and you're connected to Wi-Fi. This could mean an invalid pairing.", comment: "")
|
return NSLocalizedString("Unable to connect to the device, make sure LocalDevVPN is enabled and you're connected to Wi-Fi. This could mean an invalid pairing.", comment: "")
|
||||||
case .PairingFile:
|
case .PairingFile:
|
||||||
return NSLocalizedString("Invalid pairing file. Your pairing file either didn't have a UDID, or it wasn't a valid plist. Please use iloader to replace it.", comment: "")
|
return NSLocalizedString("Invalid pairing file. Your pairing file either didn't have a UDID, or it wasn't a valid plist. Please use iloader to replace it.", comment: "")
|
||||||
|
|
||||||
case .CreateDebug:
|
case .CreateDebug:
|
||||||
return self.createService(name: "debug")
|
return createService(name: "debug")
|
||||||
case .LookupApps:
|
case .LookupApps:
|
||||||
return self.getFromDevice(name: "installed apps")
|
return getFromDevice(name: "installed apps")
|
||||||
case .FindApp:
|
case .FindApp:
|
||||||
return self.getFromDevice(name: "path to the app")
|
return getFromDevice(name: "path to the app")
|
||||||
case .BundlePath:
|
case .BundlePath:
|
||||||
return self.getFromDevice(name: "bundle path")
|
return getFromDevice(name: "bundle path")
|
||||||
case .MaxPacket:
|
case .MaxPacket:
|
||||||
return self.setArgument(name: "max packet")
|
return setArgument(name: "max packet")
|
||||||
case .WorkingDirectory:
|
case .WorkingDirectory:
|
||||||
return self.setArgument(name: "working directory")
|
return setArgument(name: "working directory")
|
||||||
case .Argv:
|
case .Argv:
|
||||||
return self.setArgument(name: "argv")
|
return setArgument(name: "argv")
|
||||||
case .LaunchSuccess:
|
case .LaunchSuccess:
|
||||||
return self.getFromDevice(name: "launch success")
|
return getFromDevice(name: "launch success")
|
||||||
case .Detach:
|
case .Detach:
|
||||||
return NSLocalizedString("Unable to detach from the app's process", comment: "")
|
return NSLocalizedString("Unable to detach from the app's process", comment: "")
|
||||||
case .Attach:
|
case .Attach:
|
||||||
return NSLocalizedString("Unable to attach to the app's process", comment: "")
|
return NSLocalizedString("Unable to attach to the app's process", comment: "")
|
||||||
|
|
||||||
case .CreateInstproxy:
|
case .CreateInstproxy:
|
||||||
return self.createService(name: "instproxy")
|
return createService(name: "instproxy")
|
||||||
case .CreateAfc:
|
case .CreateAfc:
|
||||||
return self.createService(name: "AFC")
|
return createService(name: "AFC")
|
||||||
case .RwAfc:
|
case .RwAfc:
|
||||||
return NSLocalizedString("AFC was unable to manage files on the device. Ensure Wi-Fi and LocalDevVPN are connected. If they both are, replace your pairing using iloader.", comment: "")
|
return NSLocalizedString("AFC was unable to manage files on the device.", comment: "")
|
||||||
case .InstallApp(let message):
|
case .InstallApp(let message):
|
||||||
return NSLocalizedString("Unable to install the app: \(message.toString())", comment: "")
|
return NSLocalizedString("Unable to install the app: \(message)", comment: "")
|
||||||
case .UninstallApp:
|
case .UninstallApp:
|
||||||
return NSLocalizedString("Unable to uninstall the app", comment: "")
|
return NSLocalizedString("Unable to uninstall the app", comment: "")
|
||||||
|
|
||||||
case .CreateMisagent:
|
case .CreateMisagent:
|
||||||
return self.createService(name: "misagent")
|
return createService(name: "misagent")
|
||||||
case .ProfileInstall:
|
case .ProfileInstall:
|
||||||
return NSLocalizedString("Unable to manage profiles on the device", comment: "")
|
return NSLocalizedString("Unable to manage profiles on the device", comment: "")
|
||||||
case .ProfileRemove:
|
case .ProfileRemove:
|
||||||
@@ -175,14 +260,14 @@ extension MinimuxerError: @retroactive LocalizedError {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fileprivate func createService(name: String) -> String {
|
fileprivate func createService(name: String) -> String {
|
||||||
return String(format: NSLocalizedString("Cannot start a %@ server on the device.", comment: ""), name)
|
String(format: NSLocalizedString("Cannot start a %@ server on the device.", comment: ""), name)
|
||||||
}
|
}
|
||||||
|
|
||||||
fileprivate func getFromDevice(name: String) -> String {
|
fileprivate func getFromDevice(name: String) -> String {
|
||||||
return String(format: NSLocalizedString("Cannot fetch %@ from the device.", comment: ""), name)
|
String(format: NSLocalizedString("Cannot fetch %@ from the device.", comment: ""), name)
|
||||||
}
|
}
|
||||||
|
|
||||||
fileprivate func setArgument(name: String) -> String {
|
fileprivate func setArgument(name: String) -> String {
|
||||||
return String(format: NSLocalizedString("Cannot set %@ on the device.", comment: ""), name)
|
String(format: NSLocalizedString("Cannot set %@ on the device.", comment: ""), name)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user