mirror of
https://github.com/SideStore/SideStore.git
synced 2026-02-20 04:03:26 +01:00
Compare commits
14 Commits
1d642e2ffa
...
nightly
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dbc20391e5 | ||
|
|
aca8193f1c | ||
|
|
fabe093b1d | ||
|
|
277b5b0bd4 | ||
|
|
e1550811eb | ||
|
|
255db2bac0 | ||
|
|
30c03aad42 | ||
|
|
d70c916222 | ||
|
|
7c038568f8 | ||
|
|
6d511de31d | ||
|
|
8730ae42c6 | ||
|
|
7d7a44bc61 | ||
|
|
639753149f | ||
|
|
cc5aeaf099 |
@@ -140,12 +140,10 @@ final class LaunchViewController: UIViewController, UIDocumentPickerDelegate {
|
|||||||
_ = file.startAccessingSecurityScopedResource()
|
_ = file.startAccessingSecurityScopedResource()
|
||||||
defer { file.stopAccessingSecurityScopedResource() }
|
defer { file.stopAccessingSecurityScopedResource() }
|
||||||
guard let accountD = try? Data(contentsOf: file) else {
|
guard let accountD = try? Data(contentsOf: file) else {
|
||||||
let toastView = ToastView(text: NSLocalizedString("Could not read data from file!", comment: ""), detailText: "\(file)")
|
return Logger.main.notice("Could not parse data from file \(file)")
|
||||||
return toastView.show(in: self)
|
|
||||||
}
|
}
|
||||||
guard let account = try? Foundation.JSONDecoder().decode(ImportedAccount.self, from: accountD) else {
|
guard let account = try? Foundation.JSONDecoder().decode(ImportedAccount.self, from: accountD) else {
|
||||||
let toastView = ToastView(text: NSLocalizedString("Could not parse data from file!", comment: ""), detailText: "\(file)")
|
return Logger.main.notice("Could not parse data from file \(file)")
|
||||||
return toastView.show(in: self)
|
|
||||||
}
|
}
|
||||||
print("We want to import this account probably: \(account)")
|
print("We want to import this account probably: \(account)")
|
||||||
if remove {
|
if remove {
|
||||||
|
|||||||
@@ -8,7 +8,6 @@
|
|||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
import UIKit
|
import UIKit
|
||||||
import SwiftUI
|
|
||||||
import UserNotifications
|
import UserNotifications
|
||||||
import MobileCoreServices
|
import MobileCoreServices
|
||||||
import Intents
|
import Intents
|
||||||
@@ -705,9 +704,37 @@ extension AppManager
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let operation = AppOperation.install(app)
|
|
||||||
self.perform([operation], presentingViewController: presentingViewController, group: group)
|
|
||||||
|
|
||||||
|
Task{
|
||||||
|
var app: AppProtocol = app
|
||||||
|
// ---- Preflight bundle ID resolution ----
|
||||||
|
if UserDefaults.shared.customizeAppId, // only show prompt when enabled by user
|
||||||
|
let presentingViewController {
|
||||||
|
let originalBundleID = app.bundleIdentifier
|
||||||
|
|
||||||
|
let resolution = await self.resolveBundleID(
|
||||||
|
initial: originalBundleID,
|
||||||
|
presentingViewController: presentingViewController
|
||||||
|
)
|
||||||
|
|
||||||
|
switch resolution {
|
||||||
|
case .cancelled:
|
||||||
|
completionHandler(.failure(OperationError.cancelled))
|
||||||
|
group.progress.cancel()
|
||||||
|
|
||||||
|
case .resolved(let newBundleID):
|
||||||
|
app = AnyApp(
|
||||||
|
name: app.name,
|
||||||
|
bundleIdentifier: newBundleID,
|
||||||
|
url: app.url,
|
||||||
|
storeApp: app.storeApp
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await self.perform([.install(app)], presentingViewController: presentingViewController, group: group)
|
||||||
|
|
||||||
|
}
|
||||||
return group
|
return group
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -732,10 +759,11 @@ extension AppManager
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let operation = AppOperation.update(appVersion)
|
assert(appVersion as AnyObject !== installedApp) // Make sure we never accidentally "update" to already installed app.
|
||||||
assert(operation.app as AnyObject !== installedApp) // Make sure we never accidentally "update" to already installed app.
|
|
||||||
|
|
||||||
self.perform([operation], presentingViewController: presentingViewController, group: group)
|
Task{
|
||||||
|
await self.perform([.update(appVersion)], presentingViewController: presentingViewController, group: group)
|
||||||
|
}
|
||||||
|
|
||||||
return group.progress
|
return group.progress
|
||||||
}
|
}
|
||||||
@@ -745,16 +773,20 @@ extension AppManager
|
|||||||
{
|
{
|
||||||
let group = group ?? RefreshGroup()
|
let group = group ?? RefreshGroup()
|
||||||
|
|
||||||
let operations = installedApps.map { AppOperation.refresh($0) }
|
Task{
|
||||||
return self.perform(operations, presentingViewController: presentingViewController, group: group)
|
await self.perform(installedApps.map { .refresh($0) }, presentingViewController: presentingViewController, group: group)
|
||||||
|
}
|
||||||
|
|
||||||
|
return group
|
||||||
}
|
}
|
||||||
|
|
||||||
func activate(_ installedApp: InstalledApp, presentingViewController: UIViewController?, completionHandler: @escaping (Result<InstalledApp, Error>) -> Void)
|
func activate(_ installedApp: InstalledApp, presentingViewController: UIViewController?, completionHandler: @escaping (Result<InstalledApp, Error>) -> Void)
|
||||||
{
|
{
|
||||||
let group = RefreshGroup()
|
let group = RefreshGroup()
|
||||||
|
|
||||||
let operation = AppOperation.activate(installedApp)
|
Task{
|
||||||
self.perform([operation], presentingViewController: presentingViewController, group: group)
|
await self.perform([.activate(installedApp)], presentingViewController: presentingViewController, group: group)
|
||||||
|
}
|
||||||
|
|
||||||
group.completionHandler = { (results) in
|
group.completionHandler = { (results) in
|
||||||
do
|
do
|
||||||
@@ -812,8 +844,9 @@ extension AppManager
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let operation = AppOperation.deactivate(installedApp)
|
Task{
|
||||||
self.perform([operation], presentingViewController: presentingViewController, group: group)
|
await self.perform([.deactivate(installedApp)], presentingViewController: presentingViewController, group: group)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -837,8 +870,9 @@ extension AppManager
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let operation = AppOperation.backup(installedApp)
|
Task{
|
||||||
self.perform([operation], presentingViewController: presentingViewController, group: group)
|
await self.perform([.backup(installedApp)], presentingViewController: presentingViewController, group: group)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func restore(_ installedApp: InstalledApp, presentingViewController: UIViewController?, completionHandler: @escaping (Result<InstalledApp, Error>) -> Void)
|
func restore(_ installedApp: InstalledApp, presentingViewController: UIViewController?, completionHandler: @escaping (Result<InstalledApp, Error>) -> Void)
|
||||||
@@ -863,8 +897,9 @@ extension AppManager
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let operation = AppOperation.restore(installedApp)
|
Task{
|
||||||
self.perform([operation], presentingViewController: presentingViewController, group: group)
|
await self.perform([.restore(installedApp)], presentingViewController: presentingViewController, group: group)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func remove(_ installedApp: InstalledApp, completionHandler: @escaping (Result<Void, Error>) -> Void)
|
func remove(_ installedApp: InstalledApp, completionHandler: @escaping (Result<Void, Error>) -> Void)
|
||||||
@@ -1091,7 +1126,7 @@ private extension AppManager
|
|||||||
}
|
}
|
||||||
|
|
||||||
@discardableResult
|
@discardableResult
|
||||||
private func perform(_ operations: [AppOperation], presentingViewController: UIViewController?, group: RefreshGroup) -> RefreshGroup
|
private func perform(_ operations: [AppOperation], presentingViewController: UIViewController?, group: RefreshGroup) async -> RefreshGroup
|
||||||
{
|
{
|
||||||
let operations = operations.filter { self.progress(for: $0) == nil || self.progress(for: $0)?.isCancelled == true }
|
let operations = operations.filter { self.progress(for: $0) == nil || self.progress(for: $0)?.isCancelled == true }
|
||||||
|
|
||||||
@@ -1153,38 +1188,10 @@ private extension AppManager
|
|||||||
|
|
||||||
case .activate(let app) where UserDefaults.standard.isLegacyDeactivationSupported: fallthrough
|
case .activate(let app) where UserDefaults.standard.isLegacyDeactivationSupported: fallthrough
|
||||||
case .refresh(let app):
|
case .refresh(let app):
|
||||||
// Check if backup app is installed in place of real app.
|
let refreshProgress = self._refresh(app, operation: operation, group: group) { (result) in
|
||||||
// let altBackupUti = UTTypeCopyDeclaration(app.installedBackupAppUTI as CFString)?.takeRetainedValue() as NSDictionary?
|
self.finish(operation, result: result, group: group, progress: progress)
|
||||||
|
}
|
||||||
// if app.certificateSerialNumber != group.context.certificate?.serialNumber ||
|
progress?.addChild(refreshProgress, withPendingUnitCount: 80)
|
||||||
// altBackupUti != nil || // why would altbackup requires reinstall? it shouldn't cause we are just renewing profiles
|
|
||||||
// app.needsResign || // why would an app require resign during refresh? it shouldn't!
|
|
||||||
// We need to reinstall ourselves on refresh to ensure the new provisioning profile is used
|
|
||||||
// => mahee96: jkcoxson confirmed misagent manages profiles independently without requiring lockdownd or installd intervention, so sidestore profile renewal shouldn't require reinstall
|
|
||||||
// app.bundleIdentifier == StoreApp.altstoreAppID
|
|
||||||
// {
|
|
||||||
// Resign app instead of just refreshing profiles because either:
|
|
||||||
// * Refreshing using different certificate // when can this happen?, lets assume, refreshing with different certificate, why not just ask user to re-install manually? (probably we need re-install button)
|
|
||||||
// * Backup app is still installed // but why? I mean the AltBackup was put in place for a reason? ie during refresh just renew appIDs don't care about the app itself.
|
|
||||||
// * App explicitly needs resigning // when can this happen?
|
|
||||||
// * Device is jailbroken and using AltDaemon on iOS 14.0 or later (b/c refreshing with provisioning profiles is broken)
|
|
||||||
|
|
||||||
// let installProgress = self._install(app, operation: operation, group: group) { (result) in
|
|
||||||
// self.finish(operation, result: result, group: group, progress: progress)
|
|
||||||
// }
|
|
||||||
// progress?.addChild(installProgress, withPendingUnitCount: 80)
|
|
||||||
// }
|
|
||||||
// else
|
|
||||||
// {
|
|
||||||
// Refreshing with same certificate as last time, and backup app isn't still installed,
|
|
||||||
// so we can just refresh provisioning profiles.
|
|
||||||
|
|
||||||
let refreshProgress = self._refresh(app, operation: operation, group: group) { (result) in
|
|
||||||
self.finish(operation, result: result, group: group, progress: progress)
|
|
||||||
}
|
|
||||||
progress?.addChild(refreshProgress, withPendingUnitCount: 80)
|
|
||||||
// }
|
|
||||||
|
|
||||||
case .activate(let app):
|
case .activate(let app):
|
||||||
let activateProgress = self._activate(app, operation: operation, group: group) { (result) in
|
let activateProgress = self._activate(app, operation: operation, group: group) { (result) in
|
||||||
self.finish(operation, result: result, group: group, progress: progress)
|
self.finish(operation, result: result, group: group, progress: progress)
|
||||||
@@ -1254,7 +1261,7 @@ private extension AppManager
|
|||||||
{
|
{
|
||||||
let progress = Progress.discreteProgress(totalUnitCount: 100)
|
let progress = Progress.discreteProgress(totalUnitCount: 100)
|
||||||
|
|
||||||
let context = context ?? InstallAppOperationContext(bundleIdentifier: app.bundleIdentifier, authenticatedContext: group.context)
|
let context = InstallAppOperationContext(bundleIdentifier: app.bundleIdentifier, authenticatedContext: group.context)
|
||||||
assert(context.authenticatedContext === group.context)
|
assert(context.authenticatedContext === group.context)
|
||||||
|
|
||||||
context.beginInstallationHandler = { (installedApp) in
|
context.beginInstallationHandler = { (installedApp) in
|
||||||
@@ -1314,7 +1321,8 @@ private extension AppManager
|
|||||||
|
|
||||||
if cacheApp
|
if cacheApp
|
||||||
{
|
{
|
||||||
try FileManager.default.copyItem(at: app.fileURL, to: InstalledApp.fileURL(for: app), shouldReplace: true)
|
let updatedApp = AnyApp(from: app, bundleId: context.bundleIdentifier)
|
||||||
|
try FileManager.default.copyItem(at: app.fileURL, to: InstalledApp.fileURL(for: updatedApp), shouldReplace: true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
@@ -1332,7 +1340,7 @@ private extension AppManager
|
|||||||
|
|
||||||
/* Verify App */
|
/* Verify App */
|
||||||
let permissionsMode = UserDefaults.shared.permissionCheckingDisabled ? .none : permissionReviewMode
|
let permissionsMode = UserDefaults.shared.permissionCheckingDisabled ? .none : permissionReviewMode
|
||||||
let verifyOperation = VerifyAppOperation(permissionsMode: permissionsMode, context: context)
|
let verifyOperation = VerifyAppOperation(permissionsMode: permissionsMode, context: context, customBundleId: app.bundleIdentifier)
|
||||||
verifyOperation.resultHandler = { (result) in
|
verifyOperation.resultHandler = { (result) in
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
@@ -1485,7 +1493,7 @@ private extension AppManager
|
|||||||
let patchAppURL = URL(string: patchAppLink)
|
let patchAppURL = URL(string: patchAppLink)
|
||||||
else { throw OperationError.invalidApp }
|
else { throw OperationError.invalidApp }
|
||||||
|
|
||||||
let patchApp = AnyApp(name: app.name, bundleIdentifier: app.bundleIdentifier, url: patchAppURL, storeApp: nil)
|
let patchApp = AnyApp(name: app.name, bundleIdentifier: context.bundleIdentifier, url: patchAppURL, storeApp: nil)
|
||||||
|
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
let storyboard = UIStoryboard(name: "PatchApp", bundle: nil)
|
let storyboard = UIStoryboard(name: "PatchApp", bundle: nil)
|
||||||
@@ -2302,3 +2310,123 @@ private extension AppManager
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private enum BundleIDAlertKeys {
|
||||||
|
static var okAction: UInt8 = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
private func _isValidBundleID(_ value: String) -> Bool {
|
||||||
|
let pattern = #"^[A-Za-z][A-Za-z0-9\-]*(\.[A-Za-z0-9\-]+)+$"#
|
||||||
|
return value.range(of: pattern, options: .regularExpression) != nil
|
||||||
|
}
|
||||||
|
|
||||||
|
private extension UIResponder {
|
||||||
|
@objc func _validateBundleIDText(_ sender: UITextField) {
|
||||||
|
let isValid = sender.text.map(_isValidBundleID) ?? false
|
||||||
|
|
||||||
|
sender.backgroundColor =
|
||||||
|
isValid || sender.text?.isEmpty == true
|
||||||
|
? .clear
|
||||||
|
: UIColor.systemRed.withAlphaComponent(0.2)
|
||||||
|
|
||||||
|
if
|
||||||
|
let alert = sender.superview?.superview as? UIAlertController,
|
||||||
|
let okAction = objc_getAssociatedObject(alert, &BundleIDAlertKeys.okAction) as? UIAlertAction
|
||||||
|
{
|
||||||
|
okAction.isEnabled = isValid
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private extension AppManager {
|
||||||
|
|
||||||
|
func _presentBundleIDOverrideDialog(
|
||||||
|
bundleIdentifier: String,
|
||||||
|
presentingViewController: UIViewController,
|
||||||
|
completion: @escaping (BundleIDResolution) -> Void
|
||||||
|
) {
|
||||||
|
let alert = self._makeBundleIDOverrideAlert(
|
||||||
|
initialBundleID: bundleIdentifier,
|
||||||
|
completion: completion
|
||||||
|
)
|
||||||
|
|
||||||
|
presentingViewController.present(alert, animated: true)
|
||||||
|
}
|
||||||
|
|
||||||
|
func _makeBundleIDOverrideAlert(
|
||||||
|
initialBundleID: String,
|
||||||
|
completion: @escaping (BundleIDResolution) -> Void
|
||||||
|
) -> UIAlertController {
|
||||||
|
|
||||||
|
let alert = UIAlertController(
|
||||||
|
title: NSLocalizedString("Override Bundle Identifier", comment: ""),
|
||||||
|
message: nil,
|
||||||
|
preferredStyle: .alert
|
||||||
|
)
|
||||||
|
|
||||||
|
var okAction: UIAlertAction!
|
||||||
|
|
||||||
|
alert.addTextField { textField in
|
||||||
|
textField.text = initialBundleID
|
||||||
|
textField.autocapitalizationType = .none
|
||||||
|
textField.autocorrectionType = .no
|
||||||
|
textField.addTarget(
|
||||||
|
nil,
|
||||||
|
action: #selector(UIResponder._validateBundleIDText(_:)),
|
||||||
|
for: .editingChanged
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
okAction = UIAlertAction(title: NSLocalizedString("OK", comment: ""), style: .default) { _ in
|
||||||
|
completion(.resolved(alert.textFields?.first?.text ?? initialBundleID))
|
||||||
|
}
|
||||||
|
|
||||||
|
okAction.isEnabled = _isValidBundleID(initialBundleID)
|
||||||
|
|
||||||
|
let cancelAction = UIAlertAction(title: NSLocalizedString("Cancel", comment: ""), style: .cancel) { _ in
|
||||||
|
completion(.cancelled)
|
||||||
|
}
|
||||||
|
|
||||||
|
alert.addAction(cancelAction)
|
||||||
|
alert.addAction(okAction)
|
||||||
|
|
||||||
|
objc_setAssociatedObject(
|
||||||
|
alert,
|
||||||
|
&BundleIDAlertKeys.okAction,
|
||||||
|
okAction,
|
||||||
|
.OBJC_ASSOCIATION_ASSIGN
|
||||||
|
)
|
||||||
|
|
||||||
|
return alert
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ---- Part 1: Add async resolver ----
|
||||||
|
|
||||||
|
private extension AppManager {
|
||||||
|
|
||||||
|
enum BundleIDResolution {
|
||||||
|
case resolved(String)
|
||||||
|
case cancelled
|
||||||
|
}
|
||||||
|
|
||||||
|
@MainActor
|
||||||
|
func resolveBundleID(
|
||||||
|
initial: String,
|
||||||
|
presentingViewController: UIViewController
|
||||||
|
) async -> BundleIDResolution {
|
||||||
|
|
||||||
|
await withCheckedContinuation { continuation in
|
||||||
|
let alert = self._makeBundleIDOverrideAlert(
|
||||||
|
initialBundleID: initial
|
||||||
|
) { result in
|
||||||
|
continuation.resume(returning: result)
|
||||||
|
}
|
||||||
|
|
||||||
|
presentingViewController.present(alert, animated: true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -85,70 +85,86 @@ final class AuthenticationOperation: ResultOperation<(ALTTeam, ALTCertificate, A
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sign In
|
Task {
|
||||||
self.signIn() { (result) in
|
// try to use cached session
|
||||||
guard !self.isCancelled else { return self.finish(.failure(OperationError.cancelled)) }
|
if
|
||||||
|
let certificate = Keychain.shared.certificate,
|
||||||
switch result
|
let session = Keychain.shared.session,
|
||||||
|
let team = Keychain.shared.team
|
||||||
{
|
{
|
||||||
case .failure(let error): self.finish(.failure(error))
|
if session.anisetteData.date.timeIntervalSinceNow < -40.0 {
|
||||||
case .success((let account, let session)):
|
let anisetteData = try await withUnsafeThrowingContinuation { (c: UnsafeContinuation<ALTAnisetteData, any Error>) in
|
||||||
self.context.session = session
|
let fetchAnisetteDataOperation = FetchAnisetteDataOperation(context: self.context)
|
||||||
self.progress.completedUnitCount += 1
|
fetchAnisetteDataOperation.resultHandler = { (result) in
|
||||||
|
c.resume(with: result)
|
||||||
// Fetch Team
|
|
||||||
self.fetchTeam(for: account, session: session) { (result) in
|
|
||||||
guard !self.isCancelled else { return self.finish(.failure(OperationError.cancelled)) }
|
|
||||||
|
|
||||||
switch result
|
|
||||||
{
|
|
||||||
case .failure(let error): self.finish(.failure(error))
|
|
||||||
case .success(let team):
|
|
||||||
self.context.team = team
|
|
||||||
self.progress.completedUnitCount += 1
|
|
||||||
|
|
||||||
// Fetch Certificate
|
|
||||||
self.fetchCertificate(for: team, session: session) { (result) in
|
|
||||||
guard !self.isCancelled else { return self.finish(.failure(OperationError.cancelled)) }
|
|
||||||
|
|
||||||
switch result
|
|
||||||
{
|
|
||||||
case .failure(let error): self.finish(.failure(error))
|
|
||||||
case .success(let certificate):
|
|
||||||
self.context.certificate = certificate
|
|
||||||
self.progress.completedUnitCount += 1
|
|
||||||
|
|
||||||
// Register Device
|
|
||||||
self.registerCurrentDevice(for: team, session: session) { (result) in
|
|
||||||
guard !self.isCancelled else { return self.finish(.failure(OperationError.cancelled)) }
|
|
||||||
|
|
||||||
switch result
|
|
||||||
{
|
|
||||||
case .failure(let error): self.finish(.failure(error))
|
|
||||||
case .success:
|
|
||||||
self.progress.completedUnitCount += 1
|
|
||||||
|
|
||||||
// Save account/team to disk.
|
|
||||||
self.save(team) { (result) in
|
|
||||||
guard !self.isCancelled else { return self.finish(.failure(OperationError.cancelled)) }
|
|
||||||
|
|
||||||
switch result
|
|
||||||
{
|
|
||||||
case .failure(let error): self.finish(.failure(error))
|
|
||||||
case .success:
|
|
||||||
// Must cache App IDs _after_ saving account/team to disk.
|
|
||||||
self.cacheAppIDs(team: team, session: session) { (result) in
|
|
||||||
let result = result.map { _ in (team, certificate, session) }
|
|
||||||
self.finish(result)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
self.operationQueue.addOperation(fetchAnisetteDataOperation)
|
||||||
|
}
|
||||||
|
session.anisetteData = anisetteData
|
||||||
|
}
|
||||||
|
self.context.team = team
|
||||||
|
self.context.session = session
|
||||||
|
self.context.certificate = certificate
|
||||||
|
self.finish(.success((team, certificate, session)))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// new login
|
||||||
|
do {
|
||||||
|
let (account, session) = try await withUnsafeThrowingContinuation { c in
|
||||||
|
self.signIn() { (result) in
|
||||||
|
c.resume(with: result)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
self.context.session = session
|
||||||
|
self.progress.completedUnitCount += 1
|
||||||
|
guard !self.isCancelled else { return self.finish(.failure(OperationError.cancelled)) }
|
||||||
|
|
||||||
|
let team = try await withUnsafeThrowingContinuation { c in
|
||||||
|
self.fetchTeam(for: account, session: session) { (result) in
|
||||||
|
c.resume(with: result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
self.context.team = team
|
||||||
|
self.progress.completedUnitCount += 1
|
||||||
|
guard !self.isCancelled else { return self.finish(.failure(OperationError.cancelled)) }
|
||||||
|
|
||||||
|
let certificate = try await withUnsafeThrowingContinuation { c in
|
||||||
|
self.fetchCertificate(for: team, session: session) { (result) in
|
||||||
|
c.resume(with: result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
self.context.certificate = certificate
|
||||||
|
self.progress.completedUnitCount += 1
|
||||||
|
guard !self.isCancelled else { return self.finish(.failure(OperationError.cancelled)) }
|
||||||
|
|
||||||
|
let _ = try await withUnsafeThrowingContinuation { c in
|
||||||
|
self.registerCurrentDevice(for: team, session: session) { (result) in
|
||||||
|
c.resume(with: result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
self.progress.completedUnitCount += 1
|
||||||
|
guard !self.isCancelled else { return self.finish(.failure(OperationError.cancelled)) }
|
||||||
|
|
||||||
|
try await withUnsafeThrowingContinuation { c in
|
||||||
|
self.save(team) { (result) in
|
||||||
|
c.resume(with: result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
guard !self.isCancelled else { return self.finish(.failure(OperationError.cancelled)) }
|
||||||
|
|
||||||
|
try await withUnsafeThrowingContinuation { c in
|
||||||
|
self.cacheAppIDs(team: team, session: session) { (result) in
|
||||||
|
c.resume(with: result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Keychain.shared.team = team
|
||||||
|
Keychain.shared.certificate = certificate
|
||||||
|
Keychain.shared.session = session
|
||||||
|
self.finish(.success((team, certificate, session)))
|
||||||
|
|
||||||
|
} catch {
|
||||||
|
self.finish(.failure(error))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -359,6 +375,29 @@ private extension AuthenticationOperation
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let adsid = Keychain.shared.appleIDAdsid, let xcodeToken = Keychain.shared.appleIDXcodeToken {
|
||||||
|
Logger.sideload.notice("Authenticating Apple ID with tokens...")
|
||||||
|
let semaphore = DispatchSemaphore(value: 0)
|
||||||
|
var shouldContinue = true
|
||||||
|
Task {
|
||||||
|
defer {
|
||||||
|
semaphore.signal()
|
||||||
|
}
|
||||||
|
do {
|
||||||
|
let (account, session) = try await self.authenticateWithToken(adsid: adsid, xcodeToken: xcodeToken)
|
||||||
|
completionHandler(.success((account, session)))
|
||||||
|
shouldContinue = false
|
||||||
|
} catch {
|
||||||
|
Logger.sideload.notice("Authentication failed with token. Fall back to email and password login: \(error)")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
semaphore.wait()
|
||||||
|
if !shouldContinue {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if let appleID = Keychain.shared.appleIDEmailAddress, let password = Keychain.shared.appleIDPassword
|
if let appleID = Keychain.shared.appleIDEmailAddress, let password = Keychain.shared.appleIDPassword
|
||||||
{
|
{
|
||||||
Logger.sideload.notice("Authenticating Apple ID...")
|
Logger.sideload.notice("Authenticating Apple ID...")
|
||||||
@@ -384,6 +423,25 @@ private extension AuthenticationOperation
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func authenticateWithToken(adsid: String, xcodeToken: String) async throws -> (ALTAccount, ALTAppleAPISession) {
|
||||||
|
let anisetteData = try await withUnsafeThrowingContinuation { (c: UnsafeContinuation<ALTAnisetteData, any Error>) in
|
||||||
|
let fetchAnisetteDataOperation = FetchAnisetteDataOperation(context: self.context)
|
||||||
|
fetchAnisetteDataOperation.resultHandler = { (result) in
|
||||||
|
c.resume(with: result)
|
||||||
|
}
|
||||||
|
self.operationQueue.addOperation(fetchAnisetteDataOperation)
|
||||||
|
}
|
||||||
|
|
||||||
|
let session = ALTAppleAPISession(dsid: adsid, authToken: xcodeToken, anisetteData: anisetteData)
|
||||||
|
let account = try await withUnsafeThrowingContinuation { (c: UnsafeContinuation<ALTAccount, any Error>) in
|
||||||
|
ALTAppleAPI.shared.fetchAccount2(session: session) { result in
|
||||||
|
c.resume(with: result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (account, session)
|
||||||
|
}
|
||||||
|
|
||||||
func authenticate(appleID: String, password: String, completionHandler: @escaping (Result<(ALTAccount, ALTAppleAPISession), Swift.Error>) -> Void)
|
func authenticate(appleID: String, password: String, completionHandler: @escaping (Result<(ALTAccount, ALTAppleAPISession), Swift.Error>) -> Void)
|
||||||
{
|
{
|
||||||
self.appleIDEmailAddress = appleID
|
self.appleIDEmailAddress = appleID
|
||||||
@@ -444,6 +502,8 @@ private extension AuthenticationOperation
|
|||||||
verificationHandler: verificationHandler) { (account, session, error) in
|
verificationHandler: verificationHandler) { (account, session, error) in
|
||||||
if let account = account, let session = session
|
if let account = account, let session = session
|
||||||
{
|
{
|
||||||
|
Keychain.shared.appleIDAdsid = session.dsid
|
||||||
|
Keychain.shared.appleIDXcodeToken = session.authToken
|
||||||
completionHandler(.success((account, session)))
|
completionHandler(.success((account, session)))
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -747,3 +807,30 @@ extension AuthenticationOperation
|
|||||||
self.submitCodeAction?.isEnabled = (textField.text ?? "").count == 6
|
self.submitCodeAction?.isEnabled = (textField.text ?? "").count == 6
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
extension ALTAppleAPI {
|
||||||
|
func fetchAccount2(session: ALTAppleAPISession, completionHandler: @escaping (Result<ALTAccount, Error>) -> Void)
|
||||||
|
{
|
||||||
|
let url = URL(string: "viewDeveloper.action", relativeTo: self.baseURL)!
|
||||||
|
|
||||||
|
self.sendRequest(with: url, additionalParameters: nil, session: session, team: nil) { (responseDictionary, requestError) in
|
||||||
|
do
|
||||||
|
{
|
||||||
|
guard let responseDictionary = responseDictionary else { throw requestError ?? ALTAppleAPIError.unknown() }
|
||||||
|
|
||||||
|
guard let account = try self.processResponse(responseDictionary, parseHandler: { () -> Any? in
|
||||||
|
guard let dictionary = responseDictionary["developer"] as? [String: Any] else { return nil }
|
||||||
|
let account = ALTAccount(responseDictionary: dictionary)
|
||||||
|
return account
|
||||||
|
}, resultCodeHandler: nil) as? ALTAccount else {
|
||||||
|
throw ALTAppleAPIError.unknown()
|
||||||
|
}
|
||||||
|
|
||||||
|
completionHandler(.success(account))
|
||||||
|
} catch {
|
||||||
|
completionHandler(.failure(error))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ final class DownloadAppOperation: ResultOperation<ALTApplication>
|
|||||||
self.context = context
|
self.context = context
|
||||||
|
|
||||||
self.appName = app.name
|
self.appName = app.name
|
||||||
self.bundleIdentifier = app.bundleIdentifier
|
self.bundleIdentifier = context.bundleIdentifier
|
||||||
self.sourceURL = app.url
|
self.sourceURL = app.url
|
||||||
self.destinationURL = destinationURL
|
self.destinationURL = destinationURL
|
||||||
|
|
||||||
@@ -77,7 +77,7 @@ final class DownloadAppOperation: ResultOperation<ALTApplication>
|
|||||||
guard let latestVersion = storeApp.latestAvailableVersion else {
|
guard let latestVersion = storeApp.latestAvailableVersion else {
|
||||||
let failureReason = String(format: NSLocalizedString("The latest version of %@ could not be determined.", comment: ""), self.appName)
|
let failureReason = String(format: NSLocalizedString("The latest version of %@ could not be determined.", comment: ""), self.appName)
|
||||||
throw OperationError.unknown(failureReason: failureReason)
|
throw OperationError.unknown(failureReason: failureReason)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Attempt to download latest _available_ version, and fall back to older versions if necessary.
|
// Attempt to download latest _available_ version, and fall back to older versions if necessary.
|
||||||
appVersion = latestVersion
|
appVersion = latestVersion
|
||||||
|
|||||||
@@ -198,7 +198,7 @@ final class FetchAnisetteDataOperation: ResultOperation<ALTAnisetteData>, WebSoc
|
|||||||
let formatter = DateFormatter()
|
let formatter = DateFormatter()
|
||||||
formatter.locale = Locale(identifier: "en_US_POSIX")
|
formatter.locale = Locale(identifier: "en_US_POSIX")
|
||||||
formatter.calendar = Calendar(identifier: .gregorian)
|
formatter.calendar = Calendar(identifier: .gregorian)
|
||||||
formatter.timeZone = TimeZone.current
|
formatter.timeZone = TimeZone.init(secondsFromGMT: 0)
|
||||||
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss'Z'"
|
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss'Z'"
|
||||||
let dateString = formatter.string(from: Date())
|
let dateString = formatter.string(from: Date())
|
||||||
formattedJSON["date"] = dateString
|
formattedJSON["date"] = dateString
|
||||||
|
|||||||
@@ -54,6 +54,7 @@ class FetchProvisioningProfilesOperation: ResultOperation<[String: ALTProvisioni
|
|||||||
Logger.sideload.notice("Fetching provisioning profiles for app \(self.context.bundleIdentifier, privacy: .public)...")
|
Logger.sideload.notice("Fetching provisioning profiles for app \(self.context.bundleIdentifier, privacy: .public)...")
|
||||||
|
|
||||||
self.progress.totalUnitCount = Int64(1 + app.appExtensions.count)
|
self.progress.totalUnitCount = Int64(1 + app.appExtensions.count)
|
||||||
|
let effectiveBundleId = self.context.bundleIdentifier
|
||||||
|
|
||||||
self.prepareProvisioningProfile(for: app, parentApp: nil, team: team, session: session) { (result) in
|
self.prepareProvisioningProfile(for: app, parentApp: nil, team: team, session: session) { (result) in
|
||||||
do
|
do
|
||||||
@@ -62,7 +63,7 @@ class FetchProvisioningProfilesOperation: ResultOperation<[String: ALTProvisioni
|
|||||||
|
|
||||||
let profile = try result.get()
|
let profile = try result.get()
|
||||||
|
|
||||||
var profiles = [app.bundleIdentifier: profile]
|
var profiles = [effectiveBundleId: profile]
|
||||||
var error: Error?
|
var error: Error?
|
||||||
|
|
||||||
let dispatchGroup = DispatchGroup()
|
let dispatchGroup = DispatchGroup()
|
||||||
@@ -220,19 +221,30 @@ extension FetchProvisioningProfilesOperation
|
|||||||
// Or, if the app _is_ installed but with a different team, we need to create a new
|
// Or, if the app _is_ installed but with a different team, we need to create a new
|
||||||
// bundle identifier anyway to prevent collisions with the previous team.
|
// bundle identifier anyway to prevent collisions with the previous team.
|
||||||
let parentBundleID = parentApp?.bundleIdentifier ?? app.bundleIdentifier
|
let parentBundleID = parentApp?.bundleIdentifier ?? app.bundleIdentifier
|
||||||
|
let effectiveParentBundleID = self.context.bundleIdentifier
|
||||||
|
|
||||||
let updatedParentBundleID: String
|
let updatedParentBundleID: String
|
||||||
|
|
||||||
if app.isAltStoreApp
|
if app.isAltStoreApp
|
||||||
{
|
{
|
||||||
// Use legacy bundle ID format for AltStore (and its extensions).
|
// Use legacy bundle ID format for AltStore (and its extensions).
|
||||||
updatedParentBundleID = parentBundleID + "." + team.identifier // Append just team identifier to make it harder to track.
|
updatedParentBundleID = effectiveParentBundleID + "." + team.identifier // Append just team identifier to make it harder to track.
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
updatedParentBundleID = parentBundleID + "." + team.identifier // Append just team identifier to make it harder to track.
|
updatedParentBundleID = effectiveParentBundleID + "." + team.identifier // Append just team identifier to make it harder to track.
|
||||||
}
|
}
|
||||||
|
|
||||||
bundleID = app.bundleIdentifier.replacingOccurrences(of: parentBundleID, with: updatedParentBundleID)
|
if let parentApp = parentApp,
|
||||||
|
app.bundleIdentifier.hasPrefix(parentBundleID + ".")
|
||||||
|
{
|
||||||
|
let suffix = String(app.bundleIdentifier.dropFirst(parentBundleID.count))
|
||||||
|
bundleID = updatedParentBundleID + suffix
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
bundleID = updatedParentBundleID
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let preferredName: String
|
let preferredName: String
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ final class ResignAppOperation: ResultOperation<ALTApplication>
|
|||||||
let prepareAppProgress = Progress.discreteProgress(totalUnitCount: 2)
|
let prepareAppProgress = Progress.discreteProgress(totalUnitCount: 2)
|
||||||
self.progress.addChild(prepareAppProgress, withPendingUnitCount: 3)
|
self.progress.addChild(prepareAppProgress, withPendingUnitCount: 3)
|
||||||
|
|
||||||
|
let effectiveBundleId = self.context.bundleIdentifier
|
||||||
let prepareAppBundleProgress = self.prepareAppBundle(for: app, profiles: profiles, appexBundleIds: context.appexBundleIds ?? [:]) { (result) in
|
let prepareAppBundleProgress = self.prepareAppBundle(for: app, profiles: profiles, appexBundleIds: context.appexBundleIds ?? [:]) { (result) in
|
||||||
guard let appBundleURL = self.process(result) else { return }
|
guard let appBundleURL = self.process(result) else { return }
|
||||||
|
|
||||||
@@ -65,7 +66,13 @@ final class ResignAppOperation: ResultOperation<ALTApplication>
|
|||||||
// Finish
|
// Finish
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
let destinationURL = InstalledApp.refreshedIPAURL(for: app)
|
let updatedApp = AnyApp(
|
||||||
|
name: app.name,
|
||||||
|
bundleIdentifier: effectiveBundleId,
|
||||||
|
url: app.fileURL,
|
||||||
|
storeApp: app.storeApp
|
||||||
|
)
|
||||||
|
let destinationURL = InstalledApp.refreshedIPAURL(for: updatedApp)
|
||||||
try FileManager.default.copyItem(at: resignedURL, to: destinationURL, shouldReplace: true)
|
try FileManager.default.copyItem(at: resignedURL, to: destinationURL, shouldReplace: true)
|
||||||
print("Successfully resigned app to \(destinationURL.absoluteString)")
|
print("Successfully resigned app to \(destinationURL.absoluteString)")
|
||||||
|
|
||||||
@@ -111,14 +118,12 @@ private extension ResignAppOperation
|
|||||||
{
|
{
|
||||||
let progress = Progress.discreteProgress(totalUnitCount: 1)
|
let progress = Progress.discreteProgress(totalUnitCount: 1)
|
||||||
|
|
||||||
let bundleIdentifier = app.bundleIdentifier
|
|
||||||
let openURL = InstalledApp.openAppURL(for: app)
|
let openURL = InstalledApp.openAppURL(for: app)
|
||||||
|
|
||||||
let fileURL = app.fileURL
|
let fileURL = app.fileURL
|
||||||
|
let identifier = context.bundleIdentifier
|
||||||
|
|
||||||
func prepare(_ bundle: Bundle, additionalInfoDictionaryValues: [String: Any] = [:]) throws
|
func prepare(_ bundle: Bundle, additionalInfoDictionaryValues: [String: Any] = [:]) throws
|
||||||
{
|
{
|
||||||
guard let identifier = bundle.bundleIdentifier else { throw ALTError(.missingAppBundle) }
|
|
||||||
guard let profile = context.useMainProfile ? profiles.values.first : profiles[identifier] else { throw ALTError(.missingProvisioningProfile) }
|
guard let profile = context.useMainProfile ? profiles.values.first : profiles[identifier] else { throw ALTError(.missingProvisioningProfile) }
|
||||||
guard var infoDictionary = bundle.completeInfoDictionary else { throw ALTError(.missingInfoPlist) }
|
guard var infoDictionary = bundle.completeInfoDictionary else { throw ALTError(.missingInfoPlist) }
|
||||||
|
|
||||||
@@ -189,7 +194,7 @@ private extension ResignAppOperation
|
|||||||
var allURLSchemes = infoDictionary[Bundle.Info.urlTypes] as? [[String: Any]] ?? []
|
var allURLSchemes = infoDictionary[Bundle.Info.urlTypes] as? [[String: Any]] ?? []
|
||||||
|
|
||||||
let altstoreURLScheme = ["CFBundleTypeRole": "Editor",
|
let altstoreURLScheme = ["CFBundleTypeRole": "Editor",
|
||||||
"CFBundleURLName": bundleIdentifier,
|
"CFBundleURLName": identifier,
|
||||||
"CFBundleURLSchemes": [openURL.scheme!]] as [String : Any]
|
"CFBundleURLSchemes": [openURL.scheme!]] as [String : Any]
|
||||||
allURLSchemes.append(altstoreURLScheme)
|
allURLSchemes.append(altstoreURLScheme)
|
||||||
|
|
||||||
@@ -198,7 +203,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 = fetch_udid()?.toString() as? String else { throw OperationError.unknownUDID }
|
||||||
guard let pairingFileString = Bundle.main.object(forInfoDictionaryKey: Bundle.Info.devicePairingString) as? 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
|
||||||
additionalValues[Bundle.Info.serverID] = UserDefaults.standard.preferredServerID
|
additionalValues[Bundle.Info.serverID] = UserDefaults.standard.preferredServerID
|
||||||
|
|||||||
@@ -38,11 +38,13 @@ final class VerifyAppOperation: ResultOperation<Void>
|
|||||||
{
|
{
|
||||||
let permissionsMode: PermissionReviewMode
|
let permissionsMode: PermissionReviewMode
|
||||||
let context: InstallAppOperationContext
|
let context: InstallAppOperationContext
|
||||||
|
var customBundleId: String?
|
||||||
|
|
||||||
init(permissionsMode: PermissionReviewMode, context: InstallAppOperationContext)
|
init(permissionsMode: PermissionReviewMode, context: InstallAppOperationContext, customBundleId: String? = nil)
|
||||||
{
|
{
|
||||||
self.permissionsMode = permissionsMode
|
self.permissionsMode = permissionsMode
|
||||||
self.context = context
|
self.context = context
|
||||||
|
self.customBundleId = customBundleId
|
||||||
|
|
||||||
super.init()
|
super.init()
|
||||||
}
|
}
|
||||||
@@ -65,7 +67,8 @@ final class VerifyAppOperation: ResultOperation<Void>
|
|||||||
}
|
}
|
||||||
|
|
||||||
if !["ny.litritt.ignited", "com.litritt.ignited"].contains(where: { $0 == app.bundleIdentifier }) {
|
if !["ny.litritt.ignited", "com.litritt.ignited"].contains(where: { $0 == app.bundleIdentifier }) {
|
||||||
guard app.bundleIdentifier == self.context.bundleIdentifier else {
|
let bundleId = customBundleId ?? app.bundleIdentifier
|
||||||
|
guard bundleId == self.context.bundleIdentifier else {
|
||||||
throw VerificationError.mismatchedBundleIdentifiers(sourceBundleID: self.context.bundleIdentifier, app: app)
|
throw VerificationError.mismatchedBundleIdentifiers(sourceBundleID: self.context.bundleIdentifier, app: app)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="24412" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="5Rz-4h-jJ8">
|
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="24506" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="5Rz-4h-jJ8">
|
||||||
<device id="retina6_3" orientation="portrait" appearance="light"/>
|
<device id="retina6_3" orientation="portrait" appearance="light"/>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<deployment identifier="iOS"/>
|
<deployment identifier="iOS"/>
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="24405"/>
|
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="24504"/>
|
||||||
<capability name="Image references" minToolsVersion="12.0"/>
|
<capability name="Image references" minToolsVersion="12.0"/>
|
||||||
<capability name="Named colors" minToolsVersion="9.0"/>
|
<capability name="Named colors" minToolsVersion="9.0"/>
|
||||||
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
||||||
@@ -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="2352.3333301544189" width="402" height="125"/>
|
<rect key="frame" x="0.0" y="2382.6666622161865" 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,13 +494,13 @@
|
|||||||
<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" text="How it works" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="2CC-iw-3bd">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="How it works" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="2CC-iw-3bd">
|
||||||
<rect key="frame" x="30" y="15.333333333333334" width="105" height="20.333333333333329"/>
|
<rect key="frame" x="30" y="15.333333333333334" width="105" 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" translatesAutoresizingMaskIntoConstraints="NO" id="WtV-Dt-sDn">
|
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" translatesAutoresizingMaskIntoConstraints="NO" id="WtV-Dt-sDn">
|
||||||
<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>
|
||||||
@@ -529,19 +529,19 @@
|
|||||||
<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="844.66666412353516" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="844.99999809265137" 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"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="View Error Log" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="vH6-7i-tCE">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="View Error Log" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="vH6-7i-tCE">
|
||||||
<rect key="frame" x="30" y="15.333333333333334" width="119" height="20.333333333333329"/>
|
<rect key="frame" x="30" y="15.333333333333334" width="119" 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" translatesAutoresizingMaskIntoConstraints="NO" id="AeT-qF-bwB">
|
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" translatesAutoresizingMaskIntoConstraints="NO" id="AeT-qF-bwB">
|
||||||
<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>
|
||||||
@@ -566,7 +566,7 @@
|
|||||||
</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="895.66666412353516" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="895.99999809265137" 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"/>
|
||||||
@@ -598,7 +598,7 @@
|
|||||||
<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="982.33333015441895" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="982.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="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"/>
|
||||||
@@ -643,29 +643,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="1033.3333301544189" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="1033.6666641235352" 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>
|
||||||
@@ -688,29 +688,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="1084.3333301544189" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="1084.6666641235352" 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="121" y="-1" width="15.666666666666629" 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>
|
||||||
@@ -733,19 +733,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="1135.3333301544189" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="1135.6666641235352" 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>
|
||||||
@@ -774,19 +774,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="1221.9999961853027" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="1222.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="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>
|
||||||
@@ -808,19 +808,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="1272.9999961853027" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="1273.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="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>
|
||||||
@@ -845,19 +845,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="1323.9999961853027" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="1324.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="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>
|
||||||
@@ -879,19 +879,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="1374.9999961853027" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="1375.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="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>
|
||||||
@@ -913,19 +913,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="1425.9999961853027" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="1426.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="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>
|
||||||
@@ -946,20 +946,55 @@
|
|||||||
<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="q6e-PG-mTq" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
|
<rect key="frame" x="0.0" y="1477.3333301544189" width="402" height="51"/>
|
||||||
|
<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">
|
||||||
|
<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="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"/>
|
||||||
|
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
||||||
|
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
|
<nil key="highlightedColor"/>
|
||||||
|
</label>
|
||||||
|
<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"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="toggleEnableAppIdCustomization:" destination="aMk-Xp-UL8" eventType="valueChanged" id="gtP-5M-9Ms"/>
|
||||||
|
</connections>
|
||||||
|
</switch>
|
||||||
|
</subviews>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstItem="Fq4-2u-Lgd" firstAttribute="centerY" secondItem="PRJ-Ed-P86" secondAttribute="centerY" id="4dM-eV-6Bh"/>
|
||||||
|
<constraint firstItem="Fq4-2u-Lgd" firstAttribute="leading" secondItem="PRJ-Ed-P86" secondAttribute="leadingMargin" id="Pd8-US-Y4U"/>
|
||||||
|
<constraint firstAttribute="trailingMargin" secondItem="fXx-wl-F5H" secondAttribute="trailing" id="ZU9-iK-2ox"/>
|
||||||
|
<constraint firstItem="fXx-wl-F5H" firstAttribute="centerY" secondItem="PRJ-Ed-P86" secondAttribute="centerY" id="fhs-rv-x3J"/>
|
||||||
|
</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>
|
||||||
|
</userDefinedRuntimeAttributes>
|
||||||
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="XW5-Zc-nXH" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="XW5-Zc-nXH" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="1476.9999961853027" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="1528.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="XW5-Zc-nXH" id="AtM-bL-8pS">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="XW5-Zc-nXH" id="AtM-bL-8pS">
|
||||||
<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="2px-HD-0UT">
|
<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="2px-HD-0UT">
|
||||||
<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="e32-w4-5fk">
|
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="e32-w4-5fk">
|
||||||
<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="uxG-df-7GK"/>
|
<action selector="toggleEnableBetaUpdates:" destination="aMk-Xp-UL8" eventType="valueChanged" id="uxG-df-7GK"/>
|
||||||
@@ -982,19 +1017,19 @@
|
|||||||
</userDefinedRuntimeAttributes>
|
</userDefinedRuntimeAttributes>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="qbY-8c-LYT" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="qbY-8c-LYT" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="1527.9999961853027" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="1579.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="qbY-8c-LYT" id="NxK-qB-w7Q">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="qbY-8c-LYT" id="NxK-qB-w7Q">
|
||||||
<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="5J9-vR-vhX" 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="5J9-vR-vhX" 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="Oct-iT-NwP" 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="Oct-iT-NwP" 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="new-width-constraint"/>
|
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="50" id="new-width-constraint"/>
|
||||||
@@ -1023,13 +1058,13 @@
|
|||||||
<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="1614.9999961853027" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="1666.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="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"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Import Account..." textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="jts-UA-M8d">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Import Account..." textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="jts-UA-M8d">
|
||||||
<rect key="frame" x="30" y="15.333333333333334" width="143" height="20.333333333333329"/>
|
<rect key="frame" x="30" y="15.333333333333334" width="143" 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"/>
|
||||||
@@ -1051,13 +1086,13 @@
|
|||||||
</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="1665.9999961853027" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="1717.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="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"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Export Account..." textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="uHg-iq-d36">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Export Account..." textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="uHg-iq-d36">
|
||||||
<rect key="frame" x="30" y="15.333333333333334" width="142.33333333333334" height="20.333333333333329"/>
|
<rect key="frame" x="30" y="15.333333333333334" width="142.33333333333334" 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"/>
|
||||||
@@ -1079,13 +1114,13 @@
|
|||||||
</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="1716.9999961853027" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="1767.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="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"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Import Signing Certificate..." textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="rv6-S1-2gw">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Import Signing Certificate..." textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="rv6-S1-2gw">
|
||||||
<rect key="frame" x="30.000000000000014" y="15.333333333333334" width="227.33333333333337" height="20.333333333333329"/>
|
<rect key="frame" x="30.000000000000014" y="15.333333333333334" width="227.33333333333337" 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"/>
|
||||||
@@ -1107,7 +1142,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="1767.9999961853027" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="1818.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="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"/>
|
||||||
@@ -1139,7 +1174,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="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="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"/>
|
||||||
@@ -1174,7 +1209,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="1905.6666622161865" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="1956.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="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"/>
|
||||||
@@ -1209,7 +1244,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="1956.6666622161865" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="2007.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="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"/>
|
||||||
@@ -1244,7 +1279,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="2007.6666622161865" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="2058.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="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"/>
|
||||||
@@ -1272,7 +1307,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="2058.6666622161865" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="2109.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="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"/>
|
||||||
@@ -1300,7 +1335,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="2109.6666622161865" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="2160.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="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"/>
|
||||||
@@ -1334,7 +1369,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="2160.6666622161865" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="2211.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="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"/>
|
||||||
@@ -1369,7 +1404,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="2211.6666622161865" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="2262.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="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"/>
|
||||||
@@ -1404,7 +1439,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="2262.6666622161865" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="2313.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="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"/>
|
||||||
@@ -1455,6 +1490,7 @@
|
|||||||
<outlet property="betaTrackLabel" destination="5J9-vR-vhX" id="x2k-X7-pUr"/>
|
<outlet property="betaTrackLabel" destination="5J9-vR-vhX" id="x2k-X7-pUr"/>
|
||||||
<outlet property="betaTrackPopupButton" destination="Oct-iT-NwP" id="sOR-cc-IWC"/>
|
<outlet property="betaTrackPopupButton" destination="Oct-iT-NwP" id="sOR-cc-IWC"/>
|
||||||
<outlet property="betaUpdatesSwitch" destination="e32-w4-5fk" id="kdn-ZR-cNU"/>
|
<outlet property="betaUpdatesSwitch" destination="e32-w4-5fk" id="kdn-ZR-cNU"/>
|
||||||
|
<outlet property="customizeAppIdSwitch" destination="fXx-wl-F5H" id="Yc0-ZL-aDs"/>
|
||||||
<outlet property="disableAppLimitSwitch" destination="1aa-og-ZXD" id="oVL-Md-yZ8"/>
|
<outlet property="disableAppLimitSwitch" destination="1aa-og-ZXD" id="oVL-Md-yZ8"/>
|
||||||
<outlet property="disableResponseCachingSwitch" destination="AAh-cu-qw8" id="aVT-Md-yZ8"/>
|
<outlet property="disableResponseCachingSwitch" destination="AAh-cu-qw8" id="aVT-Md-yZ8"/>
|
||||||
<outlet property="enableEMPforWireguard" destination="8qE-hE-Ujn" id="VC2-PV-cea"/>
|
<outlet property="enableEMPforWireguard" destination="8qE-hE-Ujn" id="VC2-PV-cea"/>
|
||||||
|
|||||||
@@ -80,6 +80,7 @@ extension SettingsViewController
|
|||||||
case anisetteServers
|
case anisetteServers
|
||||||
case betaUpdates
|
case betaUpdates
|
||||||
case betaTrack
|
case betaTrack
|
||||||
|
case customizeAppId
|
||||||
// case hiddenSettings
|
// case hiddenSettings
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -125,6 +126,7 @@ final class SettingsViewController: UITableViewController
|
|||||||
@IBOutlet private var noIdleTimeoutSwitch: UISwitch!
|
@IBOutlet private var noIdleTimeoutSwitch: UISwitch!
|
||||||
@IBOutlet private var disableAppLimitSwitch: UISwitch!
|
@IBOutlet private var disableAppLimitSwitch: UISwitch!
|
||||||
@IBOutlet private var betaUpdatesSwitch: UISwitch!
|
@IBOutlet private var betaUpdatesSwitch: UISwitch!
|
||||||
|
@IBOutlet private var customizeAppIdSwitch: UISwitch!
|
||||||
@IBOutlet private var exportResignedAppsSwitch: UISwitch!
|
@IBOutlet private var exportResignedAppsSwitch: UISwitch!
|
||||||
@IBOutlet private var verboseOperationsLoggingSwitch: UISwitch!
|
@IBOutlet private var verboseOperationsLoggingSwitch: UISwitch!
|
||||||
@IBOutlet private var minimuxerConsoleLoggingSwitch: UISwitch!
|
@IBOutlet private var minimuxerConsoleLoggingSwitch: UISwitch!
|
||||||
@@ -267,12 +269,10 @@ final class SettingsViewController: UITableViewController
|
|||||||
_ = file.startAccessingSecurityScopedResource()
|
_ = file.startAccessingSecurityScopedResource()
|
||||||
defer { file.stopAccessingSecurityScopedResource() }
|
defer { file.stopAccessingSecurityScopedResource() }
|
||||||
guard let accountD = try? Data(contentsOf: file) else {
|
guard let accountD = try? Data(contentsOf: file) else {
|
||||||
let toastView = ToastView(text: NSLocalizedString("Could not read data from file!", comment: ""), detailText: "\(file)")
|
return Logger.main.notice("Could not parse data from file \(file)")
|
||||||
return toastView.show(in: self)
|
|
||||||
}
|
}
|
||||||
guard let account = try? Foundation.JSONDecoder().decode(ImportedAccount.self, from: accountD) else {
|
guard let account = try? Foundation.JSONDecoder().decode(ImportedAccount.self, from: accountD) else {
|
||||||
let toastView = ToastView(text: NSLocalizedString("Could not parse data from file!", comment: ""), detailText: "\(file)")
|
return Logger.main.notice("Could not parse data from file \(file)")
|
||||||
return toastView.show(in: self)
|
|
||||||
}
|
}
|
||||||
print("We want to import this account probably: \(account)")
|
print("We want to import this account probably: \(account)")
|
||||||
if remove {
|
if remove {
|
||||||
@@ -477,7 +477,7 @@ private extension SettingsViewController
|
|||||||
|
|
||||||
// AdvancedSettingsRow
|
// AdvancedSettingsRow
|
||||||
self.betaUpdatesSwitch.isOn = UserDefaults.standard.isBetaUpdatesEnabled
|
self.betaUpdatesSwitch.isOn = UserDefaults.standard.isBetaUpdatesEnabled
|
||||||
self.betaTrackLabel.isEnabled = UserDefaults.standard.isBetaUpdatesEnabled
|
self.customizeAppIdSwitch.isOn = UserDefaults.standard.customizeAppId
|
||||||
self.betaTrackPopupButton.isEnabled = UserDefaults.standard.isBetaUpdatesEnabled
|
self.betaTrackPopupButton.isEnabled = UserDefaults.standard.isBetaUpdatesEnabled
|
||||||
|
|
||||||
// DiagnosticsRow
|
// DiagnosticsRow
|
||||||
@@ -744,6 +744,12 @@ private extension SettingsViewController
|
|||||||
UserDefaults.standard.isBetaUpdatesEnabled = sender.isOn
|
UserDefaults.standard.isBetaUpdatesEnabled = sender.isOn
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@IBAction func toggleEnableAppIdCustomization(_ sender: UISwitch) {
|
||||||
|
customizeAppIdSwitch.isEnabled = sender.isOn
|
||||||
|
// update it in database
|
||||||
|
UserDefaults.standard.customizeAppId = sender.isOn
|
||||||
|
}
|
||||||
|
|
||||||
@IBAction func toggleIsBackgroundRefreshEnabled(_ sender: UISwitch)
|
@IBAction func toggleIsBackgroundRefreshEnabled(_ sender: UISwitch)
|
||||||
{
|
{
|
||||||
UserDefaults.standard.isBackgroundRefreshEnabled = sender.isOn
|
UserDefaults.standard.isBackgroundRefreshEnabled = sender.isOn
|
||||||
@@ -1352,7 +1358,7 @@ extension SettingsViewController
|
|||||||
// } else {
|
// } else {
|
||||||
// ELOG("UIApplication.openSettingsURLString invalid")
|
// ELOG("UIApplication.openSettingsURLString invalid")
|
||||||
// }
|
// }
|
||||||
case .refreshAttempts, .betaUpdates, .betaTrack: break
|
case .refreshAttempts, .betaUpdates, .betaTrack, .customizeAppId: break
|
||||||
|
|
||||||
}
|
}
|
||||||
case .signing:
|
case .signing:
|
||||||
|
|||||||
@@ -53,6 +53,12 @@ public class Keychain
|
|||||||
@KeychainItem(key: "appleIDPassword")
|
@KeychainItem(key: "appleIDPassword")
|
||||||
public var appleIDPassword: String?
|
public var appleIDPassword: String?
|
||||||
|
|
||||||
|
@KeychainItem(key: "appleIDAdsid")
|
||||||
|
public var appleIDAdsid: String?
|
||||||
|
|
||||||
|
@KeychainItem(key: "appleIDXcodeToken")
|
||||||
|
public var appleIDXcodeToken: String?
|
||||||
|
|
||||||
@KeychainItem(key: "signingCertificatePrivateKey")
|
@KeychainItem(key: "signingCertificatePrivateKey")
|
||||||
public var signingCertificatePrivateKey: Data?
|
public var signingCertificatePrivateKey: Data?
|
||||||
|
|
||||||
@@ -83,6 +89,12 @@ public class Keychain
|
|||||||
@KeychainItem(key: "adiPb")
|
@KeychainItem(key: "adiPb")
|
||||||
public var adiPb: String?
|
public var adiPb: String?
|
||||||
|
|
||||||
|
// for some reason authenticated cert/session/team is completely not cached, which result in logging in for every request
|
||||||
|
// we save it here so when user logs out we can clear cached account/session/team
|
||||||
|
public var certificate: ALTCertificate? = nil
|
||||||
|
public var session: ALTAppleAPISession? = nil
|
||||||
|
public var team: ALTTeam? = nil
|
||||||
|
|
||||||
private init()
|
private init()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@@ -91,7 +103,13 @@ public class Keychain
|
|||||||
{
|
{
|
||||||
self.appleIDEmailAddress = nil
|
self.appleIDEmailAddress = nil
|
||||||
self.appleIDPassword = nil
|
self.appleIDPassword = nil
|
||||||
|
self.appleIDAdsid = nil
|
||||||
|
self.appleIDXcodeToken = nil
|
||||||
self.signingCertificatePrivateKey = nil
|
self.signingCertificatePrivateKey = nil
|
||||||
self.signingCertificateSerialNumber = nil
|
self.signingCertificateSerialNumber = nil
|
||||||
|
|
||||||
|
self.certificate = nil
|
||||||
|
self.session = nil
|
||||||
|
self.team = nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ public extension UserDefaults
|
|||||||
@NSManaged var isIdleTimeoutDisableEnabled: Bool
|
@NSManaged var isIdleTimeoutDisableEnabled: Bool
|
||||||
@NSManaged var isAppLimitDisabled: Bool
|
@NSManaged var isAppLimitDisabled: Bool
|
||||||
@NSManaged var isBetaUpdatesEnabled: Bool
|
@NSManaged var isBetaUpdatesEnabled: Bool
|
||||||
|
@NSManaged var customizeAppId: Bool
|
||||||
@NSManaged var isExportResignedAppEnabled: Bool
|
@NSManaged var isExportResignedAppEnabled: Bool
|
||||||
@NSManaged var isVerboseOperationsLoggingEnabled: Bool
|
@NSManaged var isVerboseOperationsLoggingEnabled: Bool
|
||||||
@NSManaged var isMinimuxerConsoleLoggingEnabled: Bool
|
@NSManaged var isMinimuxerConsoleLoggingEnabled: Bool
|
||||||
@@ -131,6 +132,7 @@ public extension UserDefaults
|
|||||||
let defaults = [
|
let defaults = [
|
||||||
#keyPath(UserDefaults.isAppLimitDisabled): false,
|
#keyPath(UserDefaults.isAppLimitDisabled): false,
|
||||||
#keyPath(UserDefaults.isBetaUpdatesEnabled): false,
|
#keyPath(UserDefaults.isBetaUpdatesEnabled): false,
|
||||||
|
#keyPath(UserDefaults.customizeAppId): false,
|
||||||
#keyPath(UserDefaults.isExportResignedAppEnabled): false,
|
#keyPath(UserDefaults.isExportResignedAppEnabled): false,
|
||||||
#keyPath(UserDefaults.isDebugModeEnabled): false,
|
#keyPath(UserDefaults.isDebugModeEnabled): false,
|
||||||
#keyPath(UserDefaults.isVerboseOperationsLoggingEnabled): false,
|
#keyPath(UserDefaults.isVerboseOperationsLoggingEnabled): false,
|
||||||
|
|||||||
@@ -32,6 +32,13 @@ public struct AnyApp: AppProtocol
|
|||||||
self.url = url
|
self.url = url
|
||||||
self.storeApp = storeApp
|
self.storeApp = storeApp
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public init(from app: AppProtocol, name: String? = nil, bundleId: String? = nil, url: URL? = nil, storeApp: StoreApp? = nil) {
|
||||||
|
self.name = name ?? app.name
|
||||||
|
self.bundleIdentifier = bundleId ?? app.bundleIdentifier
|
||||||
|
self.url = url ?? app.url
|
||||||
|
self.storeApp = storeApp ?? app.storeApp
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
extension ALTApplication: AppProtocol
|
extension ALTApplication: AppProtocol
|
||||||
|
|||||||
8
SideStore/minimuxer-swift/.gitignore
vendored
Normal file
8
SideStore/minimuxer-swift/.gitignore
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
.DS_Store
|
||||||
|
/.build
|
||||||
|
/Packages
|
||||||
|
xcuserdata/
|
||||||
|
DerivedData/
|
||||||
|
.swiftpm/configuration/registries.json
|
||||||
|
.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata
|
||||||
|
.netrc
|
||||||
@@ -24,6 +24,18 @@
|
|||||||
"identifier": "com.stossy11.MeloNX",
|
"identifier": "com.stossy11.MeloNX",
|
||||||
"sourceURL": "https://git.ryujinx.app/melonx/emu/-/raw/XC-ios-ht/source.json"
|
"sourceURL": "https://git.ryujinx.app/melonx/emu/-/raw/XC-ios-ht/source.json"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"identifier": "com.chachirie.source",
|
||||||
|
"sourceURL": "https://github.com/chachillie/Flycast-iOS/raw/refs/heads/main/flycast-ios.json"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"identifier": "org.geode-sdk.altsource",
|
||||||
|
"sourceURL": "https://ios-repo.geode-sdk.org/altsource/main.json"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"identifier": "com.sbuga.retrosekai",
|
||||||
|
"sourceURL": "https://repo.untitledcharts.com"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"identifier": "org.provenance-emu.provenance",
|
"identifier": "org.provenance-emu.provenance",
|
||||||
"sourceURL": "https://provenance-emu.com/apps.json"
|
"sourceURL": "https://provenance-emu.com/apps.json"
|
||||||
@@ -89,6 +101,14 @@
|
|||||||
"identifier": "com.stossy11.MeloNX",
|
"identifier": "com.stossy11.MeloNX",
|
||||||
"sourceURL": "https://git.ryujinx.app/melonx/emu/-/raw/XC-ios-ht/source.json"
|
"sourceURL": "https://git.ryujinx.app/melonx/emu/-/raw/XC-ios-ht/source.json"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"identifier": "com.chachirie.source",
|
||||||
|
"sourceURL": "https://github.com/chachillie/Flycast-iOS/raw/refs/heads/main/flycast-ios.json"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"identifier": "org.geode-sdk.altsource",
|
||||||
|
"sourceURL": "https://ios-repo.geode-sdk.org/altsource/main.json"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"identifier": "org.provenance-emu.provenance",
|
"identifier": "org.provenance-emu.provenance",
|
||||||
"sourceURL": "https://provenance-emu.com/apps.json"
|
"sourceURL": "https://provenance-emu.com/apps.json"
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
#include "../Build.xcconfig"
|
#include "../Build.xcconfig"
|
||||||
|
|
||||||
PRODUCT_BUNDLE_IDENTIFIER[config=Debug] = $(ORG_IDENTIFIER).SideStore.AltBackup. //$(DEVELOPMENT_TEAM)
|
PRODUCT_BUNDLE_IDENTIFIER[config=Debug] = $(ORG_IDENTIFIER).SideStore.$(DEVELOPMENT_TEAM).AltBackup
|
||||||
//PRODUCT_BUNDLE_IDENTIFIER[config=Release] = $(ORG_IDENTIFIER).SideStore.AltBackup
|
|
||||||
//PRODUCT_BUNDLE_IDENTIFIER[config=Debug] = $(ORG_IDENTIFIER).SideStore.AltBackup
|
|
||||||
PRODUCT_BUNDLE_IDENTIFIER[config=Release] = $(ORG_IDENTIFIER).SideStore.AltBackup
|
PRODUCT_BUNDLE_IDENTIFIER[config=Release] = $(ORG_IDENTIFIER).SideStore.AltBackup
|
||||||
|
|||||||
Reference in New Issue
Block a user