[AltStoreCore] Refactors core AltStore logic into AltStoreCore framework

AltStoreCore will contain all shared AltStore code between AltStore and any app extensions. Initially, it includes all AltStore model logic.
This commit is contained in:
Riley Testut
2020-09-03 16:39:08 -07:00
parent de925e7fea
commit f1a39e1a1f
149 changed files with 3266 additions and 1792 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -2,14 +2,4 @@
// Use this file to import your target's public headers that you would like to expose to Swift. // Use this file to import your target's public headers that you would like to expose to Swift.
// //
#import "ALTAppPermission.h"
#import "ALTPatreonBenefitType.h"
#import "ALTSourceUserInfoKey.h"
#import "NSAttributedString+Markdown.h" #import "NSAttributedString+Markdown.h"
// Shared
#import "ALTConstants.h"
#import "ALTConnection.h"
#import "NSError+ALTServerError.h"
#import "CFNotificationName+AltStore.h"

View File

@@ -8,6 +8,8 @@
import Foundation import Foundation
import AltStoreCore
import AppCenter import AppCenter
import AppCenterAnalytics import AppCenterAnalytics
import AppCenterCrashes import AppCenterCrashes

View File

@@ -8,6 +8,7 @@
import UIKit import UIKit
import AltStoreCore
import Roxas import Roxas
import Nuke import Nuke

View File

@@ -8,6 +8,7 @@
import UIKit import UIKit
import AltStoreCore
import Roxas import Roxas
import Nuke import Nuke

View File

@@ -8,6 +8,8 @@
import UIKit import UIKit
import AltStoreCore
class PermissionPopoverViewController: UIViewController class PermissionPopoverViewController: UIViewController
{ {
var permission: AppPermission! var permission: AppPermission!

View File

@@ -8,6 +8,7 @@
import UIKit import UIKit
import AltStoreCore
import Roxas import Roxas
class AppIDsViewController: UICollectionViewController class AppIDsViewController: UICollectionViewController

View File

@@ -10,6 +10,7 @@ import UIKit
import UserNotifications import UserNotifications
import AVFoundation import AVFoundation
import AltStoreCore
import AltSign import AltSign
import Roxas import Roxas

View File

@@ -7,8 +7,9 @@
// //
import UIKit import UIKit
import AltSign
import AltStoreCore
import AltSign
import Roxas import Roxas
class RefreshAltStoreViewController: UIViewController class RefreshAltStoreViewController: UIViewController

View File

@@ -8,6 +8,7 @@
import UIKit import UIKit
import AltStoreCore
import Roxas import Roxas
import Nuke import Nuke

View File

@@ -7,6 +7,8 @@
// //
import UIKit import UIKit
import AltStoreCore
import Roxas import Roxas
class AppBannerView: RSTNibView class AppBannerView: RSTNibView

View File

@@ -8,6 +8,8 @@
import Roxas import Roxas
import AltStoreCore
extension TimeInterval extension TimeInterval
{ {
static let shortToastViewDuration = 4.0 static let shortToastViewDuration = 4.0

View File

@@ -8,6 +8,8 @@
import Foundation import Foundation
import AltStoreCore
extension FileManager extension FileManager
{ {
var altstoreSharedDirectory: URL? { var altstoreSharedDirectory: URL? {

View File

@@ -9,6 +9,8 @@
import UIKit import UIKit
import Roxas import Roxas
import AltStoreCore
class LaunchViewController: RSTLaunchViewController class LaunchViewController: RSTLaunchViewController
{ {
private var didFinishLaunching = false private var didFinishLaunching = false

View File

@@ -11,8 +11,8 @@ import UIKit
import UserNotifications import UserNotifications
import MobileCoreServices import MobileCoreServices
import AltStoreCore
import AltSign import AltSign
import Roxas import Roxas
extension AppManager extension AppManager

View File

@@ -9,6 +9,8 @@
import Foundation import Foundation
import CoreData import CoreData
import AltStoreCore
extension AppManager extension AppManager
{ {
struct FetchSourcesError: LocalizedError, CustomNSError struct FetchSourcesError: LocalizedError, CustomNSError

View File

@@ -9,9 +9,9 @@
import UIKit import UIKit
import MobileCoreServices import MobileCoreServices
import Roxas import AltStoreCore
import AltSign import AltSign
import Roxas
import Nuke import Nuke

View File

@@ -9,6 +9,7 @@
import UIKit import UIKit
import SafariServices import SafariServices
import AltStoreCore
import Roxas import Roxas
import Nuke import Nuke

View File

@@ -10,6 +10,7 @@ import Foundation
import Roxas import Roxas
import Network import Network
import AltStoreCore
import AltSign import AltSign
enum AuthenticationError: LocalizedError enum AuthenticationError: LocalizedError

View File

@@ -8,6 +8,7 @@
import Foundation import Foundation
import AltStoreCore
import AltSign import AltSign
extension BackupAppOperation extension BackupAppOperation

View File

@@ -8,6 +8,7 @@
import Foundation import Foundation
import AltStoreCore
import AltSign import AltSign
import Roxas import Roxas

View File

@@ -9,6 +9,7 @@
import Foundation import Foundation
import Roxas import Roxas
import AltStoreCore
import AltSign import AltSign
@objc(DownloadAppOperation) @objc(DownloadAppOperation)

View File

@@ -8,6 +8,7 @@
import Foundation import Foundation
import AltStoreCore
import AltSign import AltSign
import Roxas import Roxas

View File

@@ -8,6 +8,7 @@
import Foundation import Foundation
import AltStoreCore
import AltSign import AltSign
import Roxas import Roxas

View File

@@ -7,9 +7,10 @@
// //
import Foundation import Foundation
import Roxas
import AltStoreCore
import AltSign import AltSign
import Roxas
@objc(FetchProvisioningProfilesOperation) @objc(FetchProvisioningProfilesOperation)
class FetchProvisioningProfilesOperation: ResultOperation<[String: ALTProvisioningProfile]> class FetchProvisioningProfilesOperation: ResultOperation<[String: ALTProvisioningProfile]>

View File

@@ -9,6 +9,7 @@
import Foundation import Foundation
import CoreData import CoreData
import AltStoreCore
import Roxas import Roxas
@objc(FetchSourceOperation) @objc(FetchSourceOperation)
@@ -49,7 +50,7 @@ class FetchSourceOperation: ResultOperation<Source>
{ {
let (data, _) = try Result((data, response), error).get() let (data, _) = try Result((data, response), error).get()
let decoder = JSONDecoder() let decoder = AltStoreCore.JSONDecoder()
decoder.dateDecodingStrategy = .custom({ (decoder) -> Date in decoder.dateDecodingStrategy = .custom({ (decoder) -> Date in
let container = try decoder.singleValueContainer() let container = try decoder.singleValueContainer()
let text = try container.decode(String.self) let text = try container.decode(String.self)

View File

@@ -9,6 +9,7 @@
import Foundation import Foundation
import Network import Network
import AltStoreCore
import AltSign import AltSign
import Roxas import Roxas

View File

@@ -10,6 +10,7 @@ import Foundation
import CoreData import CoreData
import Network import Network
import AltStoreCore
import AltSign import AltSign
class OperationContext class OperationContext

View File

@@ -8,8 +8,8 @@
import Foundation import Foundation
import AltStoreCore
import AltSign import AltSign
import Roxas import Roxas
@objc(RefreshAppOperation) @objc(RefreshAppOperation)

View File

@@ -9,6 +9,7 @@
import Foundation import Foundation
import CoreData import CoreData
import AltStoreCore
import AltSign import AltSign
class RefreshGroup: NSObject class RefreshGroup: NSObject

View File

@@ -8,6 +8,8 @@
import Foundation import Foundation
import AltStoreCore
@objc(RemoveAppOperation) @objc(RemoveAppOperation)
class RemoveAppOperation: ResultOperation<InstalledApp> class RemoveAppOperation: ResultOperation<InstalledApp>
{ {

View File

@@ -9,6 +9,7 @@
import Foundation import Foundation
import Roxas import Roxas
import AltStoreCore
import AltSign import AltSign
@objc(ResignAppOperation) @objc(ResignAppOperation)

View File

@@ -9,6 +9,8 @@
import Foundation import Foundation
import Network import Network
import AltStoreCore
@objc(SendAppOperation) @objc(SendAppOperation)
class SendAppOperation: ResultOperation<ServerConnection> class SendAppOperation: ResultOperation<ServerConnection>
{ {

View File

@@ -9,6 +9,8 @@
import Foundation import Foundation
import Network import Network
import AltStoreCore
class ServerConnection class ServerConnection
{ {
var server: Server var server: Server
@@ -93,7 +95,7 @@ class ServerConnection
{ {
let data = try self.process(data: data, error: error) let data = try self.process(data: data, error: error)
let response = try JSONDecoder().decode(ServerResponse.self, from: data) let response = try AltStoreCore.JSONDecoder().decode(ServerResponse.self, from: data)
completionHandler(.success(response)) completionHandler(.success(response))
} }
catch catch

View File

@@ -9,6 +9,8 @@
import Foundation import Foundation
import Network import Network
import AltStoreCore
class ServerManager: NSObject class ServerManager: NSObject
{ {
static let shared = ServerManager() static let shared = ServerManager()

View File

@@ -10,6 +10,7 @@ import UIKit
import SafariServices import SafariServices
import AuthenticationServices import AuthenticationServices
import AltStoreCore
import Roxas import Roxas
extension PatreonViewController extension PatreonViewController

View File

@@ -8,6 +8,7 @@
import UIKit import UIKit
import AltStoreCore
import Roxas import Roxas
@objc(RefreshAttemptTableViewCell) @objc(RefreshAttemptTableViewCell)

View File

@@ -10,6 +10,8 @@ import UIKit
import SafariServices import SafariServices
import MessageUI import MessageUI
import AltStoreCore
extension SettingsViewController extension SettingsViewController
{ {
fileprivate enum Section: Int, CaseIterable fileprivate enum Section: Int, CaseIterable

View File

@@ -9,6 +9,7 @@
import UIKit import UIKit
import CoreData import CoreData
import AltStoreCore
import Roxas import Roxas
class SourcesViewController: UICollectionViewController class SourcesViewController: UICollectionViewController

View File

@@ -0,0 +1,27 @@
//
// AltStoreCore.h
// AltStoreCore
//
// Created by Riley Testut on 9/3/20.
// Copyright © 2020 Riley Testut. All rights reserved.
//
#import <Foundation/Foundation.h>
//! Project version number for AltStoreCore.
FOUNDATION_EXPORT double AltStoreCoreVersionNumber;
//! Project version string for AltStoreCore.
FOUNDATION_EXPORT const unsigned char AltStoreCoreVersionString[];
// In this header, you should import all the public headers of your framework using statements like #import <AltStoreCore/PublicHeader.h>
#import <AltStoreCore/ALTAppPermission.h>
#import <AltStoreCore/ALTSourceUserInfoKey.h>
#import <AltStoreCore/ALTPatreonBenefitType.h>
// Shared
#import <AltStoreCore/ALTConstants.h>
#import <AltStoreCore/ALTConnection.h>
#import <AltStoreCore/NSError+ALTServerError.h>
#import <AltStoreCore/CFNotificationName+AltStore.h>

View File

@@ -12,11 +12,11 @@ import KeychainAccess
import AltSign import AltSign
@propertyWrapper @propertyWrapper
struct KeychainItem<Value> public struct KeychainItem<Value>
{ {
let key: String public let key: String
var wrappedValue: Value? { public var wrappedValue: Value? {
get { get {
switch Value.self switch Value.self
{ {
@@ -35,50 +35,50 @@ struct KeychainItem<Value>
} }
} }
init(key: String) public init(key: String)
{ {
self.key = key self.key = key
} }
} }
class Keychain public class Keychain
{ {
static let shared = Keychain() public static let shared = Keychain()
fileprivate let keychain = KeychainAccess.Keychain(service: "com.rileytestut.AltStore").accessibility(.afterFirstUnlock).synchronizable(true) fileprivate let keychain = KeychainAccess.Keychain(service: "com.rileytestut.AltStore").accessibility(.afterFirstUnlock).synchronizable(true)
@KeychainItem(key: "appleIDEmailAddress") @KeychainItem(key: "appleIDEmailAddress")
var appleIDEmailAddress: String? public var appleIDEmailAddress: String?
@KeychainItem(key: "appleIDPassword") @KeychainItem(key: "appleIDPassword")
var appleIDPassword: String? public var appleIDPassword: String?
@KeychainItem(key: "signingCertificatePrivateKey") @KeychainItem(key: "signingCertificatePrivateKey")
var signingCertificatePrivateKey: Data? public var signingCertificatePrivateKey: Data?
@KeychainItem(key: "signingCertificateSerialNumber") @KeychainItem(key: "signingCertificateSerialNumber")
var signingCertificateSerialNumber: String? public var signingCertificateSerialNumber: String?
@KeychainItem(key: "signingCertificate") @KeychainItem(key: "signingCertificate")
var signingCertificate: Data? public var signingCertificate: Data?
@KeychainItem(key: "signingCertificatePassword") @KeychainItem(key: "signingCertificatePassword")
var signingCertificatePassword: String? public var signingCertificatePassword: String?
@KeychainItem(key: "patreonAccessToken") @KeychainItem(key: "patreonAccessToken")
var patreonAccessToken: String? public var patreonAccessToken: String?
@KeychainItem(key: "patreonRefreshToken") @KeychainItem(key: "patreonRefreshToken")
var patreonRefreshToken: String? public var patreonRefreshToken: String?
@KeychainItem(key: "patreonCreatorAccessToken") @KeychainItem(key: "patreonCreatorAccessToken")
var patreonCreatorAccessToken: String? public var patreonCreatorAccessToken: String?
private init() private init()
{ {
} }
func reset() public func reset()
{ {
self.appleIDEmailAddress = nil self.appleIDEmailAddress = nil
self.appleIDPassword = nil self.appleIDPassword = nil

View File

@@ -9,7 +9,7 @@
import Foundation import Foundation
import CoreData import CoreData
extension CodingUserInfoKey public extension CodingUserInfoKey
{ {
static let managedObjectContext = CodingUserInfoKey(rawValue: "managedObjectContext")! static let managedObjectContext = CodingUserInfoKey(rawValue: "managedObjectContext")!
static let sourceURL = CodingUserInfoKey(rawValue: "sourceURL")! static let sourceURL = CodingUserInfoKey(rawValue: "sourceURL")!
@@ -18,29 +18,29 @@ extension CodingUserInfoKey
public final class JSONDecoder: Foundation.JSONDecoder public final class JSONDecoder: Foundation.JSONDecoder
{ {
@DecoderItem(key: .managedObjectContext) @DecoderItem(key: .managedObjectContext)
var managedObjectContext: NSManagedObjectContext? public var managedObjectContext: NSManagedObjectContext?
@DecoderItem(key: .sourceURL) @DecoderItem(key: .sourceURL)
var sourceURL: URL? public var sourceURL: URL?
} }
extension Decoder public extension Decoder
{ {
var managedObjectContext: NSManagedObjectContext? { self.userInfo[.managedObjectContext] as? NSManagedObjectContext } var managedObjectContext: NSManagedObjectContext? { self.userInfo[.managedObjectContext] as? NSManagedObjectContext }
var sourceURL: URL? { self.userInfo[.sourceURL] as? URL } var sourceURL: URL? { self.userInfo[.sourceURL] as? URL }
} }
@propertyWrapper @propertyWrapper
struct DecoderItem<Value> public struct DecoderItem<Value>
{ {
let key: CodingUserInfoKey public let key: CodingUserInfoKey
var wrappedValue: Value? { public var wrappedValue: Value? {
get { fatalError("only works on instance properties of classes") } get { fatalError("only works on instance properties of classes") }
set { fatalError("only works on instance properties of classes") } set { fatalError("only works on instance properties of classes") }
} }
init(key: CodingUserInfoKey) public init(key: CodingUserInfoKey)
{ {
self.key = key self.key = key
} }

View File

@@ -0,0 +1,17 @@
//
// UIApplication+AppExtension.swift
// DeltaCore
//
// Created by Riley Testut on 6/14/18.
// Copyright © 2018 Riley Testut. All rights reserved.
//
import UIKit
public extension UIApplication
{
// Cannot normally use UIApplication.shared from extensions, so we get around this by calling value(forKey:).
class var alt_shared: UIApplication? {
return UIApplication.value(forKey: "sharedApplication") as? UIApplication
}
}

View File

@@ -8,7 +8,7 @@
import UIKit import UIKit
extension UIColor public extension UIColor
{ {
// Borrowed from https://stackoverflow.com/a/26341062 // Borrowed from https://stackoverflow.com/a/26341062
var hexString: String { var hexString: String {

View File

@@ -10,7 +10,7 @@ import Foundation
import Roxas import Roxas
extension UserDefaults public extension UserDefaults
{ {
@NSManaged var firstLaunch: Date? @NSManaged var firstLaunch: Date?

22
AltStoreCore/Info.plist Normal file
View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>$(CURRENT_PROJECT_VERSION)</string>
</dict>
</plist>

View File

@@ -12,9 +12,9 @@ import CoreData
import AltSign import AltSign
@objc(Account) @objc(Account)
class Account: NSManagedObject, Fetchable public class Account: NSManagedObject, Fetchable
{ {
var localizedName: String { public var localizedName: String {
var components = PersonNameComponents() var components = PersonNameComponents()
components.givenName = self.firstName components.givenName = self.firstName
components.familyName = self.lastName components.familyName = self.lastName
@@ -24,30 +24,30 @@ class Account: NSManagedObject, Fetchable
} }
/* Properties */ /* Properties */
@NSManaged var appleID: String @NSManaged public var appleID: String
@NSManaged var identifier: String @NSManaged public var identifier: String
@NSManaged var firstName: String @NSManaged public var firstName: String
@NSManaged var lastName: String @NSManaged public var lastName: String
@NSManaged var isActiveAccount: Bool @NSManaged public var isActiveAccount: Bool
/* Relationships */ /* Relationships */
@NSManaged var teams: Set<Team> @NSManaged public var teams: Set<Team>
private override init(entity: NSEntityDescription, insertInto context: NSManagedObjectContext?) private override init(entity: NSEntityDescription, insertInto context: NSManagedObjectContext?)
{ {
super.init(entity: entity, insertInto: context) super.init(entity: entity, insertInto: context)
} }
init(_ account: ALTAccount, context: NSManagedObjectContext) public init(_ account: ALTAccount, context: NSManagedObjectContext)
{ {
super.init(entity: Account.entity(), insertInto: context) super.init(entity: Account.entity(), insertInto: context)
self.update(account: account) self.update(account: account)
} }
func update(account: ALTAccount) public func update(account: ALTAccount)
{ {
self.appleID = account.appleID self.appleID = account.appleID
self.identifier = account.identifier self.identifier = account.identifier
@@ -57,7 +57,7 @@ class Account: NSManagedObject, Fetchable
} }
} }
extension Account public extension Account
{ {
@nonobjc class func fetchRequest() -> NSFetchRequest<Account> @nonobjc class func fetchRequest() -> NSFetchRequest<Account>
{ {

View File

@@ -12,24 +12,24 @@ import CoreData
import AltSign import AltSign
@objc(AppID) @objc(AppID)
class AppID: NSManagedObject, Fetchable public class AppID: NSManagedObject, Fetchable
{ {
/* Properties */ /* Properties */
@NSManaged var name: String @NSManaged public var name: String
@NSManaged var identifier: String @NSManaged public var identifier: String
@NSManaged var bundleIdentifier: String @NSManaged public var bundleIdentifier: String
@NSManaged var features: [ALTFeature: Any] @NSManaged public var features: [ALTFeature: Any]
@NSManaged var expirationDate: Date? @NSManaged public var expirationDate: Date?
/* Relationships */ /* Relationships */
@NSManaged private(set) var team: Team? @NSManaged public private(set) var team: Team?
private override init(entity: NSEntityDescription, insertInto context: NSManagedObjectContext?) private override init(entity: NSEntityDescription, insertInto context: NSManagedObjectContext?)
{ {
super.init(entity: entity, insertInto: context) super.init(entity: entity, insertInto: context)
} }
init(_ appID: ALTAppID, team: Team, context: NSManagedObjectContext) public init(_ appID: ALTAppID, team: Team, context: NSManagedObjectContext)
{ {
super.init(entity: AppID.entity(), insertInto: context) super.init(entity: AppID.entity(), insertInto: context)
@@ -43,7 +43,7 @@ class AppID: NSManagedObject, Fetchable
} }
} }
extension AppID public extension AppID
{ {
@nonobjc class func fetchRequest() -> NSFetchRequest<AppID> @nonobjc class func fetchRequest() -> NSFetchRequest<AppID>
{ {

View File

@@ -9,7 +9,7 @@
import CoreData import CoreData
import UIKit import UIKit
extension ALTAppPermissionType public extension ALTAppPermissionType
{ {
var localizedShortName: String? { var localizedShortName: String? {
switch self switch self
@@ -43,14 +43,14 @@ extension ALTAppPermissionType
} }
@objc(AppPermission) @objc(AppPermission)
class AppPermission: NSManagedObject, Decodable, Fetchable public class AppPermission: NSManagedObject, Decodable, Fetchable
{ {
/* Properties */ /* Properties */
@NSManaged var type: ALTAppPermissionType @NSManaged public var type: ALTAppPermissionType
@NSManaged var usageDescription: String @NSManaged public var usageDescription: String
/* Relationships */ /* Relationships */
@NSManaged private(set) var app: StoreApp! @NSManaged public private(set) var app: StoreApp!
private override init(entity: NSEntityDescription, insertInto context: NSManagedObjectContext?) private override init(entity: NSEntityDescription, insertInto context: NSManagedObjectContext?)
{ {
@@ -63,7 +63,7 @@ class AppPermission: NSManagedObject, Decodable, Fetchable
case usageDescription case usageDescription
} }
required init(from decoder: Decoder) throws public required init(from decoder: Decoder) throws
{ {
guard let context = decoder.managedObjectContext else { preconditionFailure("Decoder must have non-nil NSManagedObjectContext.") } guard let context = decoder.managedObjectContext else { preconditionFailure("Decoder must have non-nil NSManagedObjectContext.") }
@@ -89,7 +89,7 @@ class AppPermission: NSManagedObject, Decodable, Fetchable
} }
} }
extension AppPermission public extension AppPermission
{ {
@nonobjc class func fetchRequest() -> NSFetchRequest<AppPermission> @nonobjc class func fetchRequest() -> NSFetchRequest<AppPermission>
{ {

View File

@@ -23,7 +23,7 @@ public class DatabaseManager
private init() private init()
{ {
self.persistentContainer = RSTPersistentContainer(name: "AltStore") self.persistentContainer = RSTPersistentContainer(name: "AltStore", bundle: Bundle(for: DatabaseManager.self))
self.persistentContainer.preferredMergePolicy = MergePolicy() self.persistentContainer.preferredMergePolicy = MergePolicy()
} }
} }
@@ -98,7 +98,7 @@ public extension DatabaseManager
} }
} }
extension DatabaseManager public extension DatabaseManager
{ {
func activeAccount(in context: NSManagedObjectContext = DatabaseManager.shared.viewContext) -> Account? func activeAccount(in context: NSManagedObjectContext = DatabaseManager.shared.viewContext) -> Account?
{ {

View File

@@ -12,9 +12,9 @@ import CoreData
import AltSign import AltSign
// Free developer accounts are limited to only 3 active sideloaded apps at a time as of iOS 13.3.1. // Free developer accounts are limited to only 3 active sideloaded apps at a time as of iOS 13.3.1.
let ALTActiveAppsLimit = 3 public let ALTActiveAppsLimit = 3
protocol InstalledAppProtocol: Fetchable public protocol InstalledAppProtocol: Fetchable
{ {
var name: String { get } var name: String { get }
var bundleIdentifier: String { get } var bundleIdentifier: String { get }
@@ -27,36 +27,36 @@ protocol InstalledAppProtocol: Fetchable
} }
@objc(InstalledApp) @objc(InstalledApp)
class InstalledApp: NSManagedObject, InstalledAppProtocol public class InstalledApp: NSManagedObject, InstalledAppProtocol
{ {
/* Properties */ /* Properties */
@NSManaged var name: String @NSManaged public var name: String
@NSManaged var bundleIdentifier: String @NSManaged public var bundleIdentifier: String
@NSManaged var resignedBundleIdentifier: String @NSManaged public var resignedBundleIdentifier: String
@NSManaged var version: String @NSManaged public var version: String
@NSManaged var refreshedDate: Date @NSManaged public var refreshedDate: Date
@NSManaged var expirationDate: Date @NSManaged public var expirationDate: Date
@NSManaged var installedDate: Date @NSManaged public var installedDate: Date
@NSManaged var isActive: Bool @NSManaged public var isActive: Bool
@NSManaged var certificateSerialNumber: String? @NSManaged public var certificateSerialNumber: String?
/* Relationships */ /* Relationships */
@NSManaged var storeApp: StoreApp? @NSManaged public var storeApp: StoreApp?
@NSManaged var team: Team? @NSManaged public var team: Team?
@NSManaged var appExtensions: Set<InstalledExtension> @NSManaged public var appExtensions: Set<InstalledExtension>
var isSideloaded: Bool { public var isSideloaded: Bool {
return self.storeApp == nil return self.storeApp == nil
} }
var appIDCount: Int { public var appIDCount: Int {
return 1 + self.appExtensions.count return 1 + self.appExtensions.count
} }
var requiredActiveSlots: Int { public var requiredActiveSlots: Int {
let requiredActiveSlots = UserDefaults.standard.activeAppLimitIncludesExtensions ? self.appIDCount : 1 let requiredActiveSlots = UserDefaults.standard.activeAppLimitIncludesExtensions ? self.appIDCount : 1
return requiredActiveSlots return requiredActiveSlots
} }
@@ -66,7 +66,7 @@ class InstalledApp: NSManagedObject, InstalledAppProtocol
super.init(entity: entity, insertInto: context) super.init(entity: entity, insertInto: context)
} }
init(resignedApp: ALTApplication, originalBundleIdentifier: String, certificateSerialNumber: String?, context: NSManagedObjectContext) public init(resignedApp: ALTApplication, originalBundleIdentifier: String, certificateSerialNumber: String?, context: NSManagedObjectContext)
{ {
super.init(entity: InstalledApp.entity(), insertInto: context) super.init(entity: InstalledApp.entity(), insertInto: context)
@@ -80,7 +80,7 @@ class InstalledApp: NSManagedObject, InstalledAppProtocol
self.update(resignedApp: resignedApp, certificateSerialNumber: certificateSerialNumber) self.update(resignedApp: resignedApp, certificateSerialNumber: certificateSerialNumber)
} }
func update(resignedApp: ALTApplication, certificateSerialNumber: String?) public func update(resignedApp: ALTApplication, certificateSerialNumber: String?)
{ {
self.name = resignedApp.name self.name = resignedApp.name
@@ -95,14 +95,14 @@ class InstalledApp: NSManagedObject, InstalledAppProtocol
} }
} }
func update(provisioningProfile: ALTProvisioningProfile) public func update(provisioningProfile: ALTProvisioningProfile)
{ {
self.refreshedDate = provisioningProfile.creationDate self.refreshedDate = provisioningProfile.creationDate
self.expirationDate = provisioningProfile.expirationDate self.expirationDate = provisioningProfile.expirationDate
} }
} }
extension InstalledApp public extension InstalledApp
{ {
@nonobjc class func fetchRequest() -> NSFetchRequest<InstalledApp> @nonobjc class func fetchRequest() -> NSFetchRequest<InstalledApp>
{ {
@@ -199,7 +199,7 @@ extension InstalledApp
} }
} }
extension InstalledApp public extension InstalledApp
{ {
var openAppURL: URL { var openAppURL: URL {
let openAppURL = URL(string: "altstore-" + self.bundleIdentifier + "://")! let openAppURL = URL(string: "altstore-" + self.bundleIdentifier + "://")!
@@ -213,7 +213,7 @@ extension InstalledApp
} }
} }
extension InstalledApp public extension InstalledApp
{ {
class var appsDirectoryURL: URL { class var appsDirectoryURL: URL {
let appsDirectoryURL = FileManager.default.applicationSupportDirectory.appendingPathComponent("Apps") let appsDirectoryURL = FileManager.default.applicationSupportDirectory.appendingPathComponent("Apps")

View File

@@ -12,27 +12,27 @@ import CoreData
import AltSign import AltSign
@objc(InstalledExtension) @objc(InstalledExtension)
class InstalledExtension: NSManagedObject, InstalledAppProtocol public class InstalledExtension: NSManagedObject, InstalledAppProtocol
{ {
/* Properties */ /* Properties */
@NSManaged var name: String @NSManaged public var name: String
@NSManaged var bundleIdentifier: String @NSManaged public var bundleIdentifier: String
@NSManaged var resignedBundleIdentifier: String @NSManaged public var resignedBundleIdentifier: String
@NSManaged var version: String @NSManaged public var version: String
@NSManaged var refreshedDate: Date @NSManaged public var refreshedDate: Date
@NSManaged var expirationDate: Date @NSManaged public var expirationDate: Date
@NSManaged var installedDate: Date @NSManaged public var installedDate: Date
/* Relationships */ /* Relationships */
@NSManaged var parentApp: InstalledApp? @NSManaged public var parentApp: InstalledApp?
private override init(entity: NSEntityDescription, insertInto context: NSManagedObjectContext?) private override init(entity: NSEntityDescription, insertInto context: NSManagedObjectContext?)
{ {
super.init(entity: entity, insertInto: context) super.init(entity: entity, insertInto: context)
} }
init(resignedAppExtension: ALTApplication, originalBundleIdentifier: String, context: NSManagedObjectContext) public init(resignedAppExtension: ALTApplication, originalBundleIdentifier: String, context: NSManagedObjectContext)
{ {
super.init(entity: InstalledExtension.entity(), insertInto: context) super.init(entity: InstalledExtension.entity(), insertInto: context)
@@ -46,7 +46,7 @@ class InstalledExtension: NSManagedObject, InstalledAppProtocol
self.update(resignedAppExtension: resignedAppExtension) self.update(resignedAppExtension: resignedAppExtension)
} }
func update(resignedAppExtension: ALTApplication) public func update(resignedAppExtension: ALTApplication)
{ {
self.name = resignedAppExtension.name self.name = resignedAppExtension.name
@@ -59,14 +59,14 @@ class InstalledExtension: NSManagedObject, InstalledAppProtocol
} }
} }
func update(provisioningProfile: ALTProvisioningProfile) public func update(provisioningProfile: ALTProvisioningProfile)
{ {
self.refreshedDate = provisioningProfile.creationDate self.refreshedDate = provisioningProfile.creationDate
self.expirationDate = provisioningProfile.expirationDate self.expirationDate = provisioningProfile.expirationDate
} }
} }
extension InstalledExtension public extension InstalledExtension
{ {
@nonobjc class func fetchRequest() -> NSFetchRequest<InstalledExtension> @nonobjc class func fetchRequest() -> NSFetchRequest<InstalledExtension>
{ {

View File

@@ -10,27 +10,27 @@ import UIKit
import CoreData import CoreData
@objc(NewsItem) @objc(NewsItem)
class NewsItem: NSManagedObject, Decodable, Fetchable public class NewsItem: NSManagedObject, Decodable, Fetchable
{ {
/* Properties */ /* Properties */
@NSManaged var identifier: String @NSManaged public var identifier: String
@NSManaged var date: Date @NSManaged public var date: Date
@NSManaged var title: String @NSManaged public var title: String
@NSManaged var caption: String @NSManaged public var caption: String
@NSManaged var tintColor: UIColor @NSManaged public var tintColor: UIColor
@NSManaged var sortIndex: Int32 @NSManaged public var sortIndex: Int32
@NSManaged var isSilent: Bool @NSManaged public var isSilent: Bool
@NSManaged var imageURL: URL? @NSManaged public var imageURL: URL?
@NSManaged var externalURL: URL? @NSManaged public var externalURL: URL?
@NSManaged var appID: String? @NSManaged public var appID: String?
@NSManaged var sourceIdentifier: String? @NSManaged public var sourceIdentifier: String?
/* Relationships */ /* Relationships */
@NSManaged var storeApp: StoreApp? @NSManaged public var storeApp: StoreApp?
@NSManaged var source: Source? @NSManaged public var source: Source?
private enum CodingKeys: String, CodingKey private enum CodingKeys: String, CodingKey
{ {
@@ -50,7 +50,7 @@ class NewsItem: NSManagedObject, Decodable, Fetchable
super.init(entity: entity, insertInto: context) super.init(entity: entity, insertInto: context)
} }
required init(from decoder: Decoder) throws public required init(from decoder: Decoder) throws
{ {
guard let context = decoder.managedObjectContext else { preconditionFailure("Decoder must have non-nil NSManagedObjectContext.") } guard let context = decoder.managedObjectContext else { preconditionFailure("Decoder must have non-nil NSManagedObjectContext.") }
@@ -82,7 +82,7 @@ class NewsItem: NSManagedObject, Decodable, Fetchable
} }
} }
extension NewsItem public extension NewsItem
{ {
@nonobjc class func fetchRequest() -> NSFetchRequest<NewsItem> @nonobjc class func fetchRequest() -> NSFetchRequest<NewsItem>
{ {

View File

@@ -30,14 +30,14 @@ extension PatreonAPI
} }
@objc(PatreonAccount) @objc(PatreonAccount)
class PatreonAccount: NSManagedObject, Fetchable public class PatreonAccount: NSManagedObject, Fetchable
{ {
@NSManaged var identifier: String @NSManaged public var identifier: String
@NSManaged var name: String @NSManaged public var name: String
@NSManaged var firstName: String? @NSManaged public var firstName: String?
@NSManaged var isPatron: Bool @NSManaged public var isPatron: Bool
private override init(entity: NSEntityDescription, insertInto context: NSManagedObjectContext?) private override init(entity: NSEntityDescription, insertInto context: NSManagedObjectContext?)
{ {
@@ -64,7 +64,7 @@ class PatreonAccount: NSManagedObject, Fetchable
} }
} }
extension PatreonAccount public extension PatreonAccount
{ {
@nonobjc class func fetchRequest() -> NSFetchRequest<PatreonAccount> @nonobjc class func fetchRequest() -> NSFetchRequest<PatreonAccount>
{ {

View File

@@ -9,20 +9,20 @@
import CoreData import CoreData
@objc(RefreshAttempt) @objc(RefreshAttempt)
class RefreshAttempt: NSManagedObject, Fetchable public class RefreshAttempt: NSManagedObject, Fetchable
{ {
@NSManaged var identifier: String @NSManaged public var identifier: String
@NSManaged var date: Date @NSManaged public var date: Date
@NSManaged var isSuccess: Bool @NSManaged public var isSuccess: Bool
@NSManaged var errorDescription: String? @NSManaged public var errorDescription: String?
private override init(entity: NSEntityDescription, insertInto context: NSManagedObjectContext?) private override init(entity: NSEntityDescription, insertInto context: NSManagedObjectContext?)
{ {
super.init(entity: entity, insertInto: context) super.init(entity: entity, insertInto: context)
} }
init(identifier: String, result: Result<[String: Result<InstalledApp, Error>], Error>, context: NSManagedObjectContext) public init(identifier: String, result: Result<[String: Result<InstalledApp, Error>], Error>, context: NSManagedObjectContext)
{ {
super.init(entity: RefreshAttempt.entity(), insertInto: context) super.init(entity: RefreshAttempt.entity(), insertInto: context)
@@ -50,7 +50,7 @@ class RefreshAttempt: NSManagedObject, Fetchable
} }
} }
extension RefreshAttempt public extension RefreshAttempt
{ {
@nonobjc class func fetchRequest() -> NSFetchRequest<RefreshAttempt> @nonobjc class func fetchRequest() -> NSFetchRequest<RefreshAttempt>
{ {

View File

@@ -9,11 +9,11 @@
import Foundation import Foundation
@objc(ALTSecureValueTransformer) @objc(ALTSecureValueTransformer)
final class SecureValueTransformer: NSSecureUnarchiveFromDataTransformer public final class SecureValueTransformer: NSSecureUnarchiveFromDataTransformer
{ {
static let name = NSValueTransformerName(rawValue: "ALTSecureValueTransformer") public static let name = NSValueTransformerName(rawValue: "ALTSecureValueTransformer")
override static var allowedTopLevelClasses: [AnyClass] { public override static var allowedTopLevelClasses: [AnyClass] {
let allowedClasses = super.allowedTopLevelClasses + [NSError.self] let allowedClasses = super.allowedTopLevelClasses + [NSError.self]
return allowedClasses return allowedClasses
} }

View File

@@ -8,7 +8,7 @@
import CoreData import CoreData
extension Source public extension Source
{ {
#if ALPHA #if ALPHA
static let altStoreIdentifier = "com.rileytestut.AltStore.Alpha" static let altStoreIdentifier = "com.rileytestut.AltStore.Alpha"
@@ -36,23 +36,23 @@ extension Source
} }
@objc(Source) @objc(Source)
class Source: NSManagedObject, Fetchable, Decodable public class Source: NSManagedObject, Fetchable, Decodable
{ {
/* Properties */ /* Properties */
@NSManaged var name: String @NSManaged public var name: String
@NSManaged var identifier: String @NSManaged public var identifier: String
@NSManaged var sourceURL: URL @NSManaged public var sourceURL: URL
@NSManaged var error: NSError? @NSManaged public var error: NSError?
/* Non-Core Data Properties */ /* Non-Core Data Properties */
var userInfo: [ALTSourceUserInfoKey: String]? public var userInfo: [ALTSourceUserInfoKey: String]?
/* Relationships */ /* Relationships */
@objc(apps) @NSManaged private(set) var _apps: NSOrderedSet @objc(apps) @NSManaged public private(set) var _apps: NSOrderedSet
@objc(newsItems) @NSManaged private(set) var _newsItems: NSOrderedSet @objc(newsItems) @NSManaged public private(set) var _newsItems: NSOrderedSet
@nonobjc var apps: [StoreApp] { @nonobjc public var apps: [StoreApp] {
get { get {
return self._apps.array as! [StoreApp] return self._apps.array as! [StoreApp]
} }
@@ -61,7 +61,7 @@ class Source: NSManagedObject, Fetchable, Decodable
} }
} }
@nonobjc var newsItems: [NewsItem] { @nonobjc public var newsItems: [NewsItem] {
get { get {
return self._newsItems.array as! [NewsItem] return self._newsItems.array as! [NewsItem]
} }
@@ -85,7 +85,7 @@ class Source: NSManagedObject, Fetchable, Decodable
super.init(entity: entity, insertInto: context) super.init(entity: entity, insertInto: context)
} }
required init(from decoder: Decoder) throws public required init(from decoder: Decoder) throws
{ {
guard let context = decoder.managedObjectContext else { preconditionFailure("Decoder must have non-nil NSManagedObjectContext.") } guard let context = decoder.managedObjectContext else { preconditionFailure("Decoder must have non-nil NSManagedObjectContext.") }
guard let sourceURL = decoder.sourceURL else { preconditionFailure("Decoder must have non-nil sourceURL.") } guard let sourceURL = decoder.sourceURL else { preconditionFailure("Decoder must have non-nil sourceURL.") }
@@ -147,7 +147,7 @@ class Source: NSManagedObject, Fetchable, Decodable
} }
} }
extension Source public extension Source
{ {
@nonobjc class func fetchRequest() -> NSFetchRequest<Source> @nonobjc class func fetchRequest() -> NSFetchRequest<Source>
{ {

View File

@@ -12,7 +12,7 @@ import CoreData
import Roxas import Roxas
import AltSign import AltSign
extension StoreApp public extension StoreApp
{ {
#if ALPHA #if ALPHA
static let altstoreAppID = "com.rileytestut.AltStore.Alpha" static let altstoreAppID = "com.rileytestut.AltStore.Alpha"
@@ -29,40 +29,40 @@ extension StoreApp
} }
@objc(StoreApp) @objc(StoreApp)
class StoreApp: NSManagedObject, Decodable, Fetchable public class StoreApp: NSManagedObject, Decodable, Fetchable
{ {
/* Properties */ /* Properties */
@NSManaged private(set) var name: String @NSManaged public private(set) var name: String
@NSManaged private(set) var bundleIdentifier: String @NSManaged public private(set) var bundleIdentifier: String
@NSManaged private(set) var subtitle: String? @NSManaged public private(set) var subtitle: String?
@NSManaged private(set) var developerName: String @NSManaged public private(set) var developerName: String
@NSManaged private(set) var localizedDescription: String @NSManaged public private(set) var localizedDescription: String
@NSManaged private(set) var size: Int32 @NSManaged public private(set) var size: Int32
@NSManaged private(set) var iconURL: URL @NSManaged public private(set) var iconURL: URL
@NSManaged private(set) var screenshotURLs: [URL] @NSManaged public private(set) var screenshotURLs: [URL]
@NSManaged var version: String @NSManaged public var version: String
@NSManaged private(set) var versionDate: Date @NSManaged public private(set) var versionDate: Date
@NSManaged private(set) var versionDescription: String? @NSManaged public private(set) var versionDescription: String?
@NSManaged private(set) var downloadURL: URL @NSManaged public private(set) var downloadURL: URL
@NSManaged private(set) var tintColor: UIColor? @NSManaged public private(set) var tintColor: UIColor?
@NSManaged private(set) var isBeta: Bool @NSManaged public private(set) var isBeta: Bool
@NSManaged var sourceIdentifier: String? @NSManaged public var sourceIdentifier: String?
@NSManaged var sortIndex: Int32 @NSManaged public var sortIndex: Int32
/* Relationships */ /* Relationships */
@NSManaged var installedApp: InstalledApp? @NSManaged public var installedApp: InstalledApp?
@NSManaged var newsItems: Set<NewsItem> @NSManaged public var newsItems: Set<NewsItem>
@NSManaged @objc(source) var _source: Source? @NSManaged @objc(source) public var _source: Source?
@NSManaged @objc(permissions) var _permissions: NSOrderedSet @NSManaged @objc(permissions) public var _permissions: NSOrderedSet
@nonobjc var source: Source? { @nonobjc public var source: Source? {
set { set {
self._source = newValue self._source = newValue
self.sourceIdentifier = newValue?.identifier self.sourceIdentifier = newValue?.identifier
@@ -72,7 +72,7 @@ class StoreApp: NSManagedObject, Decodable, Fetchable
} }
} }
@nonobjc var permissions: [AppPermission] { @nonobjc public var permissions: [AppPermission] {
return self._permissions.array as! [AppPermission] return self._permissions.array as! [AppPermission]
} }
@@ -100,7 +100,7 @@ class StoreApp: NSManagedObject, Decodable, Fetchable
case isBeta = "beta" case isBeta = "beta"
} }
required init(from decoder: Decoder) throws public required init(from decoder: Decoder) throws
{ {
guard let context = decoder.managedObjectContext else { preconditionFailure("Decoder must have non-nil NSManagedObjectContext.") } guard let context = decoder.managedObjectContext else { preconditionFailure("Decoder must have non-nil NSManagedObjectContext.") }
@@ -153,7 +153,7 @@ class StoreApp: NSManagedObject, Decodable, Fetchable
} }
} }
extension StoreApp public extension StoreApp
{ {
@nonobjc class func fetchRequest() -> NSFetchRequest<StoreApp> @nonobjc class func fetchRequest() -> NSFetchRequest<StoreApp>
{ {

View File

@@ -11,7 +11,7 @@ import CoreData
import AltSign import AltSign
extension ALTTeamType public extension ALTTeamType
{ {
var localizedDescription: String { var localizedDescription: String {
switch self switch self
@@ -25,34 +25,34 @@ extension ALTTeamType
} }
} }
extension Team public extension Team
{ {
static let maximumFreeAppIDs = 10 static let maximumFreeAppIDs = 10
} }
@objc(Team) @objc(Team)
class Team: NSManagedObject, Fetchable public class Team: NSManagedObject, Fetchable
{ {
/* Properties */ /* Properties */
@NSManaged var name: String @NSManaged public var name: String
@NSManaged var identifier: String @NSManaged public var identifier: String
@NSManaged var type: ALTTeamType @NSManaged public var type: ALTTeamType
@NSManaged var isActiveTeam: Bool @NSManaged public var isActiveTeam: Bool
/* Relationships */ /* Relationships */
@NSManaged private(set) var account: Account! @NSManaged public private(set) var account: Account!
@NSManaged var installedApps: Set<InstalledApp> @NSManaged public var installedApps: Set<InstalledApp>
@NSManaged private(set) var appIDs: Set<AppID> @NSManaged public private(set) var appIDs: Set<AppID>
var altTeam: ALTTeam? public var altTeam: ALTTeam?
private override init(entity: NSEntityDescription, insertInto context: NSManagedObjectContext?) private override init(entity: NSEntityDescription, insertInto context: NSManagedObjectContext?)
{ {
super.init(entity: entity, insertInto: context) super.init(entity: entity, insertInto: context)
} }
init(_ team: ALTTeam, account: Account, context: NSManagedObjectContext) public init(_ team: ALTTeam, account: Account, context: NSManagedObjectContext)
{ {
super.init(entity: Team.entity(), insertInto: context) super.init(entity: Team.entity(), insertInto: context)
@@ -61,7 +61,7 @@ class Team: NSManagedObject, Fetchable
self.update(team: team) self.update(team: team)
} }
func update(team: ALTTeam) public func update(team: ALTTeam)
{ {
self.altTeam = team self.altTeam = team
@@ -71,7 +71,7 @@ class Team: NSManagedObject, Fetchable
} }
} }
extension Team public extension Team
{ {
@nonobjc class func fetchRequest() -> NSFetchRequest<Team> @nonobjc class func fetchRequest() -> NSFetchRequest<Team>
{ {

View File

@@ -16,9 +16,9 @@ extension PatreonAPI
} }
} }
struct Benefit: Hashable public struct Benefit: Hashable
{ {
var type: ALTPatreonBenefitType public var type: ALTPatreonBenefitType
init(response: PatreonAPI.BenefitResponse) init(response: PatreonAPI.BenefitResponse)
{ {

View File

@@ -16,9 +16,9 @@ extension PatreonAPI
} }
} }
struct Campaign public struct Campaign
{ {
var identifier: String public var identifier: String
init(response: PatreonAPI.CampaignResponse) init(response: PatreonAPI.CampaignResponse)
{ {

View File

@@ -71,11 +71,11 @@ extension PatreonAPI
} }
} }
class PatreonAPI: NSObject public class PatreonAPI: NSObject
{ {
static let shared = PatreonAPI() public static let shared = PatreonAPI()
var isAuthenticated: Bool { public var isAuthenticated: Bool {
return Keychain.shared.patreonAccessToken != nil return Keychain.shared.patreonAccessToken != nil
} }
@@ -90,7 +90,7 @@ class PatreonAPI: NSObject
} }
} }
extension PatreonAPI public extension PatreonAPI
{ {
func authenticate(completion: @escaping (Result<PatreonAccount, Swift.Error>) -> Void) func authenticate(completion: @escaping (Result<PatreonAccount, Swift.Error>) -> Void)
{ {
@@ -412,8 +412,8 @@ private extension PatreonAPI
@available(iOS 13.0, *) @available(iOS 13.0, *)
extension PatreonAPI: ASWebAuthenticationPresentationContextProviding extension PatreonAPI: ASWebAuthenticationPresentationContextProviding
{ {
func presentationAnchor(for session: ASWebAuthenticationSession) -> ASPresentationAnchor public func presentationAnchor(for session: ASWebAuthenticationSession) -> ASPresentationAnchor
{ {
return UIApplication.shared.keyWindow ?? UIWindow() return UIApplication.alt_shared?.keyWindow ?? UIWindow()
} }
} }

View File

@@ -43,7 +43,7 @@ extension PatreonAPI
extension Patron extension Patron
{ {
enum Status: String, Decodable public enum Status: String, Decodable
{ {
case active = "active_patron" case active = "active_patron"
case declined = "declined_patron" case declined = "declined_patron"
@@ -52,14 +52,14 @@ extension Patron
} }
} }
class Patron public class Patron
{ {
var name: String public var name: String
var identifier: String public var identifier: String
var status: Status public var status: Status
var benefits: Set<Benefit> = [] public var benefits: Set<Benefit> = []
init(response: PatreonAPI.PatronResponse) init(response: PatreonAPI.PatronResponse)
{ {

View File

@@ -34,12 +34,12 @@ extension PatreonAPI
} }
} }
struct Tier public struct Tier
{ {
var name: String public var name: String
var identifier: String public var identifier: String
var benefits: [Benefit] = [] public var benefits: [Benefit] = []
init(response: PatreonAPI.TierResponse) init(response: PatreonAPI.TierResponse)
{ {

View File

@@ -9,7 +9,7 @@
import Foundation import Foundation
import AltSign import AltSign
protocol AppProtocol public protocol AppProtocol
{ {
var name: String { get } var name: String { get }
var bundleIdentifier: String { get } var bundleIdentifier: String { get }
@@ -18,21 +18,21 @@ protocol AppProtocol
extension ALTApplication: AppProtocol extension ALTApplication: AppProtocol
{ {
var url: URL { public var url: URL {
return self.fileURL return self.fileURL
} }
} }
extension StoreApp: AppProtocol extension StoreApp: AppProtocol
{ {
var url: URL { public var url: URL {
return self.downloadURL return self.downloadURL
} }
} }
extension InstalledApp: AppProtocol extension InstalledApp: AppProtocol
{ {
var url: URL { public var url: URL {
return self.fileURL return self.fileURL
} }
} }

View File

@@ -8,13 +8,13 @@
import CoreData import CoreData
typealias FetchRequest = NSFetchRequest<NSFetchRequestResult> public typealias FetchRequest = NSFetchRequest<NSFetchRequestResult>
protocol Fetchable: NSManagedObject public protocol Fetchable: NSManagedObject
{ {
} }
extension Fetchable public extension Fetchable
{ {
static func first(satisfying predicate: NSPredicate? = nil, sortedBy sortDescriptors: [NSSortDescriptor]? = nil, in context: NSManagedObjectContext, static func first(satisfying predicate: NSPredicate? = nil, sortedBy sortDescriptors: [NSSortDescriptor]? = nil, in context: NSManagedObjectContext,
requestProperties: [PartialKeyPath<FetchRequest>: Any?] = [:]) -> Self? requestProperties: [PartialKeyPath<FetchRequest>: Any?] = [:]) -> Self?

14
Podfile
View File

@@ -3,10 +3,9 @@ inhibit_all_warnings!
target 'AltStore' do target 'AltStore' do
platform :ios, '12.0' platform :ios, '12.0'
use_modular_headers! use_frameworks!
# Pods for AltStore # Pods for AltStore
pod 'KeychainAccess', '~> 3.2.0'
pod 'Nuke', '~> 7.0' pod 'Nuke', '~> 7.0'
pod 'AppCenter', '~> 3.1.0' pod 'AppCenter', '~> 3.1.0'
pod 'Roxas', :path => 'Dependencies/Roxas' pod 'Roxas', :path => 'Dependencies/Roxas'
@@ -24,6 +23,17 @@ target 'AltServer' do
end end
target 'AltStoreCore' do
platform :ios, '12.0'
use_frameworks!
# Pods for AltServer
pod 'KeychainAccess', '~> 3.2.0'
pod 'Roxas', :path => 'Dependencies/Roxas'
end
target 'AltDaemon' do target 'AltDaemon' do
platform :ios, '12.0' platform :ios, '12.0'

View File

@@ -47,6 +47,6 @@ SPEC CHECKSUMS:
Sparkle: 3f75576db8b0265adef36c43249d747f22d0b708 Sparkle: 3f75576db8b0265adef36c43249d747f22d0b708
STPrivilegedTask: 56c3397238a1ec07720fb877a044898373cd2c68 STPrivilegedTask: 56c3397238a1ec07720fb877a044898373cd2c68
PODFILE CHECKSUM: 8e139db2a0c0a1d2f4affc7b615b6ca0720633ed PODFILE CHECKSUM: f76f10e8f2823d859ce9672d0b5d7054a5c24504
COCOAPODS: 1.9.3 COCOAPODS: 1.9.3

View File

@@ -1 +0,0 @@
../../../Target Support Files/KeychainAccess/KeychainAccess-umbrella.h

View File

@@ -1 +0,0 @@
../../../Target Support Files/KeychainAccess/KeychainAccess.modulemap

View File

@@ -1 +0,0 @@
../../../Target Support Files/Nuke/Nuke-umbrella.h

View File

@@ -1 +0,0 @@
../../../Target Support Files/Nuke/Nuke.modulemap

View File

@@ -0,0 +1 @@
../../../Target Support Files/Roxas-library/Roxas-library-umbrella.h

View File

@@ -0,0 +1 @@
../../../Target Support Files/Roxas-library/Roxas-library.modulemap

View File

@@ -1 +0,0 @@
../../../Target Support Files/Roxas/Roxas-umbrella.h

View File

@@ -1 +0,0 @@
../../../Target Support Files/Roxas/Roxas.modulemap

2
Pods/Manifest.lock generated
View File

@@ -47,6 +47,6 @@ SPEC CHECKSUMS:
Sparkle: 3f75576db8b0265adef36c43249d747f22d0b708 Sparkle: 3f75576db8b0265adef36c43249d747f22d0b708
STPrivilegedTask: 56c3397238a1ec07720fb877a044898373cd2c68 STPrivilegedTask: 56c3397238a1ec07720fb877a044898373cd2c68
PODFILE CHECKSUM: 8e139db2a0c0a1d2f4affc7b615b6ca0720633ed PODFILE CHECKSUM: f76f10e8f2823d859ce9672d0b5d7054a5c24504
COCOAPODS: 1.9.3 COCOAPODS: 1.9.3

Some files were not shown because too many files have changed in this diff Show More