diff --git a/AltStore.xcodeproj/project.pbxproj b/AltStore.xcodeproj/project.pbxproj index 9c261a5c..69ee2afd 100644 --- a/AltStore.xcodeproj/project.pbxproj +++ b/AltStore.xcodeproj/project.pbxproj @@ -3,12 +3,11 @@ archiveVersion = 1; classes = { }; - objectVersion = 70; + objectVersion = 75; objects = { /* Begin PBXBuildFile section */ 03F06CD52942C27E001C4D68 /* Bundle+AltStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF1E314122A05D4C00370A3C /* Bundle+AltStore.swift */; }; - 0E05025C2BEC947000879B5C /* String+SideStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E05025B2BEC947000879B5C /* String+SideStore.swift */; }; 0E1A1F912AE36A9700364CAD /* bytearray.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E1A1F902AE36A9600364CAD /* bytearray.c */; }; 0EA1665B2ADFE0D2003015C1 /* out-limd.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EA166472ADFE0D1003015C1 /* out-limd.c */; }; 0EA1665C2ADFE0D2003015C1 /* out-default.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EA166522ADFE0D2003015C1 /* out-default.c */; }; @@ -54,18 +53,9 @@ A809F69E2D04D7AC00F0F0F3 /* libminimuxer_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A809F68E2D04D71200F0F0F3 /* libminimuxer_static.a */; }; A809F6A82D04DA1900F0F0F3 /* minimuxer.swift in Sources */ = {isa = PBXBuildFile; fileRef = A809F6A32D04DA1900F0F0F3 /* minimuxer.swift */; }; A809F6A92D04DA1900F0F0F3 /* SwiftBridgeCore.swift in Sources */ = {isa = PBXBuildFile; fileRef = A809F6A72D04DA1900F0F0F3 /* SwiftBridgeCore.swift */; }; - A80D60D32D3DD85100CEF65D /* ReleaseTrack.swift in Sources */ = {isa = PBXBuildFile; fileRef = A80D60D12D3D705F00CEF65D /* ReleaseTrack.swift */; }; A80D790D2D2F20AF00A40F40 /* PaginationIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = A80D790C2D2F20AF00A40F40 /* PaginationIntent.swift */; }; A80D790F2D2F217000A40F40 /* PaginationDataHolder.swift in Sources */ = {isa = PBXBuildFile; fileRef = A80D790E2D2F217000A40F40 /* PaginationDataHolder.swift */; }; - A815AA952D90D2A100929A9E /* StoreApp17To17_1MigrationPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = A815AA942D90D2A100929A9E /* StoreApp17To17_1MigrationPolicy.swift */; }; - A815AA972D90E16400929A9E /* ReleaseTrack17To17_1MigrationPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = A815AA962D90E16400929A9E /* ReleaseTrack17To17_1MigrationPolicy.swift */; }; - A815AA992D90E5E500929A9E /* AltStore17ToAltStore17_1.xcmappingmodel in Sources */ = {isa = PBXBuildFile; fileRef = A815AA982D90E5E500929A9E /* AltStore17ToAltStore17_1.xcmappingmodel */; }; A815AA9F2D9104DD00929A9E /* BuildInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = A815AA9E2D9104DD00929A9E /* BuildInfo.swift */; }; - A815AAA12D9108BC00929A9E /* AltStore11ToAltStore17_1.xcmappingmodel in Sources */ = {isa = PBXBuildFile; fileRef = A815AAA02D9108BC00929A9E /* AltStore11ToAltStore17_1.xcmappingmodel */; }; - A815AAA72D9108CB00929A9E /* ReleaseTrack11To17_1MigrationPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = A815AAA42D9108CB00929A9E /* ReleaseTrack11To17_1MigrationPolicy.swift */; }; - A815AAA82D9108CB00929A9E /* AppPermission11To17_1MigrationPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = A815AAA52D9108CB00929A9E /* AppPermission11To17_1MigrationPolicy.swift */; }; - A815AAA92D9108CB00929A9E /* Source11To17_1MigrationPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = A815AAA22D9108CB00929A9E /* Source11To17_1MigrationPolicy.swift */; }; - A815AAAA2D9108CB00929A9E /* StoreApp11To17_1MigrationPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = A815AAA32D9108CB00929A9E /* StoreApp11To17_1MigrationPolicy.swift */; }; A81A8CB92D68B30B0086C96F /* SingletonGenericMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = A868CFE32D319988002F1201 /* SingletonGenericMap.swift */; }; A81A8CBA2D68B3110086C96F /* TreeMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = A81A8CB02D68B0320086C96F /* TreeMap.swift */; }; A81A8CBD2D68B43F0086C96F /* LinkedHashMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = A81A8CBC2D68B43F0086C96F /* LinkedHashMap.swift */; }; @@ -76,14 +66,11 @@ A81A8CD12D68BA9B0086C96F /* TreeMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = A81A8CB02D68B0320086C96F /* TreeMap.swift */; }; A81A8CD22D68BAA30086C96F /* SingletonGenericMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = A868CFE32D319988002F1201 /* SingletonGenericMap.swift */; }; A81A8CD42D68BAFF0086C96F /* DataStructureTests.xctestplan in Resources */ = {isa = PBXBuildFile; fileRef = A81A8CD32D68BAFF0086C96F /* DataStructureTests.xctestplan */; }; - A81BF9E52D84CB0C00768940 /* AppPermission17To17_1MigrationPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = A81BF9E22D84CB0C00768940 /* AppPermission17To17_1MigrationPolicy.swift */; }; - A81BF9E72D84CB0C00768940 /* Source17To17_1MigrationPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = A81BF9E32D84CB0C00768940 /* Source17To17_1MigrationPolicy.swift */; }; A82067842D03DC0600645C0D /* OperatingSystemVersion+Comparable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5708416292448DA00D42D34 /* OperatingSystemVersion+Comparable.swift */; }; A82067C42D03E0DE00645C0D /* SemanticVersion in Frameworks */ = {isa = PBXBuildFile; productRef = A82067C32D03E0DE00645C0D /* SemanticVersion */; }; A8228B5B2D6E2C0C00F7CE0E /* (null) in Sources */ = {isa = PBXBuildFile; }; A8228B5D2D6E361F00F7CE0E /* (null) in Sources */ = {isa = PBXBuildFile; }; A83FE3672EC90482005ACE9A /* Starscream in Frameworks */ = {isa = PBXBuildFile; productRef = A83FE3662EC90482005ACE9A /* Starscream */; }; - A83FE36C2EC904FD005ACE9A /* AppCenterCrashes in Frameworks */ = {isa = PBXBuildFile; productRef = A83FE36B2EC904FD005ACE9A /* AppCenterCrashes */; }; A83FE3772EC905E3005ACE9A /* KeychainAccess in Frameworks */ = {isa = PBXBuildFile; productRef = A83FE3762EC905E3005ACE9A /* KeychainAccess */; }; A83FE3CF2EC9219C005ACE9A /* libem_proxy_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A83FE3CE2EC9219C005ACE9A /* libem_proxy_static.a */; }; A83FE3D42EC92495005ACE9A /* libEmotionalDamage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A83FE3CD2EC9217F005ACE9A /* libEmotionalDamage.a */; }; @@ -91,7 +78,6 @@ A859ED5D2D1EE827003DCC58 /* OpenSSL.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = A859ED5B2D1EE80D003DCC58 /* OpenSSL.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; A86315DF2D3EB2DE0048FA40 /* ErrorProcessing.swift in Sources */ = {isa = PBXBuildFile; fileRef = A86315DE2D3EB2D80048FA40 /* ErrorProcessing.swift */; }; A8696EE42D34512C00E96389 /* RemoveAppExtensionsOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8696EE32D34512C00E96389 /* RemoveAppExtensionsOperation.swift */; }; - A881E7CB2D6EF5AB00954AD2 /* StoreApp11To17MigrationPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = A881E7CA2D6EF5AB00954AD2 /* StoreApp11To17MigrationPolicy.swift */; }; A88B8C492D35AD3200F53F9D /* OperationsLoggingContolView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A88B8C482D35AD3200F53F9D /* OperationsLoggingContolView.swift */; }; A88B8C552D35F1EC00F53F9D /* OperationsLoggingControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = A88B8C542D35F1EC00F53F9D /* OperationsLoggingControl.swift */; }; A8945AA62D059B6100D86CBE /* Roxas.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A8945AA52D059B6100D86CBE /* Roxas.framework */; }; @@ -117,13 +103,10 @@ A8C6D5142D1EE8D700DF01F1 /* OpenSSL.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = A859ED5B2D1EE80D003DCC58 /* OpenSSL.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; A8C6D5172D1EE95B00DF01F1 /* OpenSSL.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = A859ED5B2D1EE80D003DCC58 /* OpenSSL.xcframework */; }; A8C6D5182D1EE95B00DF01F1 /* OpenSSL.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = A859ED5B2D1EE80D003DCC58 /* OpenSSL.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - A8C924242D8E73B1009D9953 /* AltStore11ToAltStore17.xcmappingmodel in Sources */ = {isa = PBXBuildFile; fileRef = A8C924232D8E73B1009D9953 /* AltStore11ToAltStore17.xcmappingmodel */; }; A8D484D82D0CD306002C691D /* AltBackup.ipa in Resources */ = {isa = PBXBuildFile; fileRef = A8D484D72D0CD306002C691D /* AltBackup.ipa */; }; - A8D49F532D3D2F9400844B92 /* ProcessInfo+AltStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8D49F522D3D2F9400844B92 /* ProcessInfo+AltStore.swift */; }; A8E2DB312D684E2A009E5D31 /* UITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8E2DB2E2D684E2A009E5D31 /* UITests.swift */; }; A8E2DB322D684E2A009E5D31 /* UITestsLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8E2DB2F2D684E2A009E5D31 /* UITestsLaunchTests.swift */; }; A8E2DB342D68507F009E5D31 /* SideStoreTests.xctestplan in Resources */ = {isa = PBXBuildFile; fileRef = A8E2DB332D68507F009E5D31 /* SideStoreTests.xctestplan */; }; - A8EA195F2D4982D600DC6322 /* BaseEntity.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8EA195E2D4982D600DC6322 /* BaseEntity.swift */; }; A8F838932D048E8F00ED425D /* libminimuxer.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 191E5FAB290A5D92001A3B7C /* libminimuxer.a */; }; A8F838942D048ECE00ED425D /* libimobiledevice.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BF45872B2298D31600BD7491 /* libimobiledevice.a */; }; A8FD915E2D046F5200322782 /* UserInfoValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8FD915D2D046F5200322782 /* UserInfoValue.swift */; }; @@ -157,7 +140,6 @@ BF1FE359251A9FB000C3CE09 /* NSXPCConnection+MachServices.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF1FE357251A9FB000C3CE09 /* NSXPCConnection+MachServices.swift */; }; BF29012F2318F6B100D88A45 /* AppBannerView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BF29012E2318F6B100D88A45 /* AppBannerView.xib */; }; BF2901312318F7A800D88A45 /* AppBannerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF2901302318F7A800D88A45 /* AppBannerView.swift */; }; - BF340E9A250AD39500A192CB /* ViewApp.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = BF989191250AAE86002ACF50 /* ViewApp.intentdefinition */; }; BF3432FB246B894F0052F4A1 /* BackupAppOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF3432FA246B894F0052F4A1 /* BackupAppOperation.swift */; }; BF3BEFBF2408673400DE7D55 /* FetchProvisioningProfilesOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF3BEFBE2408673400DE7D55 /* FetchProvisioningProfilesOperation.swift */; }; BF3BEFC124086A1E00DE7D55 /* RefreshAppOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF3BEFC024086A1E00DE7D55 /* RefreshAppOperation.swift */; }; @@ -230,50 +212,8 @@ BF580496246A3CB5008AE704 /* UIColor+AltBackup.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF580495246A3CB5008AE704 /* UIColor+AltBackup.swift */; }; BF580498246A3D19008AE704 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF580497246A3D19008AE704 /* UIKit.framework */; }; BF663C4F2433ED8200DAA738 /* FileManager+DirectorySize.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF663C4E2433ED8200DAA738 /* FileManager+DirectorySize.swift */; }; - BF66EE822501AE50007EE018 /* AltStoreCore.h in Headers */ = {isa = PBXBuildFile; fileRef = BF66EE802501AE50007EE018 /* AltStoreCore.h */; settings = {ATTRIBUTES = (Public, ); }; }; BF66EE852501AE50007EE018 /* AltStoreCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF66EE7E2501AE50007EE018 /* AltStoreCore.framework */; }; BF66EE862501AE50007EE018 /* AltStoreCore.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = BF66EE7E2501AE50007EE018 /* AltStoreCore.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - BF66EE8C2501AEB2007EE018 /* Keychain.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF66EE8B2501AEB1007EE018 /* Keychain.swift */; }; - BF66EE942501AEBC007EE018 /* ALTAppPermissions.h in Headers */ = {isa = PBXBuildFile; fileRef = BF66EE8E2501AEBC007EE018 /* ALTAppPermissions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BF66EE952501AEBC007EE018 /* ALTSourceUserInfoKey.h in Headers */ = {isa = PBXBuildFile; fileRef = BF66EE8F2501AEBC007EE018 /* ALTSourceUserInfoKey.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BF66EE962501AEBC007EE018 /* ALTPatreonBenefitID.m in Sources */ = {isa = PBXBuildFile; fileRef = BF66EE902501AEBC007EE018 /* ALTPatreonBenefitID.m */; }; - BF66EE972501AEBC007EE018 /* ALTAppPermissions.m in Sources */ = {isa = PBXBuildFile; fileRef = BF66EE912501AEBC007EE018 /* ALTAppPermissions.m */; }; - BF66EE982501AEBC007EE018 /* ALTPatreonBenefitID.h in Headers */ = {isa = PBXBuildFile; fileRef = BF66EE922501AEBC007EE018 /* ALTPatreonBenefitID.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BF66EE992501AEBC007EE018 /* ALTSourceUserInfoKey.m in Sources */ = {isa = PBXBuildFile; fileRef = BF66EE932501AEBC007EE018 /* ALTSourceUserInfoKey.m */; }; - BF66EE9D2501AEC1007EE018 /* AppProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF66EE9B2501AEC1007EE018 /* AppProtocol.swift */; }; - BF66EE9E2501AEC1007EE018 /* Fetchable.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF66EE9C2501AEC1007EE018 /* Fetchable.swift */; }; - BF66EEA52501AEC5007EE018 /* Benefit.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF66EEA02501AEC5007EE018 /* Benefit.swift */; }; - BF66EEA62501AEC5007EE018 /* PatreonAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF66EEA12501AEC5007EE018 /* PatreonAPI.swift */; }; - BF66EEA72501AEC5007EE018 /* Campaign.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF66EEA22501AEC5007EE018 /* Campaign.swift */; }; - BF66EEA82501AEC5007EE018 /* Patron.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF66EEA32501AEC5007EE018 /* Patron.swift */; }; - BF66EEA92501AEC5007EE018 /* Tier.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF66EEA42501AEC5007EE018 /* Tier.swift */; }; - BF66EECC2501AECA007EE018 /* Source.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF66EEAB2501AECA007EE018 /* Source.swift */; }; - BF66EECD2501AECA007EE018 /* StoreAppPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF66EEAE2501AECA007EE018 /* StoreAppPolicy.swift */; }; - BF66EECE2501AECA007EE018 /* InstalledAppPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF66EEAF2501AECA007EE018 /* InstalledAppPolicy.swift */; }; - BF66EECF2501AECA007EE018 /* AltStoreToAltStore2.xcmappingmodel in Sources */ = {isa = PBXBuildFile; fileRef = BF66EEB12501AECA007EE018 /* AltStoreToAltStore2.xcmappingmodel */; }; - BF66EED02501AECA007EE018 /* AltStore6ToAltStore7.xcmappingmodel in Sources */ = {isa = PBXBuildFile; fileRef = BF66EEB22501AECA007EE018 /* AltStore6ToAltStore7.xcmappingmodel */; }; - BF66EED12501AECA007EE018 /* AltStore3ToAltStore4.xcmappingmodel in Sources */ = {isa = PBXBuildFile; fileRef = BF66EEB32501AECA007EE018 /* AltStore3ToAltStore4.xcmappingmodel */; }; - BF66EED22501AECA007EE018 /* AltStore4ToAltStore5.xcmappingmodel in Sources */ = {isa = PBXBuildFile; fileRef = BF66EEB42501AECA007EE018 /* AltStore4ToAltStore5.xcmappingmodel */; }; - BF66EED32501AECA007EE018 /* AltStore2ToAltStore3.xcmappingmodel in Sources */ = {isa = PBXBuildFile; fileRef = BF66EEB52501AECA007EE018 /* AltStore2ToAltStore3.xcmappingmodel */; }; - BF66EED42501AECA007EE018 /* AltStore5ToAltStore6.xcmappingmodel in Sources */ = {isa = PBXBuildFile; fileRef = BF66EEB62501AECA007EE018 /* AltStore5ToAltStore6.xcmappingmodel */; }; - BF66EED52501AECA007EE018 /* AltStore.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = BF66EEB72501AECA007EE018 /* AltStore.xcdatamodeld */; }; - BF66EED62501AECA007EE018 /* NewsItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF66EEBF2501AECA007EE018 /* NewsItem.swift */; }; - BF66EED72501AECA007EE018 /* InstalledApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF66EEC02501AECA007EE018 /* InstalledApp.swift */; }; - BF66EED82501AECA007EE018 /* SecureValueTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF66EEC12501AECA007EE018 /* SecureValueTransformer.swift */; }; - BF66EED92501AECA007EE018 /* Team.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF66EEC22501AECA007EE018 /* Team.swift */; }; - BF66EEDA2501AECA007EE018 /* RefreshAttempt.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF66EEC32501AECA007EE018 /* RefreshAttempt.swift */; }; - BF66EEDB2501AECA007EE018 /* StoreApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF66EEC42501AECA007EE018 /* StoreApp.swift */; }; - BF66EEDC2501AECA007EE018 /* MergePolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF66EEC52501AECA007EE018 /* MergePolicy.swift */; }; - BF66EEDD2501AECA007EE018 /* AppPermission.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF66EEC62501AECA007EE018 /* AppPermission.swift */; }; - BF66EEDE2501AECA007EE018 /* AppID.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF66EEC72501AECA007EE018 /* AppID.swift */; }; - BF66EEDF2501AECA007EE018 /* PatreonAccount.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF66EEC82501AECA007EE018 /* PatreonAccount.swift */; }; - BF66EEE02501AECA007EE018 /* Account.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF66EEC92501AECA007EE018 /* Account.swift */; }; - BF66EEE12501AECA007EE018 /* DatabaseManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF66EECA2501AECA007EE018 /* DatabaseManager.swift */; }; - BF66EEE22501AECA007EE018 /* InstalledExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF66EECB2501AECA007EE018 /* InstalledExtension.swift */; }; - BF66EEE82501AED0007EE018 /* UserDefaults+AltStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF66EEE42501AED0007EE018 /* UserDefaults+AltStore.swift */; }; - BF66EEE92501AED0007EE018 /* JSONDecoder+Properties.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF66EEE52501AED0007EE018 /* JSONDecoder+Properties.swift */; }; - BF66EEEA2501AED0007EE018 /* UIColor+Hex.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF66EEE62501AED0007EE018 /* UIColor+Hex.swift */; }; - BF66EEEB2501AED0007EE018 /* UIApplication+AppExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF66EEE72501AED0007EE018 /* UIApplication+AppExtension.swift */; }; BF6C8FAC242935ED00125131 /* NSAttributedString+Markdown.m in Sources */ = {isa = PBXBuildFile; fileRef = BF6C8FAA242935ED00125131 /* NSAttributedString+Markdown.m */; }; BF6C8FAE2429597900125131 /* AppBannerCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF6C8FAD2429597900125131 /* AppBannerCollectionViewCell.swift */; }; BF6C8FB02429599900125131 /* TextCollectionReusableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF6C8FAF2429599900125131 /* TextCollectionReusableView.swift */; }; @@ -285,7 +225,6 @@ BF770E6722BD57C4002A40FE /* BackgroundTaskManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF770E6622BD57C3002A40FE /* BackgroundTaskManager.swift */; }; BF770E6922BD57DD002A40FE /* Silence.m4a in Resources */ = {isa = PBXBuildFile; fileRef = BF770E6822BD57DD002A40FE /* Silence.m4a */; }; BF88F97224F8727D00BB75DF /* AppManagerErrors.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF88F97124F8727D00BB75DF /* AppManagerErrors.swift */; }; - BF8B17EB250AC40000F8157F /* FileManager+SharedDirectories.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF6A531F246DC1B0004F59C8 /* FileManager+SharedDirectories.swift */; }; BF8CAE4E248AEABA004D6CCE /* UIDevice+Jailbreak.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF8CAE4D248AEABA004D6CCE /* UIDevice+Jailbreak.swift */; }; BF8F69C222E659F700049BA1 /* AppContentViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF8F69C122E659F700049BA1 /* AppContentViewController.swift */; }; BF8F69C422E662D300049BA1 /* AppViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF8F69C322E662D300049BA1 /* AppViewController.swift */; }; @@ -293,8 +232,6 @@ BF989177250AABF4002ACF50 /* AltWidgetExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = BF989167250AABF3002ACF50 /* AltWidgetExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; BF98917E250AAC4F002ACF50 /* Countdown.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF98917C250AAC4F002ACF50 /* Countdown.swift */; }; BF98917F250AAC4F002ACF50 /* LockScreenWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF98917D250AAC4F002ACF50 /* LockScreenWidget.swift */; }; - BF989184250AACFC002ACF50 /* Date+RelativeDate.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFDB5B1522EE90D300F74113 /* Date+RelativeDate.swift */; }; - BF989185250AAD1D002ACF50 /* UIColor+AltStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFD2479E2284FBD000981D42 /* UIColor+AltStore.swift */; }; BF9ABA4522DCFF43008935CF /* BrowseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9ABA4422DCFF43008935CF /* BrowseViewController.swift */; }; BF9ABA4922DD0742008935CF /* ScreenshotCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9ABA4822DD0742008935CF /* ScreenshotCollectionViewCell.swift */; }; BF9ABA4B22DD1380008935CF /* NavigationBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9ABA4A22DD137F008935CF /* NavigationBar.swift */; }; @@ -319,16 +256,12 @@ BFB6B21E231870160022A802 /* NewsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFB6B21D231870160022A802 /* NewsViewController.swift */; }; BFB6B220231870B00022A802 /* NewsCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFB6B21F231870B00022A802 /* NewsCollectionViewCell.swift */; }; BFB6B22423187A3D0022A802 /* NewsCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BFB6B22323187A3D0022A802 /* NewsCollectionViewCell.xib */; }; - BFBE0004250ACFFB0080826E /* ViewApp.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = BF989191250AAE86002ACF50 /* ViewApp.intentdefinition */; settings = {ATTRIBUTES = (no_codegen, ); }; }; - BFBE0007250AD0E70080826E /* ViewAppIntentHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF989190250AAE86002ACF50 /* ViewAppIntentHandler.swift */; }; - BFBF331B2526762200B7B8C9 /* AltStore8ToAltStore9.xcmappingmodel in Sources */ = {isa = PBXBuildFile; fileRef = BFBF331A2526762200B7B8C9 /* AltStore8ToAltStore9.xcmappingmodel */; }; BFC1F38D22AEE3A4003AC21A /* DownloadAppOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFC1F38C22AEE3A4003AC21A /* DownloadAppOperation.swift */; }; BFC57A652416C72400EB891E /* DeactivateAppOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFC57A642416C72400EB891E /* DeactivateAppOperation.swift */; }; BFC57A6E2416FC5D00EB891E /* InstalledAppsCollectionHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFC57A6D2416FC5D00EB891E /* InstalledAppsCollectionHeaderView.swift */; }; BFC57A702416FC7600EB891E /* InstalledAppsCollectionHeaderView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BFC57A6F2416FC7600EB891E /* InstalledAppsCollectionHeaderView.xib */; }; BFC712C42512D5F100AB5EBE /* XPCConnection.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFC712C12512D5F100AB5EBE /* XPCConnection.swift */; }; BFC84A4D2421A19100853474 /* SourcesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFC84A4C2421A19100853474 /* SourcesViewController.swift */; }; - BFCB9207250AB2120057B44E /* Colors.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = BFCB9206250AB2120057B44E /* Colors.xcassets */; }; BFCCB51A245E3401001853EA /* VerifyAppOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFCCB519245E3401001853EA /* VerifyAppOperation.swift */; }; BFD2476E2284B9A500981D42 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFD2476D2284B9A500981D42 /* AppDelegate.swift */; }; BFD247752284B9A500981D42 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = BFD247732284B9A500981D42 /* Main.storyboard */; }; @@ -375,35 +308,19 @@ D5151BE12A90344300C96F28 /* RefreshAllAppsWidgetIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5151BE02A90344300C96F28 /* RefreshAllAppsWidgetIntent.swift */; }; D5151BE22A90363300C96F28 /* RefreshAllAppsWidgetIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5151BE02A90344300C96F28 /* RefreshAllAppsWidgetIntent.swift */; }; D5151BE72A90395400C96F28 /* View+AltWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5151BE52A90391900C96F28 /* View+AltWidget.swift */; }; - D5185B822AE1E71D00646E33 /* Source11To17MigrationPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5185B812AE1E71D00646E33 /* Source11To17MigrationPolicy.swift */; }; - D519AD46292D665B004B12F9 /* Managed.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFB39B5B252BC10E00D1BE50 /* Managed.swift */; }; - D52A2F972ACB40F700BDF8E3 /* Logger+AltStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = D52A2F962ACB40F700BDF8E3 /* Logger+AltStore.swift */; }; - D52B4ABF2AF183F0005991C3 /* WebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D52B4ABE2AF183F0005991C3 /* WebViewController.swift */; }; - D52C08EE28AEC37A006C4AE5 /* AppVersion.swift in Sources */ = {isa = PBXBuildFile; fileRef = D52C08ED28AEC37A006C4AE5 /* AppVersion.swift */; }; D52C8F012AFC144C00CA0BDD /* FeaturedViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D52C8F002AFC144C00CA0BDD /* FeaturedViewController.swift */; }; - D52C8F032AFC56F000CA0BDD /* StoreCategory.swift in Sources */ = {isa = PBXBuildFile; fileRef = D52C8F022AFC56F000CA0BDD /* StoreCategory.swift */; }; D52EF2BE2A0594550096C377 /* AppDetailCollectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D52EF2BD2A0594550096C377 /* AppDetailCollectionViewController.swift */; }; - D533E8BE2727BBF800A9B5DD /* libcurl.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D533E8BD2727BBF800A9B5DD /* libcurl.a */; }; D5390C3C2AC3A43900D17E62 /* AddSourceViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5390C3B2AC3A43900D17E62 /* AddSourceViewController.swift */; }; - D53D84022A2158FC00543C3B /* Permissions.plist in Resources */ = {isa = PBXBuildFile; fileRef = D53D84012A2158FC00543C3B /* Permissions.plist */; }; D54058B92A1D6269008CCC58 /* AppPermissionProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = D54058B82A1D6269008CCC58 /* AppPermissionProtocol.swift */; }; D54058BB2A1D8FE3008CCC58 /* UIColor+AltStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = D54058BA2A1D8FE3008CCC58 /* UIColor+AltStore.swift */; }; D5418F172AD740890014ABD6 /* AppScreenshotCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5418F162AD740890014ABD6 /* AppScreenshotCollectionViewCell.swift */; }; D54DED1428CBC44B008B27A0 /* ErrorLogTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D54DED1328CBC44B008B27A0 /* ErrorLogTableViewCell.swift */; }; D552B1D82A042A740066216F /* AppPermissionsCard.swift in Sources */ = {isa = PBXBuildFile; fileRef = D552B1D72A042A740066216F /* AppPermissionsCard.swift */; }; - D552EB062AF453F900A3AB4D /* URL+Normalized.swift in Sources */ = {isa = PBXBuildFile; fileRef = D552EB052AF453F900A3AB4D /* URL+Normalized.swift */; }; D55467B82A8D5E2600F4CE90 /* AppShortcuts.swift in Sources */ = {isa = PBXBuildFile; fileRef = D55467B12A8D5E2600F4CE90 /* AppShortcuts.swift */; }; D55467C52A8D72C300F4CE90 /* ActiveAppsWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = D55467C42A8D72C300F4CE90 /* ActiveAppsWidget.swift */; }; - D557A4812AE85BB0007D0DCF /* Pledge.swift in Sources */ = {isa = PBXBuildFile; fileRef = D557A4802AE85BB0007D0DCF /* Pledge.swift */; }; - D557A4832AE85DB7007D0DCF /* PledgeReward.swift in Sources */ = {isa = PBXBuildFile; fileRef = D557A4822AE85DB7007D0DCF /* PledgeReward.swift */; }; - D557A4852AE88227007D0DCF /* PledgeTier.swift in Sources */ = {isa = PBXBuildFile; fileRef = D557A4842AE88227007D0DCF /* PledgeTier.swift */; }; - D561AF822B21669400BF59C6 /* VerifyAppPledgeOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D561AF812B21669400BF59C6 /* VerifyAppPledgeOperation.swift */; }; - D56915072AD5E91B00A2B747 /* Regex+Permissions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D56915052AD5D75B00A2B747 /* Regex+Permissions.swift */; }; D569A5042AF9BC5F00A4CB8B /* ReviewPermissionsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D569A5032AF9BC5F00A4CB8B /* ReviewPermissionsViewController.swift */; }; D56D21402B7D9942007641C5 /* AltAppIconsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D56D213F2B7D9942007641C5 /* AltAppIconsViewController.swift */; }; D56D21422B7D9C41007641C5 /* AltIcons.plist in Resources */ = {isa = PBXBuildFile; fileRef = D56D21412B7D9C41007641C5 /* AltIcons.plist */; }; - D571ADD02A02FC7200B24B63 /* ALTAppPermission.swift in Sources */ = {isa = PBXBuildFile; fileRef = D571ADCF2A02FC7200B24B63 /* ALTAppPermission.swift */; }; - D5728CA72A0D79D30014E73C /* OptionalProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5728CA62A0D79D30014E73C /* OptionalProtocol.swift */; }; D577AB7B2A967DF5007FE952 /* AppsTimelineProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = D577AB7A2A967DF5007FE952 /* AppsTimelineProvider.swift */; }; D577AB7F2A96878A007FE952 /* AppDetailWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = D577AB7E2A96878A007FE952 /* AppDetailWidget.swift */; }; D57968CB29CB99EF00539069 /* VibrantButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = D57968CA29CB99EF00539069 /* VibrantButton.swift */; }; @@ -412,8 +329,6 @@ D57F2C9126E0070200B9FA39 /* EnableJITOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D57F2C9026E0070200B9FA39 /* EnableJITOperation.swift */; }; D57F2C9426E01BC700B9FA39 /* UIDevice+Vibration.swift in Sources */ = {isa = PBXBuildFile; fileRef = D57F2C9326E01BC700B9FA39 /* UIDevice+Vibration.swift */; }; D57FE84428C7DB7100216002 /* ErrorLogViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D57FE84328C7DB7100216002 /* ErrorLogViewController.swift */; }; - D58916FE28C7C55C00E39C8B /* LoggedError.swift in Sources */ = {isa = PBXBuildFile; fileRef = D58916FD28C7C55C00E39C8B /* LoggedError.swift */; }; - D5893F802A1419E800E767CD /* NSManagedObjectContext+Conveniences.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5893F7E2A14183200E767CD /* NSManagedObjectContext+Conveniences.swift */; }; D59162AB29BA60A9005CBF47 /* SourceHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D59162AA29BA60A9005CBF47 /* SourceHeaderView.swift */; }; D59162AD29BA616A005CBF47 /* SourceHeaderView.xib in Resources */ = {isa = PBXBuildFile; fileRef = D59162AC29BA616A005CBF47 /* SourceHeaderView.xib */; }; D5927D6629DCC89000D6898E /* UINavigationBarAppearance+TintColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5927D6529DCC89000D6898E /* UINavigationBarAppearance+TintColor.swift */; }; @@ -422,32 +337,18 @@ D593F1942717749A006E82DE /* PatchAppOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D593F1932717749A006E82DE /* PatchAppOperation.swift */; }; D5A0537329B91DB400997551 /* SourceDetailContentViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5A0537229B91DB400997551 /* SourceDetailContentViewController.swift */; }; D5A645212AF591980047D980 /* UTType+AltStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5A645202AF591980047D980 /* UTType+AltStore.swift */; }; - D5A645232AF5B5C50047D980 /* PatreonAPI+Responses.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5A645222AF5B5C50047D980 /* PatreonAPI+Responses.swift */; }; - D5A645252AF5BC7F0047D980 /* UserAccount.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5A645242AF5BC7F0047D980 /* UserAccount.swift */; }; D5ACE84528E3B8450021CAB9 /* ClearAppCacheOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5ACE84428E3B8450021CAB9 /* ClearAppCacheOperation.swift */; }; - D5B6F6A92AD75D01007EED5A /* ProcessInfo+Previews.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5B6F6A82AD75D01007EED5A /* ProcessInfo+Previews.swift */; }; D5B6F6AB2AD76541007EED5A /* PreviewAppScreenshotsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5B6F6AA2AD76541007EED5A /* PreviewAppScreenshotsViewController.swift */; }; D5C0E7672AD9C75900530CA4 /* AppCardCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5C0E7662AD9C75900530CA4 /* AppCardCollectionViewCell.swift */; }; - D5CA0C4B280E141900469595 /* ManagedPatron.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5CA0C4A280E141900469595 /* ManagedPatron.swift */; }; - D5CA0C4E280E249E00469595 /* AltStore9ToAltStore10.xcmappingmodel in Sources */ = {isa = PBXBuildFile; fileRef = D5CA0C4D280E249E00469595 /* AltStore9ToAltStore10.xcmappingmodel */; }; D5CD805D29CA2C1E00E591B0 /* HeaderContentViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5CD805C29CA2C1E00E591B0 /* HeaderContentViewController.swift */; }; D5CD805F29CA755E00E591B0 /* SourceDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5CD805E29CA755E00E591B0 /* SourceDetailViewController.swift */; }; - D5DAE0962804DF430034D8D4 /* UpdatePatronsOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5DAE0952804DF430034D8D4 /* UpdatePatronsOperation.swift */; }; - D5DB81642B0410BC003F5F8B /* AppSorting.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5DB81632B0410BC003F5F8B /* AppSorting.swift */; }; D5E1E7C128077DE90016FC96 /* UpdateKnownSourcesOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5E1E7C028077DE90016FC96 /* UpdateKnownSourcesOperation.swift */; }; D5E3FB9828FDFAD90034B72C /* NSError+AltStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF6C336124197D700034FD24 /* NSError+AltStore.swift */; }; D5F2F6A92720B7C20081CCF5 /* PatchViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5F2F6A82720B7C20081CCF5 /* PatchViewController.swift */; }; - D5F48B4829CCF21B002B52A4 /* AltStore+Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5F48B4729CCF21B002B52A4 /* AltStore+Async.swift */; }; - D5F48B4C29CD0C48002B52A4 /* AsyncManaged.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5F48B4929CD0B67002B52A4 /* AsyncManaged.swift */; }; - D5F9821D2AB900060045751F /* AppScreenshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5F9821C2AB900060045751F /* AppScreenshot.swift */; }; D5F982212AB910180045751F /* AppScreenshotsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5F982202AB910180045751F /* AppScreenshotsViewController.swift */; }; - D5F99A1828D11DB500476A16 /* AltStore10ToAltStore11.xcmappingmodel in Sources */ = {isa = PBXBuildFile; fileRef = D5F99A1728D11DB500476A16 /* AltStore10ToAltStore11.xcmappingmodel */; }; - D5F99A1A28D12B1400476A16 /* StoreApp10ToStoreApp11Policy.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5F99A1928D12B1400476A16 /* StoreApp10ToStoreApp11Policy.swift */; }; D5FB28EC2ADDF68D00A1C337 /* UIFontDescriptor+Bold.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5FB28EB2ADDF68D00A1C337 /* UIFontDescriptor+Bold.swift */; }; - D5FB28EE2ADDF89800A1C337 /* KnownSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5893F812A141E4900E767CD /* KnownSource.swift */; }; D5FD4EC52A952EAD0097BEE8 /* AltWidgetBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5FD4EC42A952EAD0097BEE8 /* AltWidgetBundle.swift */; }; D5FD4EC92A9530C00097BEE8 /* AppSnapshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5FD4EC82A9530C00097BEE8 /* AppSnapshot.swift */; }; - D5FD4ECB2A9532960097BEE8 /* DatabaseManager+Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5FD4ECA2A9532960097BEE8 /* DatabaseManager+Async.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -608,7 +509,6 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0E05025B2BEC947000879B5C /* String+SideStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+SideStore.swift"; sourceTree = ""; }; 0E1A1F902AE36A9600364CAD /* bytearray.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = bytearray.c; path = src/bytearray.c; sourceTree = ""; }; 0E214ADD2E6DD75200B3D63D /* SideStoreDebug.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = SideStoreDebug.entitlements; sourceTree = ""; }; 0EA166412ADFE0D1003015C1 /* jplist.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = jplist.c; path = Dependencies/libplist/src/jplist.c; sourceTree = SOURCE_ROOT; }; @@ -666,18 +566,9 @@ A809F6A52D04DA1900F0F0F3 /* minimuxer-helpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "minimuxer-helpers.swift"; sourceTree = ""; }; A809F6A62D04DA1900F0F0F3 /* SwiftBridgeCore.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SwiftBridgeCore.h; sourceTree = ""; }; A809F6A72D04DA1900F0F0F3 /* SwiftBridgeCore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftBridgeCore.swift; sourceTree = ""; }; - A80D60D12D3D705F00CEF65D /* ReleaseTrack.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReleaseTrack.swift; sourceTree = ""; }; A80D790C2D2F20AF00A40F40 /* PaginationIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaginationIntent.swift; sourceTree = ""; }; A80D790E2D2F217000A40F40 /* PaginationDataHolder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaginationDataHolder.swift; sourceTree = ""; }; - A815AA942D90D2A100929A9E /* StoreApp17To17_1MigrationPolicy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreApp17To17_1MigrationPolicy.swift; sourceTree = ""; }; - A815AA962D90E16400929A9E /* ReleaseTrack17To17_1MigrationPolicy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReleaseTrack17To17_1MigrationPolicy.swift; sourceTree = ""; }; - A815AA982D90E5E500929A9E /* AltStore17ToAltStore17_1.xcmappingmodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcmappingmodel; path = AltStore17ToAltStore17_1.xcmappingmodel; sourceTree = ""; }; A815AA9E2D9104DD00929A9E /* BuildInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BuildInfo.swift; sourceTree = ""; }; - A815AAA02D9108BC00929A9E /* AltStore11ToAltStore17_1.xcmappingmodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcmappingmodel; path = AltStore11ToAltStore17_1.xcmappingmodel; sourceTree = ""; }; - A815AAA22D9108CB00929A9E /* Source11To17_1MigrationPolicy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Source11To17_1MigrationPolicy.swift; sourceTree = ""; }; - A815AAA32D9108CB00929A9E /* StoreApp11To17_1MigrationPolicy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreApp11To17_1MigrationPolicy.swift; sourceTree = ""; }; - A815AAA42D9108CB00929A9E /* ReleaseTrack11To17_1MigrationPolicy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReleaseTrack11To17_1MigrationPolicy.swift; sourceTree = ""; }; - A815AAA52D9108CB00929A9E /* AppPermission11To17_1MigrationPolicy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppPermission11To17_1MigrationPolicy.swift; sourceTree = ""; }; A81A8CB02D68B0320086C96F /* TreeMap.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TreeMap.swift; sourceTree = ""; }; A81A8CB42D68B2180086C96F /* TreeMapTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TreeMapTests.swift; sourceTree = ""; }; A81A8CBC2D68B43F0086C96F /* LinkedHashMap.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LinkedHashMap.swift; sourceTree = ""; }; @@ -685,9 +576,6 @@ A81A8CC52D68BA610086C96F /* DataStructureTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DataStructureTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; A81A8CC72D68BA610086C96F /* DataStructuresTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataStructuresTests.swift; sourceTree = ""; }; A81A8CD32D68BAFF0086C96F /* DataStructureTests.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = DataStructureTests.xctestplan; sourceTree = ""; }; - A81BF9E12D84C9E900768940 /* AltStore 17_1.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "AltStore 17_1.xcdatamodel"; sourceTree = ""; }; - A81BF9E22D84CB0C00768940 /* AppPermission17To17_1MigrationPolicy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppPermission17To17_1MigrationPolicy.swift; sourceTree = ""; }; - A81BF9E32D84CB0C00768940 /* Source17To17_1MigrationPolicy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Source17To17_1MigrationPolicy.swift; sourceTree = ""; }; A83FE3A32EC91F35005ACE9A /* em_proxy.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = em_proxy.xcodeproj; sourceTree = ""; }; A83FE3CD2EC9217F005ACE9A /* libEmotionalDamage.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libEmotionalDamage.a; sourceTree = BUILT_PRODUCTS_DIR; }; A83FE3CE2EC9219C005ACE9A /* libem_proxy_static.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libem_proxy_static.a; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -703,7 +591,6 @@ A86315DE2D3EB2D80048FA40 /* ErrorProcessing.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorProcessing.swift; sourceTree = ""; }; A868CFE32D319988002F1201 /* SingletonGenericMap.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SingletonGenericMap.swift; sourceTree = ""; }; A8696EE32D34512C00E96389 /* RemoveAppExtensionsOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoveAppExtensionsOperation.swift; sourceTree = ""; }; - A881E7CA2D6EF5AB00954AD2 /* StoreApp11To17MigrationPolicy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreApp11To17MigrationPolicy.swift; sourceTree = ""; }; A881E8562D6FBBAF00954AD2 /* DataStructureTests.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = DataStructureTests.xcconfig; sourceTree = ""; }; A88B8C482D35AD3200F53F9D /* OperationsLoggingContolView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OperationsLoggingContolView.swift; sourceTree = ""; }; A88B8C542D35F1EC00F53F9D /* OperationsLoggingControl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OperationsLoggingControl.swift; sourceTree = ""; }; @@ -719,15 +606,12 @@ A8C38C2B2D206AD900E83DBD /* AbstractClassError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AbstractClassError.swift; sourceTree = ""; }; A8C38C312D206B2500E83DBD /* FileOutputStream.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileOutputStream.swift; sourceTree = ""; }; A8C38C372D2084D000E83DBD /* ConsoleLogView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConsoleLogView.swift; sourceTree = ""; }; - A8C924232D8E73B1009D9953 /* AltStore11ToAltStore17.xcmappingmodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcmappingmodel; path = AltStore11ToAltStore17.xcmappingmodel; sourceTree = ""; }; A8D484D72D0CD306002C691D /* AltBackup.ipa */ = {isa = PBXFileReference; lastKnownFileType = file; path = AltBackup.ipa; sourceTree = ""; }; - A8D49F522D3D2F9400844B92 /* ProcessInfo+AltStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ProcessInfo+AltStore.swift"; sourceTree = ""; }; A8E2DB212D684CBD009E5D31 /* UITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = UITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; A8E2DB2C2D684D39009E5D31 /* UITests.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = UITests.xcconfig; sourceTree = ""; }; A8E2DB2E2D684E2A009E5D31 /* UITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UITests.swift; sourceTree = ""; }; A8E2DB2F2D684E2A009E5D31 /* UITestsLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UITestsLaunchTests.swift; sourceTree = ""; }; A8E2DB332D68507F009E5D31 /* SideStoreTests.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = SideStoreTests.xctestplan; sourceTree = ""; }; - A8EA195E2D4982D600DC6322 /* BaseEntity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseEntity.swift; sourceTree = ""; }; A8F66C602D04D464009689E6 /* minimuxer.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = minimuxer.xcodeproj; sourceTree = ""; }; A8FD915B2D046EF100322782 /* ProcessError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProcessError.swift; sourceTree = ""; }; A8FD915D2D046F5200322782 /* UserInfoValue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserInfoValue.swift; sourceTree = ""; }; @@ -846,56 +730,6 @@ BF580499246A4153008AE704 /* AltBackup.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = AltBackup.entitlements; sourceTree = ""; }; BF663C4E2433ED8200DAA738 /* FileManager+DirectorySize.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "FileManager+DirectorySize.swift"; sourceTree = ""; }; BF66EE7E2501AE50007EE018 /* AltStoreCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = AltStoreCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - BF66EE802501AE50007EE018 /* AltStoreCore.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AltStoreCore.h; sourceTree = ""; }; - BF66EE812501AE50007EE018 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - BF66EE8B2501AEB1007EE018 /* Keychain.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Keychain.swift; sourceTree = ""; }; - BF66EE8E2501AEBC007EE018 /* ALTAppPermissions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ALTAppPermissions.h; sourceTree = ""; }; - BF66EE8F2501AEBC007EE018 /* ALTSourceUserInfoKey.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ALTSourceUserInfoKey.h; sourceTree = ""; }; - BF66EE902501AEBC007EE018 /* ALTPatreonBenefitID.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ALTPatreonBenefitID.m; sourceTree = ""; }; - BF66EE912501AEBC007EE018 /* ALTAppPermissions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ALTAppPermissions.m; sourceTree = ""; }; - BF66EE922501AEBC007EE018 /* ALTPatreonBenefitID.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ALTPatreonBenefitID.h; sourceTree = ""; }; - BF66EE932501AEBC007EE018 /* ALTSourceUserInfoKey.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ALTSourceUserInfoKey.m; sourceTree = ""; }; - BF66EE9B2501AEC1007EE018 /* AppProtocol.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppProtocol.swift; sourceTree = ""; }; - BF66EE9C2501AEC1007EE018 /* Fetchable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Fetchable.swift; sourceTree = ""; }; - BF66EEA02501AEC5007EE018 /* Benefit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Benefit.swift; sourceTree = ""; }; - BF66EEA12501AEC5007EE018 /* PatreonAPI.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PatreonAPI.swift; sourceTree = ""; }; - BF66EEA22501AEC5007EE018 /* Campaign.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Campaign.swift; sourceTree = ""; }; - BF66EEA32501AEC5007EE018 /* Patron.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Patron.swift; sourceTree = ""; }; - BF66EEA42501AEC5007EE018 /* Tier.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Tier.swift; sourceTree = ""; }; - BF66EEAB2501AECA007EE018 /* Source.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Source.swift; sourceTree = ""; }; - BF66EEAE2501AECA007EE018 /* StoreAppPolicy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StoreAppPolicy.swift; sourceTree = ""; }; - BF66EEAF2501AECA007EE018 /* InstalledAppPolicy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InstalledAppPolicy.swift; sourceTree = ""; }; - BF66EEB12501AECA007EE018 /* AltStoreToAltStore2.xcmappingmodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcmappingmodel; path = AltStoreToAltStore2.xcmappingmodel; sourceTree = ""; }; - BF66EEB22501AECA007EE018 /* AltStore6ToAltStore7.xcmappingmodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcmappingmodel; path = AltStore6ToAltStore7.xcmappingmodel; sourceTree = ""; }; - BF66EEB32501AECA007EE018 /* AltStore3ToAltStore4.xcmappingmodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcmappingmodel; path = AltStore3ToAltStore4.xcmappingmodel; sourceTree = ""; }; - BF66EEB42501AECA007EE018 /* AltStore4ToAltStore5.xcmappingmodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcmappingmodel; path = AltStore4ToAltStore5.xcmappingmodel; sourceTree = ""; }; - BF66EEB52501AECA007EE018 /* AltStore2ToAltStore3.xcmappingmodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcmappingmodel; path = AltStore2ToAltStore3.xcmappingmodel; sourceTree = ""; }; - BF66EEB62501AECA007EE018 /* AltStore5ToAltStore6.xcmappingmodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcmappingmodel; path = AltStore5ToAltStore6.xcmappingmodel; sourceTree = ""; }; - BF66EEB82501AECA007EE018 /* AltStore 3.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "AltStore 3.xcdatamodel"; sourceTree = ""; }; - BF66EEB92501AECA007EE018 /* AltStore.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = AltStore.xcdatamodel; sourceTree = ""; }; - BF66EEBA2501AECA007EE018 /* AltStore 6.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "AltStore 6.xcdatamodel"; sourceTree = ""; }; - BF66EEBB2501AECA007EE018 /* AltStore 5.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "AltStore 5.xcdatamodel"; sourceTree = ""; }; - BF66EEBC2501AECA007EE018 /* AltStore 7.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "AltStore 7.xcdatamodel"; sourceTree = ""; }; - BF66EEBD2501AECA007EE018 /* AltStore 2.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "AltStore 2.xcdatamodel"; sourceTree = ""; }; - BF66EEBE2501AECA007EE018 /* AltStore 4.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "AltStore 4.xcdatamodel"; sourceTree = ""; }; - BF66EEBF2501AECA007EE018 /* NewsItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NewsItem.swift; sourceTree = ""; }; - BF66EEC02501AECA007EE018 /* InstalledApp.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InstalledApp.swift; sourceTree = ""; }; - BF66EEC12501AECA007EE018 /* SecureValueTransformer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SecureValueTransformer.swift; sourceTree = ""; }; - BF66EEC22501AECA007EE018 /* Team.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Team.swift; sourceTree = ""; }; - BF66EEC32501AECA007EE018 /* RefreshAttempt.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RefreshAttempt.swift; sourceTree = ""; }; - BF66EEC42501AECA007EE018 /* StoreApp.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StoreApp.swift; sourceTree = ""; }; - BF66EEC52501AECA007EE018 /* MergePolicy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MergePolicy.swift; sourceTree = ""; }; - BF66EEC62501AECA007EE018 /* AppPermission.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppPermission.swift; sourceTree = ""; }; - BF66EEC72501AECA007EE018 /* AppID.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppID.swift; sourceTree = ""; }; - BF66EEC82501AECA007EE018 /* PatreonAccount.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PatreonAccount.swift; sourceTree = ""; }; - BF66EEC92501AECA007EE018 /* Account.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Account.swift; sourceTree = ""; }; - BF66EECA2501AECA007EE018 /* DatabaseManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DatabaseManager.swift; sourceTree = ""; }; - BF66EECB2501AECA007EE018 /* InstalledExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InstalledExtension.swift; sourceTree = ""; }; - BF66EEE42501AED0007EE018 /* UserDefaults+AltStore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UserDefaults+AltStore.swift"; sourceTree = ""; }; - BF66EEE52501AED0007EE018 /* JSONDecoder+Properties.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "JSONDecoder+Properties.swift"; sourceTree = ""; }; - BF66EEE62501AED0007EE018 /* UIColor+Hex.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIColor+Hex.swift"; sourceTree = ""; }; - BF66EEE72501AED0007EE018 /* UIApplication+AppExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIApplication+AppExtension.swift"; sourceTree = ""; }; - BF6A531F246DC1B0004F59C8 /* FileManager+SharedDirectories.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "FileManager+SharedDirectories.swift"; sourceTree = ""; }; BF6C336124197D700034FD24 /* NSError+AltStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSError+AltStore.swift"; sourceTree = ""; }; BF6C8FAA242935ED00125131 /* NSAttributedString+Markdown.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSAttributedString+Markdown.m"; path = "Dependencies/MarkdownAttributedString/NSAttributedString+Markdown.m"; sourceTree = SOURCE_ROOT; }; BF6C8FAB242935ED00125131 /* NSAttributedString+Markdown.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSAttributedString+Markdown.h"; path = "Dependencies/MarkdownAttributedString/NSAttributedString+Markdown.h"; sourceTree = SOURCE_ROOT; }; @@ -921,28 +755,22 @@ BF989172250AABF4002ACF50 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; BF98917C250AAC4F002ACF50 /* Countdown.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Countdown.swift; sourceTree = ""; }; BF98917D250AAC4F002ACF50 /* LockScreenWidget.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LockScreenWidget.swift; sourceTree = ""; }; - BF989190250AAE86002ACF50 /* ViewAppIntentHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewAppIntentHandler.swift; sourceTree = ""; }; - BF989191250AAE86002ACF50 /* ViewApp.intentdefinition */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.intentdefinition; path = ViewApp.intentdefinition; sourceTree = ""; }; BF9ABA4422DCFF43008935CF /* BrowseViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrowseViewController.swift; sourceTree = ""; }; BF9ABA4822DD0742008935CF /* ScreenshotCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScreenshotCollectionViewCell.swift; sourceTree = ""; }; BF9ABA4A22DD137F008935CF /* NavigationBar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NavigationBar.swift; sourceTree = ""; }; BF9ABA4C22DD16DE008935CF /* PillButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PillButton.swift; sourceTree = ""; }; BFA8172A23C5633D001B5953 /* FetchAnisetteDataOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchAnisetteDataOperation.swift; sourceTree = ""; }; - BFB39B5B252BC10E00D1BE50 /* Managed.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Managed.swift; sourceTree = ""; }; BFB4323E22DE852000B7F8BC /* UpdateCollectionViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = UpdateCollectionViewCell.xib; sourceTree = ""; }; BFB6B21D231870160022A802 /* NewsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewsViewController.swift; sourceTree = ""; }; BFB6B21F231870B00022A802 /* NewsCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewsCollectionViewCell.swift; sourceTree = ""; }; BFB6B22323187A3D0022A802 /* NewsCollectionViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = NewsCollectionViewCell.xib; sourceTree = ""; }; BFBAC8852295C90300587369 /* Result+Conveniences.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Result+Conveniences.swift"; sourceTree = ""; }; - BFBF33142526754700B7B8C9 /* AltStore 9.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "AltStore 9.xcdatamodel"; sourceTree = ""; }; - BFBF331A2526762200B7B8C9 /* AltStore8ToAltStore9.xcmappingmodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcmappingmodel; path = AltStore8ToAltStore9.xcmappingmodel; sourceTree = ""; }; BFC1F38C22AEE3A4003AC21A /* DownloadAppOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DownloadAppOperation.swift; sourceTree = ""; }; BFC57A642416C72400EB891E /* DeactivateAppOperation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DeactivateAppOperation.swift; sourceTree = ""; }; BFC57A6D2416FC5D00EB891E /* InstalledAppsCollectionHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InstalledAppsCollectionHeaderView.swift; sourceTree = ""; }; BFC57A6F2416FC7600EB891E /* InstalledAppsCollectionHeaderView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = InstalledAppsCollectionHeaderView.xib; sourceTree = ""; }; BFC712C12512D5F100AB5EBE /* XPCConnection.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XPCConnection.swift; sourceTree = ""; }; BFC84A4C2421A19100853474 /* SourcesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourcesViewController.swift; sourceTree = ""; }; - BFCB9206250AB2120057B44E /* Colors.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Colors.xcassets; sourceTree = ""; }; BFCCB519245E3401001853EA /* VerifyAppOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VerifyAppOperation.swift; sourceTree = ""; }; BFD2476A2284B9A500981D42 /* SideStore.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SideStore.app; sourceTree = BUILT_PRODUCTS_DIR; }; BFD2476D2284B9A500981D42 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; @@ -953,14 +781,12 @@ BFD247862284BB3B00981D42 /* Roxas.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Roxas.framework; sourceTree = BUILT_PRODUCTS_DIR; }; BFD2478B2284C4C300981D42 /* AppIconImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppIconImageView.swift; sourceTree = ""; }; BFD2478E2284C8F900981D42 /* Button.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Button.swift; sourceTree = ""; }; - BFD2479E2284FBD000981D42 /* UIColor+AltStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIColor+AltStore.swift"; sourceTree = ""; }; BFD44605241188C300EAB90A /* CodableError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CodableError.swift; sourceTree = ""; }; BFD52BD222A06EFB000B7ED1 /* ALTConstants.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ALTConstants.h; sourceTree = ""; }; BFD52C1D22A1A9EC000B7ED1 /* node.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = node.c; path = Dependencies/libplist/libcnary/node.c; sourceTree = SOURCE_ROOT; }; BFD52C1E22A1A9EC000B7ED1 /* node_list.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = node_list.c; path = Dependencies/libplist/libcnary/node_list.c; sourceTree = SOURCE_ROOT; }; BFD52C1F22A1A9EC000B7ED1 /* cnary.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cnary.c; path = Dependencies/libplist/libcnary/cnary.c; sourceTree = SOURCE_ROOT; }; BFD6B03222DFF20800B86064 /* MyAppsComponents.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyAppsComponents.swift; sourceTree = ""; }; - BFDB5B1522EE90D300F74113 /* Date+RelativeDate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Date+RelativeDate.swift"; sourceTree = ""; }; BFDB6A0722AAED73007EA6D6 /* ResignAppOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResignAppOperation.swift; sourceTree = ""; }; BFDB6A0A22AAEDB7007EA6D6 /* Operation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Operation.swift; sourceTree = ""; }; BFDB6A0C22AAFC19007EA6D6 /* OperationError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OperationError.swift; sourceTree = ""; }; @@ -989,47 +815,30 @@ BFF435D7255CBDAB00DD724F /* ALTApplication+AltStoreApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ALTApplication+AltStoreApp.swift"; sourceTree = ""; }; BFF767CB2489AB5C0097E58C /* ALTServerError+Conveniences.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ALTServerError+Conveniences.swift"; sourceTree = ""; }; BFF767CD2489ABE90097E58C /* NetworkConnection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkConnection.swift; sourceTree = ""; }; - BFF7EC4C25081E9300BDE521 /* AltStore 8.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "AltStore 8.xcdatamodel"; sourceTree = ""; }; D50107EB2ADF2E1A0069F2A1 /* AddSourceTextFieldCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddSourceTextFieldCell.swift; sourceTree = ""; }; D5084CCB2B1EA80100C02160 /* FeaturedComponents.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeaturedComponents.swift; sourceTree = ""; }; D5144BA72B8684EF00738A5C /* Icons.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Icons.xcassets; sourceTree = ""; }; D5151BD82A8FF64300C96F28 /* RefreshAllAppsIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RefreshAllAppsIntent.swift; sourceTree = ""; }; D5151BE02A90344300C96F28 /* RefreshAllAppsWidgetIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RefreshAllAppsWidgetIntent.swift; sourceTree = ""; }; D5151BE52A90391900C96F28 /* View+AltWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+AltWidget.swift"; sourceTree = ""; }; - D5185B812AE1E71D00646E33 /* Source11To17MigrationPolicy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Source11To17MigrationPolicy.swift; sourceTree = ""; }; - D51E83802B86926B0092FC61 /* AltStore 17.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "AltStore 17.xcdatamodel"; sourceTree = ""; }; - D52A2F962ACB40F700BDF8E3 /* Logger+AltStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Logger+AltStore.swift"; sourceTree = ""; }; - D52B4ABE2AF183F0005991C3 /* WebViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebViewController.swift; sourceTree = ""; }; - D52C08ED28AEC37A006C4AE5 /* AppVersion.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppVersion.swift; sourceTree = ""; }; D52C8F002AFC144C00CA0BDD /* FeaturedViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeaturedViewController.swift; sourceTree = ""; }; - D52C8F022AFC56F000CA0BDD /* StoreCategory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreCategory.swift; sourceTree = ""; }; - D52E988928D002D30032BE6B /* AltStore 11.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "AltStore 11.xcdatamodel"; sourceTree = ""; }; D52EF2BD2A0594550096C377 /* AppDetailCollectionViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDetailCollectionViewController.swift; sourceTree = ""; }; D533E8B82727B61400A9B5DD /* fragmentzip.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = fragmentzip.h; sourceTree = ""; }; D533E8BB2727BBEE00A9B5DD /* libfragmentzip.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libfragmentzip.a; path = Dependencies/fragmentzip/libfragmentzip.a; sourceTree = SOURCE_ROOT; }; D533E8BD2727BBF800A9B5DD /* libcurl.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libcurl.a; path = Dependencies/libcurl/libcurl.a; sourceTree = SOURCE_ROOT; }; D5390C3B2AC3A43900D17E62 /* AddSourceViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddSourceViewController.swift; sourceTree = ""; }; - D53D84012A2158FC00543C3B /* Permissions.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Permissions.plist; sourceTree = ""; }; D54058B82A1D6269008CCC58 /* AppPermissionProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppPermissionProtocol.swift; sourceTree = ""; }; D54058BA2A1D8FE3008CCC58 /* UIColor+AltStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIColor+AltStore.swift"; sourceTree = ""; }; D5418F162AD740890014ABD6 /* AppScreenshotCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppScreenshotCollectionViewCell.swift; sourceTree = ""; }; D54DED1328CBC44B008B27A0 /* ErrorLogTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorLogTableViewCell.swift; sourceTree = ""; }; D552B1D72A042A740066216F /* AppPermissionsCard.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppPermissionsCard.swift; sourceTree = ""; }; - D552EB052AF453F900A3AB4D /* URL+Normalized.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "URL+Normalized.swift"; sourceTree = ""; }; D55467B12A8D5E2600F4CE90 /* AppShortcuts.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppShortcuts.swift; sourceTree = ""; }; D55467C42A8D72C300F4CE90 /* ActiveAppsWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActiveAppsWidget.swift; sourceTree = ""; }; - D557A4802AE85BB0007D0DCF /* Pledge.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Pledge.swift; sourceTree = ""; }; - D557A4822AE85DB7007D0DCF /* PledgeReward.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PledgeReward.swift; sourceTree = ""; }; - D557A4842AE88227007D0DCF /* PledgeTier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PledgeTier.swift; sourceTree = ""; }; - D561AF812B21669400BF59C6 /* VerifyAppPledgeOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VerifyAppPledgeOperation.swift; sourceTree = ""; }; - D56915052AD5D75B00A2B747 /* Regex+Permissions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Regex+Permissions.swift"; sourceTree = ""; }; D569A5032AF9BC5F00A4CB8B /* ReviewPermissionsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReviewPermissionsViewController.swift; sourceTree = ""; }; D56D213F2B7D9942007641C5 /* AltAppIconsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AltAppIconsViewController.swift; sourceTree = ""; }; D56D21412B7D9C41007641C5 /* AltIcons.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = AltIcons.plist; sourceTree = ""; }; D5708416292448DA00D42D34 /* OperatingSystemVersion+Comparable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "OperatingSystemVersion+Comparable.swift"; sourceTree = ""; }; D571ADCD2A02FA7400B24B63 /* SourceError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceError.swift; sourceTree = ""; }; - D571ADCF2A02FC7200B24B63 /* ALTAppPermission.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ALTAppPermission.swift; sourceTree = ""; }; - D5728CA62A0D79D30014E73C /* OptionalProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OptionalProtocol.swift; sourceTree = ""; }; D577AB7A2A967DF5007FE952 /* AppsTimelineProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppsTimelineProvider.swift; sourceTree = ""; }; D577AB7E2A96878A007FE952 /* AppDetailWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDetailWidget.swift; sourceTree = ""; }; D57968CA29CB99EF00539069 /* VibrantButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VibrantButton.swift; sourceTree = ""; }; @@ -1040,9 +849,6 @@ D57F2C9326E01BC700B9FA39 /* UIDevice+Vibration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIDevice+Vibration.swift"; sourceTree = ""; }; D57FE84328C7DB7100216002 /* ErrorLogViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorLogViewController.swift; sourceTree = ""; }; D586D39828EF58B0000E101F /* AltTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AltTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - D58916FD28C7C55C00E39C8B /* LoggedError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoggedError.swift; sourceTree = ""; }; - D5893F7E2A14183200E767CD /* NSManagedObjectContext+Conveniences.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSManagedObjectContext+Conveniences.swift"; sourceTree = ""; }; - D5893F812A141E4900E767CD /* KnownSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KnownSource.swift; sourceTree = ""; }; D59162AA29BA60A9005CBF47 /* SourceHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceHeaderView.swift; sourceTree = ""; }; D59162AC29BA616A005CBF47 /* SourceHeaderView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SourceHeaderView.xib; sourceTree = ""; }; D5927D6529DCC89000D6898E /* UINavigationBarAppearance+TintColor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UINavigationBarAppearance+TintColor.swift"; sourceTree = ""; }; @@ -1053,32 +859,18 @@ D59A6B802AA92D1C00F61259 /* Process+Conveniences.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Process+Conveniences.swift"; sourceTree = ""; }; D5A0537229B91DB400997551 /* SourceDetailContentViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceDetailContentViewController.swift; sourceTree = ""; }; D5A645202AF591980047D980 /* UTType+AltStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UTType+AltStore.swift"; sourceTree = ""; }; - D5A645222AF5B5C50047D980 /* PatreonAPI+Responses.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PatreonAPI+Responses.swift"; sourceTree = ""; }; - D5A645242AF5BC7F0047D980 /* UserAccount.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserAccount.swift; sourceTree = ""; }; D5ACE84428E3B8450021CAB9 /* ClearAppCacheOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClearAppCacheOperation.swift; sourceTree = ""; }; - D5B6F6A82AD75D01007EED5A /* ProcessInfo+Previews.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ProcessInfo+Previews.swift"; sourceTree = ""; }; D5B6F6AA2AD76541007EED5A /* PreviewAppScreenshotsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreviewAppScreenshotsViewController.swift; sourceTree = ""; }; D5C0E7662AD9C75900530CA4 /* AppCardCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppCardCollectionViewCell.swift; sourceTree = ""; }; - D5CA0C4A280E141900469595 /* ManagedPatron.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ManagedPatron.swift; sourceTree = ""; }; - D5CA0C4C280E242500469595 /* AltStore 10.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "AltStore 10.xcdatamodel"; sourceTree = ""; }; - D5CA0C4D280E249E00469595 /* AltStore9ToAltStore10.xcmappingmodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcmappingmodel; path = AltStore9ToAltStore10.xcmappingmodel; sourceTree = ""; }; D5CD805C29CA2C1E00E591B0 /* HeaderContentViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeaderContentViewController.swift; sourceTree = ""; }; D5CD805E29CA755E00E591B0 /* SourceDetailViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceDetailViewController.swift; sourceTree = ""; }; D5CF56812A0D83F9006D93E2 /* VerificationError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VerificationError.swift; sourceTree = ""; }; - D5DAE0952804DF430034D8D4 /* UpdatePatronsOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdatePatronsOperation.swift; sourceTree = ""; }; - D5DB81632B0410BC003F5F8B /* AppSorting.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppSorting.swift; sourceTree = ""; }; D5E1E7C028077DE90016FC96 /* UpdateKnownSourcesOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdateKnownSourcesOperation.swift; sourceTree = ""; }; D5F2F6A82720B7C20081CCF5 /* PatchViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PatchViewController.swift; sourceTree = ""; }; - D5F48B4729CCF21B002B52A4 /* AltStore+Async.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AltStore+Async.swift"; sourceTree = ""; }; - D5F48B4929CD0B67002B52A4 /* AsyncManaged.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AsyncManaged.swift; sourceTree = ""; }; - D5F9821C2AB900060045751F /* AppScreenshot.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppScreenshot.swift; sourceTree = ""; }; D5F982202AB910180045751F /* AppScreenshotsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppScreenshotsViewController.swift; sourceTree = ""; }; - D5F99A1728D11DB500476A16 /* AltStore10ToAltStore11.xcmappingmodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcmappingmodel; path = AltStore10ToAltStore11.xcmappingmodel; sourceTree = ""; }; - D5F99A1928D12B1400476A16 /* StoreApp10ToStoreApp11Policy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreApp10ToStoreApp11Policy.swift; sourceTree = ""; }; D5FB28EB2ADDF68D00A1C337 /* UIFontDescriptor+Bold.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIFontDescriptor+Bold.swift"; sourceTree = ""; }; D5FD4EC42A952EAD0097BEE8 /* AltWidgetBundle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AltWidgetBundle.swift; sourceTree = ""; }; D5FD4EC82A9530C00097BEE8 /* AppSnapshot.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppSnapshot.swift; sourceTree = ""; }; - D5FD4ECA2A9532960097BEE8 /* DatabaseManager+Async.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DatabaseManager+Async.swift"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ @@ -1113,11 +905,39 @@ ); target = BFD247692284B9A500981D42 /* SideStore */; }; + A8EEC0BE2F4AF7FB00F2436D /* PBXFileSystemSynchronizedBuildFileExceptionSet */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + attributesByRelativePath = { + Intents/ViewApp.intentdefinition = ( + no_codegen, + ); + }; + membershipExceptions = ( + Intents/ViewApp.intentdefinition, + Intents/ViewAppIntentHandler.swift, + ); + target = BFD247692284B9A500981D42 /* SideStore */; + }; + A8EEC0BF2F4AF7FB00F2436D /* PBXFileSystemSynchronizedBuildFileExceptionSet */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + membershipExceptions = ( + Info.plist, + Intents/ViewAppIntentHandler.swift, + ); + publicHeaders = ( + AltStoreCore.h, + Types/ALTAppPermissions.h, + Types/ALTPatreonBenefitID.h, + Types/ALTSourceUserInfoKey.h, + ); + target = BF66EE7D2501AE50007EE018 /* AltStoreCore */; + }; /* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ /* Begin PBXFileSystemSynchronizedRootGroup section */ A83FE3A22EC91F35005ACE9A /* em_proxy */ = {isa = PBXFileSystemSynchronizedRootGroup; exceptions = (A83FE3D32EC922F8005ACE9A /* PBXFileSystemSynchronizedBuildFileExceptionSet */, ); explicitFileTypes = {}; explicitFolders = (); path = em_proxy; sourceTree = ""; }; A83FE3A52EC91F35005ACE9A /* EmotionalDamage */ = {isa = PBXFileSystemSynchronizedRootGroup; exceptions = (A83FE3D22EC9229A005ACE9A /* PBXFileSystemSynchronizedBuildFileExceptionSet */, ); explicitFileTypes = {}; explicitFolders = (); path = EmotionalDamage; sourceTree = ""; }; + A8EEC0502F4AF7FB00F2436D /* AltStoreCore */ = {isa = PBXFileSystemSynchronizedRootGroup; exceptions = (A8EEC0BE2F4AF7FB00F2436D /* PBXFileSystemSynchronizedBuildFileExceptionSet */, A8EEC0BF2F4AF7FB00F2436D /* PBXFileSystemSynchronizedBuildFileExceptionSet */, ); explicitFileTypes = {}; explicitFolders = (); path = AltStoreCore; sourceTree = ""; }; /* End PBXFileSystemSynchronizedRootGroup section */ /* Begin PBXFrameworksBuildPhase section */ @@ -1194,13 +1014,11 @@ files = ( A8C6D5172D1EE95B00DF01F1 /* OpenSSL.xcframework in Frameworks */, A83FE3D42EC92495005ACE9A /* libEmotionalDamage.a in Frameworks */, - A83FE36C2EC904FD005ACE9A /* AppCenterCrashes in Frameworks */, A8A543302D04F14400D72399 /* libfragmentzip.a in Frameworks */, A8B646012D70C23E00125819 /* MarkdownKit in Frameworks */, A8C2260E2EC9039A00047C0D /* Nuke in Frameworks */, A8F838942D048ECE00ED425D /* libimobiledevice.a in Frameworks */, A8F838932D048E8F00ED425D /* libminimuxer.a in Frameworks */, - D533E8BE2727BBF800A9B5DD /* libcurl.a in Frameworks */, BF1614F1250822F100767AEA /* Roxas.framework in Frameworks */, A8B645FF2D70C1AD00125819 /* MarkdownKit in Frameworks */, A83FE3672EC90482005ACE9A /* Starscream in Frameworks */, @@ -1283,17 +1101,6 @@ path = Intents; sourceTree = ""; }; - A815AAA62D9108CB00929A9E /* v11-to-v17_1 */ = { - isa = PBXGroup; - children = ( - A815AAA22D9108CB00929A9E /* Source11To17_1MigrationPolicy.swift */, - A815AAA32D9108CB00929A9E /* StoreApp11To17_1MigrationPolicy.swift */, - A815AAA42D9108CB00929A9E /* ReleaseTrack11To17_1MigrationPolicy.swift */, - A815AAA52D9108CB00929A9E /* AppPermission11To17_1MigrationPolicy.swift */, - ); - path = "v11-to-v17_1"; - sourceTree = ""; - }; A81A8CB22D68B2030086C96F /* UnitTests */ = { isa = PBXGroup; children = ( @@ -1338,26 +1145,6 @@ path = xcconfigs; sourceTree = ""; }; - A85E43732D8AF82100E89240 /* v11-to-v17 */ = { - isa = PBXGroup; - children = ( - D5185B812AE1E71D00646E33 /* Source11To17MigrationPolicy.swift */, - A881E7CA2D6EF5AB00954AD2 /* StoreApp11To17MigrationPolicy.swift */, - ); - path = "v11-to-v17"; - sourceTree = ""; - }; - A85E43742D8AF84200E89240 /* v17-to-v17_1 */ = { - isa = PBXGroup; - children = ( - A81BF9E32D84CB0C00768940 /* Source17To17_1MigrationPolicy.swift */, - A815AA942D90D2A100929A9E /* StoreApp17To17_1MigrationPolicy.swift */, - A815AA962D90E16400929A9E /* ReleaseTrack17To17_1MigrationPolicy.swift */, - A81BF9E22D84CB0C00768940 /* AppPermission17To17_1MigrationPolicy.swift */, - ); - path = "v17-to-v17_1"; - sourceTree = ""; - }; A86315DD2D3EB2BD0048FA40 /* errors */ = { isa = PBXGroup; children = ( @@ -1499,31 +1286,6 @@ path = Tests; sourceTree = ""; }; - A8EA19602D4982E300DC6322 /* DatabaseManager */ = { - isa = PBXGroup; - children = ( - BF66EECA2501AECA007EE018 /* DatabaseManager.swift */, - D5FD4ECA2A9532960097BEE8 /* DatabaseManager+Async.swift */, - ); - path = DatabaseManager; - sourceTree = ""; - }; - A8EA19612D4982E300DC6322 /* MergePolicies */ = { - isa = PBXGroup; - children = ( - BF66EEC52501AECA007EE018 /* MergePolicy.swift */, - ); - path = MergePolicies; - sourceTree = ""; - }; - A8EA19622D4982FC00DC6322 /* Transformers */ = { - isa = PBXGroup; - children = ( - BF66EEC12501AECA007EE018 /* SecureValueTransformer.swift */, - ); - path = Transformers; - sourceTree = ""; - }; A8F66C072D04C025009689E6 /* SideStore */ = { isa = PBXGroup; children = ( @@ -1775,166 +1537,6 @@ path = AltBackup; sourceTree = ""; }; - BF66EE7F2501AE50007EE018 /* AltStoreCore */ = { - isa = PBXGroup; - children = ( - BF66EE802501AE50007EE018 /* AltStoreCore.h */, - BF66EE8A2501AEB1007EE018 /* Components */, - BF66EEE32501AED0007EE018 /* Extensions */, - BF66EEAA2501AECA007EE018 /* Model */, - BF66EE9F2501AEC5007EE018 /* Patreon */, - BF98918B250AAE18002ACF50 /* Intents */, - BF66EE9A2501AEC1007EE018 /* Protocols */, - BF66EE8D2501AEBC007EE018 /* Types */, - BF66EE812501AE50007EE018 /* Info.plist */, - BFCB9205250AB1FF0057B44E /* Resources */, - ); - path = AltStoreCore; - sourceTree = ""; - }; - BF66EE8A2501AEB1007EE018 /* Components */ = { - isa = PBXGroup; - children = ( - BF66EE8B2501AEB1007EE018 /* Keychain.swift */, - D52B4ABE2AF183F0005991C3 /* WebViewController.swift */, - ); - path = Components; - sourceTree = ""; - }; - BF66EE8D2501AEBC007EE018 /* Types */ = { - isa = PBXGroup; - children = ( - BFB39B5B252BC10E00D1BE50 /* Managed.swift */, - D5F48B4929CD0B67002B52A4 /* AsyncManaged.swift */, - D5893F812A141E4900E767CD /* KnownSource.swift */, - D52C8F022AFC56F000CA0BDD /* StoreCategory.swift */, - D5DB81632B0410BC003F5F8B /* AppSorting.swift */, - BF66EE8E2501AEBC007EE018 /* ALTAppPermissions.h */, - BF66EE912501AEBC007EE018 /* ALTAppPermissions.m */, - BF66EE922501AEBC007EE018 /* ALTPatreonBenefitID.h */, - BF66EE902501AEBC007EE018 /* ALTPatreonBenefitID.m */, - BF66EE8F2501AEBC007EE018 /* ALTSourceUserInfoKey.h */, - BF66EE932501AEBC007EE018 /* ALTSourceUserInfoKey.m */, - ); - path = Types; - sourceTree = ""; - }; - BF66EE9A2501AEC1007EE018 /* Protocols */ = { - isa = PBXGroup; - children = ( - BF66EE9B2501AEC1007EE018 /* AppProtocol.swift */, - BF66EE9C2501AEC1007EE018 /* Fetchable.swift */, - D5728CA62A0D79D30014E73C /* OptionalProtocol.swift */, - D571ADCF2A02FC7200B24B63 /* ALTAppPermission.swift */, - ); - path = Protocols; - sourceTree = ""; - }; - BF66EE9F2501AEC5007EE018 /* Patreon */ = { - isa = PBXGroup; - children = ( - BF66EEA12501AEC5007EE018 /* PatreonAPI.swift */, - D5A645222AF5B5C50047D980 /* PatreonAPI+Responses.swift */, - BF66EEA02501AEC5007EE018 /* Benefit.swift */, - BF66EEA22501AEC5007EE018 /* Campaign.swift */, - BF66EEA32501AEC5007EE018 /* Patron.swift */, - BF66EEA42501AEC5007EE018 /* Tier.swift */, - D5A645242AF5BC7F0047D980 /* UserAccount.swift */, - ); - path = Patreon; - sourceTree = ""; - }; - BF66EEAA2501AECA007EE018 /* Model */ = { - isa = PBXGroup; - children = ( - A8EA19602D4982E300DC6322 /* DatabaseManager */, - A8EA19612D4982E300DC6322 /* MergePolicies */, - A8EA19622D4982FC00DC6322 /* Transformers */, - D557A4862AE88232007D0DCF /* Patreon */, - BF66EEAC2501AECA007EE018 /* Migrations */, - BF66EEB72501AECA007EE018 /* AltStore.xcdatamodeld */, - A8EA195E2D4982D600DC6322 /* BaseEntity.swift */, - BF66EEC92501AECA007EE018 /* Account.swift */, - BF66EEC72501AECA007EE018 /* AppID.swift */, - BF66EEC62501AECA007EE018 /* AppPermission.swift */, - D5F9821C2AB900060045751F /* AppScreenshot.swift */, - D52C08ED28AEC37A006C4AE5 /* AppVersion.swift */, - BF66EEC02501AECA007EE018 /* InstalledApp.swift */, - BF66EECB2501AECA007EE018 /* InstalledExtension.swift */, - D58916FD28C7C55C00E39C8B /* LoggedError.swift */, - BF66EEBF2501AECA007EE018 /* NewsItem.swift */, - BF66EEC32501AECA007EE018 /* RefreshAttempt.swift */, - A80D60D12D3D705F00CEF65D /* ReleaseTrack.swift */, - BF66EEAB2501AECA007EE018 /* Source.swift */, - BF66EEC42501AECA007EE018 /* StoreApp.swift */, - BF66EEC22501AECA007EE018 /* Team.swift */, - ); - path = Model; - sourceTree = ""; - }; - BF66EEAC2501AECA007EE018 /* Migrations */ = { - isa = PBXGroup; - children = ( - BF66EEAD2501AECA007EE018 /* Policies */, - BF66EEB02501AECA007EE018 /* Mapping Models */, - ); - path = Migrations; - sourceTree = ""; - }; - BF66EEAD2501AECA007EE018 /* Policies */ = { - isa = PBXGroup; - children = ( - BF66EEAF2501AECA007EE018 /* InstalledAppPolicy.swift */, - BF66EEAE2501AECA007EE018 /* StoreAppPolicy.swift */, - D5F99A1928D12B1400476A16 /* StoreApp10ToStoreApp11Policy.swift */, - A85E43732D8AF82100E89240 /* v11-to-v17 */, - A85E43742D8AF84200E89240 /* v17-to-v17_1 */, - A815AAA62D9108CB00929A9E /* v11-to-v17_1 */, - ); - path = Policies; - sourceTree = ""; - }; - BF66EEB02501AECA007EE018 /* Mapping Models */ = { - isa = PBXGroup; - children = ( - A815AAA02D9108BC00929A9E /* AltStore11ToAltStore17_1.xcmappingmodel */, - A815AA982D90E5E500929A9E /* AltStore17ToAltStore17_1.xcmappingmodel */, - A8C924232D8E73B1009D9953 /* AltStore11ToAltStore17.xcmappingmodel */, - D5F99A1728D11DB500476A16 /* AltStore10ToAltStore11.xcmappingmodel */, - D5CA0C4D280E249E00469595 /* AltStore9ToAltStore10.xcmappingmodel */, - BFBF331A2526762200B7B8C9 /* AltStore8ToAltStore9.xcmappingmodel */, - BF66EEB22501AECA007EE018 /* AltStore6ToAltStore7.xcmappingmodel */, - BF66EEB62501AECA007EE018 /* AltStore5ToAltStore6.xcmappingmodel */, - BF66EEB42501AECA007EE018 /* AltStore4ToAltStore5.xcmappingmodel */, - BF66EEB32501AECA007EE018 /* AltStore3ToAltStore4.xcmappingmodel */, - BF66EEB52501AECA007EE018 /* AltStore2ToAltStore3.xcmappingmodel */, - BF66EEB12501AECA007EE018 /* AltStoreToAltStore2.xcmappingmodel */, - ); - path = "Mapping Models"; - sourceTree = ""; - }; - BF66EEE32501AED0007EE018 /* Extensions */ = { - isa = PBXGroup; - children = ( - BFD2479E2284FBD000981D42 /* UIColor+AltStore.swift */, - BFDB5B1522EE90D300F74113 /* Date+RelativeDate.swift */, - BF66EEE52501AED0007EE018 /* JSONDecoder+Properties.swift */, - BF66EEE72501AED0007EE018 /* UIApplication+AppExtension.swift */, - BF66EEE62501AED0007EE018 /* UIColor+Hex.swift */, - BF66EEE42501AED0007EE018 /* UserDefaults+AltStore.swift */, - BF6A531F246DC1B0004F59C8 /* FileManager+SharedDirectories.swift */, - 0E05025B2BEC947000879B5C /* String+SideStore.swift */, - D5F48B4729CCF21B002B52A4 /* AltStore+Async.swift */, - D5893F7E2A14183200E767CD /* NSManagedObjectContext+Conveniences.swift */, - D52A2F962ACB40F700BDF8E3 /* Logger+AltStore.swift */, - D56915052AD5D75B00A2B747 /* Regex+Permissions.swift */, - A8D49F522D3D2F9400844B92 /* ProcessInfo+AltStore.swift */, - D5B6F6A82AD75D01007EED5A /* ProcessInfo+Previews.swift */, - D552EB052AF453F900A3AB4D /* URL+Normalized.swift */, - ); - path = Extensions; - sourceTree = ""; - }; BF6C8FA8242935CA00125131 /* Dependencies */ = { isa = PBXGroup; children = ( @@ -1986,15 +1588,6 @@ path = AltWidget; sourceTree = ""; }; - BF98918B250AAE18002ACF50 /* Intents */ = { - isa = PBXGroup; - children = ( - BF989191250AAE86002ACF50 /* ViewApp.intentdefinition */, - BF989190250AAE86002ACF50 /* ViewAppIntentHandler.swift */, - ); - path = Intents; - sourceTree = ""; - }; BF9ABA4322DCFF33008935CF /* Browse */ = { isa = PBXGroup; children = ( @@ -2042,21 +1635,12 @@ path = Sources; sourceTree = ""; }; - BFCB9205250AB1FF0057B44E /* Resources */ = { - isa = PBXGroup; - children = ( - BFCB9206250AB2120057B44E /* Colors.xcassets */, - D53D84012A2158FC00543C3B /* Permissions.plist */, - ); - path = Resources; - sourceTree = ""; - }; BFD247612284B9A500981D42 = { isa = PBXGroup; children = ( A8F66C072D04C025009689E6 /* SideStore */, BFD2476C2284B9A500981D42 /* AltStore */, - BF66EE7F2501AE50007EE018 /* AltStoreCore */, + A8EEC0502F4AF7FB00F2436D /* AltStoreCore */, BF1E315122A0616100370A3C /* Shared */, BF45872C2298D31600BD7491 /* libimobiledevice */, BF58047C246A28F7008AE704 /* AltBackup */, @@ -2236,7 +1820,6 @@ BF770E5322BC044E002A40FE /* OperationContexts.swift */, BF770E5722BC3D0F002A40FE /* RefreshGroup.swift */, BFE6326B22A86FF300F30809 /* AuthenticationOperation.swift */, - D561AF812B21669400BF59C6 /* VerifyAppPledgeOperation.swift */, BFC1F38C22AEE3A4003AC21A /* DownloadAppOperation.swift */, BFCCB519245E3401001853EA /* VerifyAppOperation.swift */, A8696EE32D34512C00E96389 /* RemoveAppExtensionsOperation.swift */, @@ -2255,7 +1838,6 @@ BFC57A642416C72400EB891E /* DeactivateAppOperation.swift */, BFF00D312501BDA100746320 /* BackgroundRefreshAppsOperation.swift */, D57F2C9026E0070200B9FA39 /* EnableJITOperation.swift */, - D5DAE0952804DF430034D8D4 /* UpdatePatronsOperation.swift */, D5ACE84428E3B8450021CAB9 /* ClearAppCacheOperation.swift */, BF7B44062725A4B8005288A4 /* Patch App */, ); @@ -2396,18 +1978,6 @@ path = "App Intents"; sourceTree = ""; }; - D557A4862AE88232007D0DCF /* Patreon */ = { - isa = PBXGroup; - children = ( - BF66EEC82501AECA007EE018 /* PatreonAccount.swift */, - D557A4802AE85BB0007D0DCF /* Pledge.swift */, - D557A4842AE88227007D0DCF /* PledgeTier.swift */, - D557A4822AE85DB7007D0DCF /* PledgeReward.swift */, - D5CA0C4A280E141900469595 /* ManagedPatron.swift */, - ); - path = Patreon; - sourceTree = ""; - }; D55FEC9C2A8FEC600057D6E6 /* Legacy */ = { isa = PBXGroup; children = ( @@ -2493,12 +2063,8 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - BF66EE822501AE50007EE018 /* AltStoreCore.h in Headers */, - BF66EE952501AEBC007EE018 /* ALTSourceUserInfoKey.h in Headers */, - BF66EE982501AEBC007EE018 /* ALTPatreonBenefitID.h in Headers */, BFAECC5F2501B0BF00528F27 /* ALTConstants.h in Headers */, BFAECC5D2501B0BF00528F27 /* ALTConnection.h in Headers */, - BF66EE942501AEBC007EE018 /* ALTAppPermissions.h in Headers */, BFAECC602501B0BF00528F27 /* NSError+ALTServerError.h in Headers */, 0EE7FDC82BE8CF4800D1E390 /* ALTWrappedError.h in Headers */, BFAECC5E2501B0BF00528F27 /* CFNotificationName+AltStore.h in Headers */, @@ -2625,6 +2191,9 @@ ); dependencies = ( ); + fileSystemSynchronizedGroups = ( + A8EEC0502F4AF7FB00F2436D /* AltStoreCore */, + ); name = AltStoreCore; packageProductDependencies = ( A82067C32D03E0DE00645C0D /* SemanticVersion */, @@ -2731,7 +2300,6 @@ }; }; buildConfigurationList = BFD247652284B9A500981D42 /* Build configuration list for PBXProject "AltStore" */; - compatibilityVersion = "Xcode 9.3"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( @@ -2748,6 +2316,7 @@ A83FE3652EC90482005ACE9A /* XCRemoteSwiftPackageReference "Starscream" */, A83FE36D2EC90512005ACE9A /* XCRemoteSwiftPackageReference "KeychainAccess" */, ); + preferredProjectObjectVersion = 50; productRefGroup = BFD2476B2284B9A500981D42 /* Products */; projectDirPath = ""; projectReferences = ( @@ -2861,8 +2430,6 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - BFCB9207250AB2120057B44E /* Colors.xcassets in Resources */, - D53D84022A2158FC00543C3B /* Permissions.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -3073,113 +2640,26 @@ buildActionMask = 2147483647; files = ( A8228B5D2D6E361F00F7CE0E /* (null) in Sources */, - A8D49F532D3D2F9400844B92 /* ProcessInfo+AltStore.swift in Sources */, - A8EA195F2D4982D600DC6322 /* BaseEntity.swift in Sources */, A82067842D03DC0600645C0D /* OperatingSystemVersion+Comparable.swift in Sources */, - D5FB28EE2ADDF89800A1C337 /* KnownSource.swift in Sources */, - BF66EED32501AECA007EE018 /* AltStore2ToAltStore3.xcmappingmodel in Sources */, - A815AA972D90E16400929A9E /* ReleaseTrack17To17_1MigrationPolicy.swift in Sources */, - BF66EEA52501AEC5007EE018 /* Benefit.swift in Sources */, - D52B4ABF2AF183F0005991C3 /* WebViewController.swift in Sources */, - BF66EED22501AECA007EE018 /* AltStore4ToAltStore5.xcmappingmodel in Sources */, - D5A645252AF5BC7F0047D980 /* UserAccount.swift in Sources */, BFAECC5B2501B0A400528F27 /* Bundle+AltStore.swift in Sources */, - BF66EECD2501AECA007EE018 /* StoreAppPolicy.swift in Sources */, - BF66EEE82501AED0007EE018 /* UserDefaults+AltStore.swift in Sources */, - BF340E9A250AD39500A192CB /* ViewApp.intentdefinition in Sources */, - A8C924242D8E73B1009D9953 /* AltStore11ToAltStore17.xcmappingmodel in Sources */, - D552EB062AF453F900A3AB4D /* URL+Normalized.swift in Sources */, BFAECC522501B0A400528F27 /* CodableError.swift in Sources */, A8FD915F2D046F5200322782 /* UserInfoValue.swift in Sources */, - D5F9821D2AB900060045751F /* AppScreenshot.swift in Sources */, - BF66EE9E2501AEC1007EE018 /* Fetchable.swift in Sources */, - BF66EEDF2501AECA007EE018 /* PatreonAccount.swift in Sources */, - A815AAA12D9108BC00929A9E /* AltStore11ToAltStore17_1.xcmappingmodel in Sources */, BFAECC532501B0A400528F27 /* ServerProtocol.swift in Sources */, - A81BF9E52D84CB0C00768940 /* AppPermission17To17_1MigrationPolicy.swift in Sources */, - A81BF9E72D84CB0C00768940 /* Source17To17_1MigrationPolicy.swift in Sources */, BFAECC572501B0A400528F27 /* ConnectionManager.swift in Sources */, - BF66EE9D2501AEC1007EE018 /* AppProtocol.swift in Sources */, - D519AD46292D665B004B12F9 /* Managed.swift in Sources */, - D52A2F972ACB40F700BDF8E3 /* Logger+AltStore.swift in Sources */, - A815AA952D90D2A100929A9E /* StoreApp17To17_1MigrationPolicy.swift in Sources */, - A815AAA72D9108CB00929A9E /* ReleaseTrack11To17_1MigrationPolicy.swift in Sources */, - A815AAA82D9108CB00929A9E /* AppPermission11To17_1MigrationPolicy.swift in Sources */, - A815AAA92D9108CB00929A9E /* Source11To17_1MigrationPolicy.swift in Sources */, - A815AAAA2D9108CB00929A9E /* StoreApp11To17_1MigrationPolicy.swift in Sources */, BFC712C42512D5F100AB5EBE /* XPCConnection.swift in Sources */, - D5CA0C4B280E141900469595 /* ManagedPatron.swift in Sources */, - BF66EE8C2501AEB2007EE018 /* Keychain.swift in Sources */, - BF66EED42501AECA007EE018 /* AltStore5ToAltStore6.xcmappingmodel in Sources */, - BF66EE972501AEBC007EE018 /* ALTAppPermissions.m in Sources */, BFAECC552501B0A400528F27 /* Connection.swift in Sources */, - BF66EEDA2501AECA007EE018 /* RefreshAttempt.swift in Sources */, - 0E05025C2BEC947000879B5C /* String+SideStore.swift in Sources */, 0EE7FDCB2BE8D12B00D1E390 /* ALTLocalizedError.swift in Sources */, - BF66EEA92501AEC5007EE018 /* Tier.swift in Sources */, A8228B5B2D6E2C0C00F7CE0E /* (null) in Sources */, - BF66EEDB2501AECA007EE018 /* StoreApp.swift in Sources */, - BF66EEDE2501AECA007EE018 /* AppID.swift in Sources */, - BF66EECF2501AECA007EE018 /* AltStoreToAltStore2.xcmappingmodel in Sources */, - BF66EEA82501AEC5007EE018 /* Patron.swift in Sources */, - BF66EEDD2501AECA007EE018 /* AppPermission.swift in Sources */, - D58916FE28C7C55C00E39C8B /* LoggedError.swift in Sources */, - BFBF331B2526762200B7B8C9 /* AltStore8ToAltStore9.xcmappingmodel in Sources */, 0EE7FDC72BE8CF4100D1E390 /* ALTWrappedError.m in Sources */, - D5FD4ECB2A9532960097BEE8 /* DatabaseManager+Async.swift in Sources */, - D557A4832AE85DB7007D0DCF /* PledgeReward.swift in Sources */, - D5893F802A1419E800E767CD /* NSManagedObjectContext+Conveniences.swift in Sources */, - D5CA0C4E280E249E00469595 /* AltStore9ToAltStore10.xcmappingmodel in Sources */, - BF989184250AACFC002ACF50 /* Date+RelativeDate.swift in Sources */, - D5DB81642B0410BC003F5F8B /* AppSorting.swift in Sources */, - BF66EE962501AEBC007EE018 /* ALTPatreonBenefitID.m in Sources */, BFAECC5A2501B0A400528F27 /* NetworkConnection.swift in Sources */, - D5F99A1828D11DB500476A16 /* AltStore10ToAltStore11.xcmappingmodel in Sources */, - BF66EEE92501AED0007EE018 /* JSONDecoder+Properties.swift in Sources */, - D5B6F6A92AD75D01007EED5A /* ProcessInfo+Previews.swift in Sources */, - BF66EEEB2501AED0007EE018 /* UIApplication+AppExtension.swift in Sources */, - D5F48B4829CCF21B002B52A4 /* AltStore+Async.swift in Sources */, - BF66EED92501AECA007EE018 /* Team.swift in Sources */, - D5728CA72A0D79D30014E73C /* OptionalProtocol.swift in Sources */, - BF66EED12501AECA007EE018 /* AltStore3ToAltStore4.xcmappingmodel in Sources */, - D5F48B4C29CD0C48002B52A4 /* AsyncManaged.swift in Sources */, BFAECC5C2501B0A400528F27 /* CFNotificationName+AltStore.m in Sources */, - BF66EED82501AECA007EE018 /* SecureValueTransformer.swift in Sources */, - BF8B17EB250AC40000F8157F /* FileManager+SharedDirectories.swift in Sources */, - BF66EEE02501AECA007EE018 /* Account.swift in Sources */, - BF66EED52501AECA007EE018 /* AltStore.xcdatamodeld in Sources */, BFAECC582501B0A400528F27 /* ALTConstants.m in Sources */, - D5F99A1A28D12B1400476A16 /* StoreApp10ToStoreApp11Policy.swift in Sources */, BFAECC562501B0A400528F27 /* ALTServerError+Conveniences.swift in Sources */, - A80D60D32D3DD85100CEF65D /* ReleaseTrack.swift in Sources */, - D56915072AD5E91B00A2B747 /* Regex+Permissions.swift in Sources */, BFAECC592501B0A400528F27 /* Result+Conveniences.swift in Sources */, - A881E7CB2D6EF5AB00954AD2 /* StoreApp11To17MigrationPolicy.swift in Sources */, - D571ADD02A02FC7200B24B63 /* ALTAppPermission.swift in Sources */, D5E3FB9828FDFAD90034B72C /* NSError+AltStore.swift in Sources */, BFAECC542501B0A400528F27 /* NSError+ALTServerError.m in Sources */, - BF66EEE12501AECA007EE018 /* DatabaseManager.swift in Sources */, - D52C08EE28AEC37A006C4AE5 /* AppVersion.swift in Sources */, - BF66EEEA2501AED0007EE018 /* UIColor+Hex.swift in Sources */, - BF66EECC2501AECA007EE018 /* Source.swift in Sources */, - BF66EED72501AECA007EE018 /* InstalledApp.swift in Sources */, 0EE7FDC92BE8D07400D1E390 /* NSError+AltStore.swift in Sources */, - D5A645232AF5B5C50047D980 /* PatreonAPI+Responses.swift in Sources */, - D5185B822AE1E71D00646E33 /* Source11To17MigrationPolicy.swift in Sources */, - BF66EECE2501AECA007EE018 /* InstalledAppPolicy.swift in Sources */, BF1FE359251A9FB000C3CE09 /* NSXPCConnection+MachServices.swift in Sources */, - BF66EEA62501AEC5007EE018 /* PatreonAPI.swift in Sources */, - BF66EED02501AECA007EE018 /* AltStore6ToAltStore7.xcmappingmodel in Sources */, - BF66EEDC2501AECA007EE018 /* MergePolicy.swift in Sources */, - BF66EEE22501AECA007EE018 /* InstalledExtension.swift in Sources */, - BF66EED62501AECA007EE018 /* NewsItem.swift in Sources */, - A815AA992D90E5E500929A9E /* AltStore17ToAltStore17_1.xcmappingmodel in Sources */, - BF66EEA72501AEC5007EE018 /* Campaign.swift in Sources */, - D52C8F032AFC56F000CA0BDD /* StoreCategory.swift in Sources */, - BF66EE992501AEBC007EE018 /* ALTSourceUserInfoKey.m in Sources */, - D557A4812AE85BB0007D0DCF /* Pledge.swift in Sources */, - D557A4852AE88227007D0DCF /* PledgeTier.swift in Sources */, - BF989185250AAD1D002ACF50 /* UIColor+AltStore.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -3308,7 +2788,6 @@ D50107EC2ADF2E1A0069F2A1 /* AddSourceTextFieldCell.swift in Sources */, A8B645FC2D70C10300125819 /* CollapsingMarkdownView.swift in Sources */, D5151BD92A8FF64300C96F28 /* RefreshAllAppsIntent.swift in Sources */, - BFBE0007250AD0E70080826E /* ViewAppIntentHandler.swift in Sources */, BFDB6A0822AAED73007EA6D6 /* ResignAppOperation.swift in Sources */, D55467B82A8D5E2600F4CE90 /* AppShortcuts.swift in Sources */, D593F1942717749A006E82DE /* PatchAppOperation.swift in Sources */, @@ -3328,13 +2807,11 @@ A8C38C2A2D206AC100E83DBD /* OutputStream.swift in Sources */, BFF0B6942321CB85007A79E1 /* AuthenticationViewController.swift in Sources */, 0EE7FDCD2BE9124400D1E390 /* ErrorDetailsViewController.swift in Sources */, - D561AF822B21669400BF59C6 /* VerifyAppPledgeOperation.swift in Sources */, A8B516E32D2666CA0047047C /* CoreDataHelper.swift in Sources */, BF3432FB246B894F0052F4A1 /* BackupAppOperation.swift in Sources */, BF9ABA4922DD0742008935CF /* ScreenshotCollectionViewCell.swift in Sources */, BF9ABA4D22DD16DE008935CF /* PillButton.swift in Sources */, D5C0E7672AD9C75900530CA4 /* AppCardCollectionViewCell.swift in Sources */, - D5DAE0962804DF430034D8D4 /* UpdatePatronsOperation.swift in Sources */, D54058BB2A1D8FE3008CCC58 /* UIColor+AltStore.swift in Sources */, BFE6326C22A86FF300F30809 /* AuthenticationOperation.swift in Sources */, BFF435D8255CBDAB00DD724F /* ALTApplication+AltStoreApp.swift in Sources */, @@ -3351,7 +2828,6 @@ D5A645212AF591980047D980 /* UTType+AltStore.swift in Sources */, D5F982212AB910180045751F /* AppScreenshotsViewController.swift in Sources */, BFF0B69023219C6D007A79E1 /* PatreonComponents.swift in Sources */, - BFBE0004250ACFFB0080826E /* ViewApp.intentdefinition in Sources */, D52C8F012AFC144C00CA0BDD /* FeaturedViewController.swift in Sources */, BF56D2AF23DF9E310006506D /* AppIDsViewController.swift in Sources */, ); @@ -4285,14 +3761,6 @@ minimumVersion = 4.0.8; }; }; - A83FE3682EC904FD005ACE9A /* XCRemoteSwiftPackageReference "appcenter-sdk-apple" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/microsoft/appcenter-sdk-apple"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 5.0.6; - }; - }; A83FE36D2EC90512005ACE9A /* XCRemoteSwiftPackageReference "KeychainAccess" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/kishikawakatsumi/KeychainAccess"; @@ -4346,11 +3814,6 @@ package = A83FE3652EC90482005ACE9A /* XCRemoteSwiftPackageReference "Starscream" */; productName = Starscream; }; - A83FE36B2EC904FD005ACE9A /* AppCenterCrashes */ = { - isa = XCSwiftPackageProductDependency; - package = A83FE3682EC904FD005ACE9A /* XCRemoteSwiftPackageReference "appcenter-sdk-apple" */; - productName = AppCenterCrashes; - }; A83FE3762EC905E3005ACE9A /* KeychainAccess */ = { isa = XCSwiftPackageProductDependency; package = A83FE36D2EC90512005ACE9A /* XCRemoteSwiftPackageReference "KeychainAccess" */; @@ -4380,31 +3843,6 @@ productName = "AltSign-Static"; }; /* End XCSwiftPackageProductDependency section */ - -/* Begin XCVersionGroup section */ - BF66EEB72501AECA007EE018 /* AltStore.xcdatamodeld */ = { - isa = XCVersionGroup; - children = ( - A81BF9E12D84C9E900768940 /* AltStore 17_1.xcdatamodel */, - D51E83802B86926B0092FC61 /* AltStore 17.xcdatamodel */, - D52E988928D002D30032BE6B /* AltStore 11.xcdatamodel */, - D5CA0C4C280E242500469595 /* AltStore 10.xcdatamodel */, - BFBF33142526754700B7B8C9 /* AltStore 9.xcdatamodel */, - BFF7EC4C25081E9300BDE521 /* AltStore 8.xcdatamodel */, - BF66EEBC2501AECA007EE018 /* AltStore 7.xcdatamodel */, - BF66EEBA2501AECA007EE018 /* AltStore 6.xcdatamodel */, - BF66EEBB2501AECA007EE018 /* AltStore 5.xcdatamodel */, - BF66EEBE2501AECA007EE018 /* AltStore 4.xcdatamodel */, - BF66EEB82501AECA007EE018 /* AltStore 3.xcdatamodel */, - BF66EEBD2501AECA007EE018 /* AltStore 2.xcdatamodel */, - BF66EEB92501AECA007EE018 /* AltStore.xcdatamodel */, - ); - currentVersion = A81BF9E12D84C9E900768940 /* AltStore 17_1.xcdatamodel */; - path = AltStore.xcdatamodeld; - sourceTree = ""; - versionGroupType = wrapper.xcdatamodel; - }; -/* End XCVersionGroup section */ }; rootObject = BFD247622284B9A500981D42 /* Project object */; } diff --git a/AltStore/Analytics/AnalyticsManager.swift b/AltStore/Analytics/AnalyticsManager.swift deleted file mode 100644 index bafcfc85..00000000 --- a/AltStore/Analytics/AnalyticsManager.swift +++ /dev/null @@ -1,82 +0,0 @@ -// -// AnalyticsManager.swift -// AltStore -// -// Created by Riley Testut on 3/31/20. -// Copyright © 2020 Riley Testut. All rights reserved. -// - -import Foundation - -import AltStoreCore - -#if DEBUG -private let appCenterAppSecret = "73532d3e-e573-4693-99a4-9f85840bbb44" -#elseif RELEASE -private let appCenterAppSecret = "73532d3e-e573-4693-99a4-9f85840bbb44" -#else -private let appCenterAppSecret = "73532d3e-e573-4693-99a4-9f85840bbb44" -#endif - -extension AnalyticsManager -{ - enum EventProperty: String - { - case name - case bundleIdentifier - case developerName - case version - case buildVersion - case size - case tintColor - case sourceIdentifier - case sourceURL - case patreonURL - case pledgeAmount - case pledgeCurrency - } - - enum Event - { - case installedApp(InstalledApp) - case updatedApp(InstalledApp) - case refreshedApp(InstalledApp) - - var name: String { - switch self - { - case .installedApp: return "installed_app" - case .updatedApp: return "updated_app" - case .refreshedApp: return "refreshed_app" - } - } - - var properties: [EventProperty: String] { - let properties: [EventProperty: String?] - - switch self - { - case .installedApp(let app), .updatedApp(let app), .refreshedApp(let app): - let appBundleURL = InstalledApp.fileURL(for: app) - let appBundleSize = FileManager.default.directorySize(at: appBundleURL) - - properties = [ - .name: app.name, - .bundleIdentifier: app.bundleIdentifier, - .developerName: app.storeApp?.developerName, - .version: app.version, - .buildVersion: app.buildVersion, - .size: appBundleSize?.description, - .tintColor: app.storeApp?.tintColor?.hexString, - .sourceIdentifier: app.storeApp?.sourceIdentifier, - .sourceURL: app.storeApp?.source?.sourceURL.absoluteString, - .patreonURL: app.storeApp?.source?.patreonURL?.absoluteString, - .pledgeAmount: app.storeApp?.pledgeAmount?.description, - .pledgeCurrency: app.storeApp?.pledgeCurrency - ] - } - - return properties.compactMapValues { $0 } - } - } -} diff --git a/AltStore/AppDelegate.swift b/AltStore/AppDelegate.swift index 16dd58d4..96e52f23 100644 --- a/AltStore/AppDelegate.swift +++ b/AltStore/AppDelegate.swift @@ -147,8 +147,6 @@ final class AppDelegate: UIResponder, UIApplicationDelegate { if UserDefaults.standard.enableEMPforWireguard { start_em_proxy(bind_addr: Consts.Proxy.serverURL) } - - PatreonAPI.shared.refreshPatreonAccount() } func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any]) -> Bool diff --git a/AltStore/LaunchViewController.swift b/AltStore/LaunchViewController.swift index 1eb63be8..8b423493 100644 --- a/AltStore/LaunchViewController.swift +++ b/AltStore/LaunchViewController.swift @@ -199,8 +199,6 @@ extension LaunchViewController { didFinishLaunching = true AppManager.shared.update() - AppManager.shared.updatePatronsIfNeeded() - PatreonAPI.shared.refreshPatreonAccount() AppManager.shared.updateAllSources { result in guard case .failure(let error) = result else { return } Logger.main.error("Failed to update sources on launch. \(error.localizedDescription, privacy: .public)") diff --git a/AltStore/Managing Apps/AppManager.swift b/AltStore/Managing Apps/AppManager.swift index 208b8c93..2a6d21a6 100644 --- a/AltStore/Managing Apps/AppManager.swift +++ b/AltStore/Managing Apps/AppManager.swift @@ -22,7 +22,6 @@ import Roxas extension AppManager { static let didFetchSourceNotification = Notification.Name("io.sidestore.AppManager.didFetchSource") - static let didUpdatePatronsNotification = Notification.Name("io.sidestore.AppManager.didUpdatePatrons") static let didAddSourceNotification = Notification.Name("io.sidestore.AppManager.didAddSource") static let didRemoveSourceNotification = Notification.Name("io.sidestore.AppManager.didRemoveSource") static let willInstallAppFromNewSourceNotification = Notification.Name("io.sidestore.AppManager.willInstallAppFromNewSource") @@ -590,34 +589,6 @@ extension AppManager return updateKnownSourcesOperation } - func updatePatronsIfNeeded() - { -// guard self.operationQueue.operations.allSatisfy({ !($0 is UpdatePatronsOperation) }) else { -// // There's already an UpdatePatronsOperation running. -// return -// } -// -// self.updatePatronsResult = nil -// -// let updatePatronsOperation = UpdatePatronsOperation() -// updatePatronsOperation.resultHandler = { (result) in -// do -// { -// try result.get() -// self.updatePatronsResult = .success(()) -// } -// catch -// { -// print("Error updating Friend Zone Patrons:", error) -// self.updatePatronsResult = .failure(error) -// } -// -// NotificationCenter.default.post(name: AppManager.didUpdatePatronsNotification, object: self) -// } -// -// self.run([updatePatronsOperation], context: nil) - } - func updateAllSources(completion: @escaping (Result) -> Void) { self.updateSourcesResult = nil @@ -1285,20 +1256,6 @@ private extension AppManager } } - var verifyPledgeOperation: VerifyAppPledgeOperation? - if let storeApp = app.storeApp - { - verifyPledgeOperation = VerifyAppPledgeOperation(storeApp: storeApp, presentingViewController: context.presentingViewController) - verifyPledgeOperation?.resultHandler = { result in - switch result - { - case .failure(let error): - context.error = error - case .success: break - } - } - } - /* Download */ let downloadedAppURL = context.temporaryDirectory.appendingPathComponent("Cached.app") let downloadOperation = DownloadAppOperation(app: downloadingApp, destinationURL: downloadedAppURL, context: context) @@ -1321,12 +1278,6 @@ private extension AppManager } progress.addChild(downloadOperation.progress, withPendingUnitCount: 25) - if let verifyPledgeOperation - { - downloadOperation.addDependency(verifyPledgeOperation) - } - - /* Verify App */ let permissionsMode = UserDefaults.shared.permissionCheckingDisabled ? .none : permissionReviewMode let verifyOperation = VerifyAppOperation(permissionsMode: permissionsMode, context: context, customBundleId: app.bundleIdentifier) @@ -1594,7 +1545,6 @@ private extension AppManager // Operations picked for request var operations = [ - verifyPledgeOperation, downloadOperation, verifyOperation, removeAppExtensionsOperation, @@ -2226,7 +2176,7 @@ private extension AppManager switch operation { case _ where requiresSerialQueue: fallthrough - case is InstallAppOperation, is RefreshAppOperation, is BackupAppOperation, is VerifyAppPledgeOperation: + case is InstallAppOperation, is RefreshAppOperation, is BackupAppOperation: if let installAltStoreOperation = operation as? InstallAppOperation, installAltStoreOperation.context.bundleIdentifier == StoreApp.altstoreAppID { // Add dependencies on previous serial operations in `context` to ensure re-installing AltStore goes last. diff --git a/AltStore/My Apps/MyAppsViewController.swift b/AltStore/My Apps/MyAppsViewController.swift index f66ae973..297b56fb 100644 --- a/AltStore/My Apps/MyAppsViewController.swift +++ b/AltStore/My Apps/MyAppsViewController.swift @@ -544,11 +544,6 @@ private extension MyAppsViewController { print("[ALTLog] Failed to fetch updates:", error) } - - if let patreonAccount = DatabaseManager.shared.patreonAccount(), patreonAccount.isAltStorePatron, PatreonAPI.shared.isAuthenticated - { - self.dataSource.predicate = nil - } } } diff --git a/AltStore/Operations/DownloadAppOperation.swift b/AltStore/Operations/DownloadAppOperation.swift index 0131c43a..b0068545 100644 --- a/AltStore/Operations/DownloadAppOperation.swift +++ b/AltStore/Operations/DownloadAppOperation.swift @@ -224,12 +224,6 @@ private extension DownloadAppOperation fileURL = sourceURL self.progress.completedUnitCount += 3 } - else if let host = sourceURL.host, host.lowercased().hasSuffix("patreon.com") && sourceURL.path.lowercased() == "/file" - { - // Patreon app - fileURL = try await downloadPatreonApp(from: sourceURL) - self.printWithTid("downloadPatreonApp: completed at \(fileURL.path)") - } else { // Regular app @@ -323,107 +317,6 @@ private extension DownloadAppOperation self.printWithTid("download started: \(downloadURL)") } } - - func downloadPatreonApp(from patreonURL: URL) async throws -> URL - { - guard !UserDefaults.shared.skipPatreonDownloads else { - // Skip all hacks, take user straight to Patreon post. - return try await downloadFromPatreonPost() - } - - do - { - // User is pledged to this app, attempt to download. - - let fileURL = try await downloadFile(from: patreonURL) - return fileURL - } - catch URLError.noPermissionsToReadFile - { - guard let presentingViewController = self.context.presentingViewController else { throw OperationError.pledgeRequired(appName: self.appName) } - - // Attempt to sign-in again in case our Patreon session has expired. - try await withCheckedThrowingContinuation { continuation in - PatreonAPI.shared.authenticate(presentingViewController: presentingViewController) { result in - do - { - let account = try result.get() - try account.managedObjectContext?.save() - - continuation.resume() - } - catch - { - continuation.resume(throwing: error) - } - } - } - - do - { - // Success, so try to download once more now that we're definitely authenticated. - - let fileURL = try await downloadFile(from: patreonURL) - return fileURL - } - catch URLError.noPermissionsToReadFile - { - // We know authentication succeeded, so failure must mean user isn't patron/on the correct tier, - // or that our hacky workaround for downloading Patreon attachments has failed. - // Either way, taking them directly to the post serves as a decent fallback. - - return try await downloadFromPatreonPost() - } - } - - func downloadFromPatreonPost() async throws -> URL - { - guard let presentingViewController = self.context.presentingViewController else { throw OperationError.pledgeRequired(appName: self.appName) } - - let downloadURL: URL - - if let components = URLComponents(url: patreonURL, resolvingAgainstBaseURL: false), - let postItem = components.queryItems?.first(where: { $0.name == "h" }), - let postID = postItem.value, - let patreonPostURL = URL(string: "https://www.patreon.com/posts/" + postID) - { - downloadURL = patreonPostURL - } - else - { - downloadURL = patreonURL - } - - return try await downloadFromPatreon(downloadURL, presentingViewController: presentingViewController) - } - } - - @MainActor - func downloadFromPatreon(_ patreonURL: URL, presentingViewController: UIViewController) async throws -> URL - { - let webViewController = WebViewController(url: patreonURL) - webViewController.delegate = self - webViewController.webView.navigationDelegate = self - - let navigationController = UINavigationController(rootViewController: webViewController) - presentingViewController.present(navigationController, animated: true) - - let downloadURL: URL - - do - { - defer { - navigationController.dismiss(animated: true) - } - - downloadURL = try await withCheckedThrowingContinuation { continuation in - self.downloadPatreonAppContinuation = continuation - } - } - - let fileURL = try await downloadFile(from: downloadURL) - return fileURL - } } } diff --git a/AltStore/Operations/FetchSourceOperation.swift b/AltStore/Operations/FetchSourceOperation.swift index 14c429d9..1e48e593 100644 --- a/AltStore/Operations/FetchSourceOperation.swift +++ b/AltStore/Operations/FetchSourceOperation.swift @@ -177,7 +177,6 @@ final class FetchSourceOperation: ResultOperation } try self.verify(source, response: response) - try self.verifyPledges(for: source, in: childContext) try childContext.save() @@ -264,63 +263,6 @@ private extension FetchSourceOperation } } - func verifyPledges(for source: Source, in context: NSManagedObjectContext) throws - { - guard let patreonURL = source.patreonURL, let patreonAccount = DatabaseManager.shared.patreonAccount(in: context) else { return } - - let normalizedPatreonURL = try patreonURL.normalized() - - guard let pledge = patreonAccount.pledges.first(where: { pledge in - do - { - let normalizedCampaignURL = try pledge.campaignURL.normalized() - return normalizedCampaignURL == normalizedPatreonURL - } - catch - { - Logger.main.error("Failed to normalize Patreon URL \(pledge.campaignURL, privacy: .public). \(error.localizedDescription, privacy: .public)") - return false - } - }) else { return } - - // User is pledged to this source's Patreon, so check which apps they're pledged to. - - // We only assign `isPledged = true` because false is already the default, - // and only one check needs to be true for isPledged to be true. - - for app in source.apps where app.isPledgeRequired - { - if let requiredAppPledge = app.pledgeAmount - { - if pledge.amount >= requiredAppPledge - { - app.isPledged = true - continue - } - } - - if let tierIDs = app._tierIDs - { - let tier = pledge.tiers.first { tierIDs.contains($0.identifier) } - if tier != nil - { - app.isPledged = true - continue - } - } - - if let rewardID = app._rewardID - { - let reward = pledge.rewards.first { $0.identifier == rewardID } - if reward != nil - { - app.isPledged = true - continue - } - } - } - } - func verifySourceNotBlocked(_ source: Source, response: URLResponse?) throws { guard let blockedSources = UserDefaults.shared.blockedSources else { return } diff --git a/AltStore/Operations/VerifyAppPledgeOperation.swift b/AltStore/Operations/VerifyAppPledgeOperation.swift deleted file mode 100644 index ef3eebf4..00000000 --- a/AltStore/Operations/VerifyAppPledgeOperation.swift +++ /dev/null @@ -1,281 +0,0 @@ -// -// VerifyAppPledgeOperation.swift -// AltStore -// -// Created by Riley Testut on 12/6/23. -// Copyright © 2023 Riley Testut. All rights reserved. -// - -import Combine - -import AltStoreCore - -class VerifyAppPledgeOperation: ResultOperation -{ - @AsyncManaged - private(set) var storeApp: StoreApp - - private let presentingViewController: UIViewController? - private var openPatreonPageContinuation: CheckedContinuation? - - private var cancellable: AnyCancellable? - - init(storeApp: StoreApp, presentingViewController: UIViewController?) - { - self.storeApp = storeApp - self.presentingViewController = presentingViewController - } - - override func main() - { - super.main() - - // _Don't_ rethrow earlier errors, or else user will only be taken to Patreon post if connected to same Wi-Fi as AltServer. - // if let error = self.context.error - // { - // self.finish(.failure(error)) - // return - // } - - Task.detached(priority: .medium) { - do - { - guard await self.$storeApp.isPledgeRequired else { return self.finish(.success(())) } - - if let presentingViewController = self.presentingViewController - { - // Ask user to connect Patreon account if they are signed-in to Patreon inside WebViewController, but haven't yet signed in through AltStore settings. - // This is most likely because the user joined a Patreon campaign directly through WebViewController before connecting Patreon account in settings. - try await self.connectPatreonAccountIfNeeded(presentingViewController: presentingViewController) - } - - do - { - try await self.verifyPledge() - } - catch let error as OperationError where error.code == .pledgeRequired || error.code == .pledgeInactive - { - guard - let presentingViewController = self.presentingViewController, - let source = await self.$storeApp.source, - let patreonURL = await self.$storeApp.perform({ _ in source.patreonURL }) - else { throw error } - - let components = URLComponents(url: patreonURL, resolvingAgainstBaseURL: false) - let lastPathComponent = components?.path.components(separatedBy: "/").last - - let username = lastPathComponent ?? patreonURL.lastPathComponent - - let checkoutURL: URL - if await self.$storeApp.prefersCustomPledge, let customPledgeURL = URL(string: "https://www.patreon.com/checkout/" + username + "?rid=0&custom=1") - { - checkoutURL = customPledgeURL - - let action = await UIAlertAction(title: NSLocalizedString("Continue", comment: ""), style: .default) - try await presentingViewController.presentConfirmationAlert(title: NSLocalizedString("Custom Pledge", comment: ""), - message: NSLocalizedString("This app supports custom pledges. Pledge any amount on Patreon to receive access.", comment: ""), - primaryAction: action) - } - else if !username.isEmpty, let url = URL(string: "https://www.patreon.com/join/" + username) - { - // Prefer /join URL over campaign homepage. - // URL format from https://support.patreon.com/hc/en-us/articles/360044376211-Managing-members-with-custom-pledges - checkoutURL = url - } - else - { - checkoutURL = patreonURL - } - - // Direct user to Patreon page if they're not already pledged. - await self.openPatreonPage(checkoutURL, presentingViewController: presentingViewController) - - let context = DatabaseManager.shared.persistentContainer.newBackgroundContext() - if let patreonAccount = await context.performAsync({ DatabaseManager.shared.patreonAccount(in: context) }) - { - // Patreon account is connected, so we'll update it via API to see if pledges changed. - // If so, we'll re-fetch the source to update pledge statuses. - try await self.updatePledges(for: source, account: patreonAccount) - } - else - { - // Patreon account is not connected, so prompt user to connect it. - try await self.connectPatreonAccountIfNeeded(presentingViewController: presentingViewController) - } - - do - { - try await self.verifyPledge() - } - catch - { - // Ignore error, but cancel remainder of operation. - throw CancellationError() - } - } - - self.finish(.success(())) - } - catch - { - self.finish(.failure(error)) - } - } - } -} - -private extension VerifyAppPledgeOperation -{ - func verifyPledge() async throws - { - let (appName, isPledged) = await self.$storeApp.perform { ($0.name, $0.isPledged) } - - if !PatreonAPI.shared.isAuthenticated || !isPledged - { - let isInstalled = await self.$storeApp.installedApp != nil - if isInstalled - { - // Assume if there is an InstalledApp, the user had previously pledged to this app. - throw OperationError.pledgeInactive(appName: appName) - } - else - { - throw OperationError.pledgeRequired(appName: appName) - } - } - } - - func connectPatreonAccountIfNeeded(presentingViewController: UIViewController) async throws - { - guard !PatreonAPI.shared.isAuthenticated, let authCookie = PatreonAPI.shared.authCookies.first(where: { $0.name.lowercased() == "session_id" }) else { return } - - Logger.sideload.debug("Patreon Auth cookie: \(authCookie.name)=\(authCookie.value)") - - let message = NSLocalizedString("You're signed into Patreon but haven't connected your account with SideStore.\n\nPlease connect your account to download Patreon-exclusive apps.", comment: "") - let action = await UIAlertAction(title: NSLocalizedString("Connect Patreon Account", comment: ""), style: .default) - - do - { - _ = try await presentingViewController.presentConfirmationAlert(title: NSLocalizedString("Patreon Account Detected", comment: ""), - message: message, actions: [action]) - } - catch - { - // Ignore and continue - return - } - - try await withCheckedThrowingContinuation { continuation in - PatreonAPI.shared.authenticate(presentingViewController: presentingViewController) { result in - do - { - let account = try result.get() - try account.managedObjectContext?.save() - - continuation.resume() - } - catch - { - continuation.resume(throwing: error) - } - } - } - - if let source = await self.$storeApp.source - { - // Fetch source to update pledge status now that account is connected. - try await self.update(source) - } - } - - func updatePledges(@AsyncManaged for source: Source, @AsyncManaged account: PatreonAccount) async throws - { - guard PatreonAPI.shared.isAuthenticated else { return } - - let previousPledgeIDs = Set(await $account.perform { $0.pledges.map(\.identifier) }) - - let updatedPledgeIDs = try await withCheckedThrowingContinuation { continuation in - PatreonAPI.shared.fetchAccount { (result: Result) in - do - { - let account = try result.get() - let pledgeIDs = Set(account.pledges.map(\.identifier)) - - try account.managedObjectContext?.save() - - continuation.resume(returning: pledgeIDs) - } - catch - { - Logger.sideload.error("Failed to update Patreon account. \(error.localizedDescription, privacy: .public)") - continuation.resume(throwing: error) - } - } - } - - if updatedPledgeIDs != previousPledgeIDs - { - // Active pledges changed, so fetch source to update pledge status. - try await self.update(source) - } - } - - func update(@AsyncManaged _ source: Source) async throws - { - let context = DatabaseManager.shared.persistentContainer.newBackgroundContext() - _ = try await AppManager.shared.fetchSource(sourceURL: $source.sourceURL, managedObjectContext: context) - - try await context.performAsync { - try context.save() - } - } - - @MainActor - func openPatreonPage(_ patreonURL: URL, presentingViewController: UIViewController) async - { - let webViewController = WebViewController(url: patreonURL) - webViewController.delegate = self - - let navigationController = UINavigationController(rootViewController: webViewController) - presentingViewController.present(navigationController, animated: true) - - // Automatically dismiss if user completes checkout flow. - self.cancellable = webViewController.webView.publisher(for: \.url, options: [.new]) - .compactMap { $0 } - .compactMap { URLComponents(url: $0, resolvingAgainstBaseURL: false) } - .compactMap { components in - let lastPathComponent = components.path.components(separatedBy: "/").last - return lastPathComponent?.lowercased() - } - .filter { $0 == "membership" } - .receive(on: RunLoop.main) - .sink { [weak self] url in - guard let continuation = self?.openPatreonPageContinuation else { return } - self?.openPatreonPageContinuation = nil - - continuation.resume() - } - - await withCheckedContinuation { continuation in - self.openPatreonPageContinuation = continuation - } - - // Cache auth cookies just in case user signed in. - await PatreonAPI.shared.saveAuthCookies() - - navigationController.dismiss(animated: true) - - self.cancellable = nil - } -} - -extension VerifyAppPledgeOperation: WebViewControllerDelegate -{ - func webViewControllerDidFinish(_ webViewController: WebViewController) - { - guard let continuation = self.openPatreonPageContinuation else { return } - self.openPatreonPageContinuation = nil - - continuation.resume() - } -} diff --git a/AltStore/SceneDelegate.swift b/AltStore/SceneDelegate.swift index 4381e5c4..44a52641 100644 --- a/AltStore/SceneDelegate.swift +++ b/AltStore/SceneDelegate.swift @@ -43,8 +43,6 @@ final class SceneDelegate: UIResponder, UIWindowSceneDelegate if UserDefaults.standard.enableEMPforWireguard { start_em_proxy(bind_addr: Consts.Proxy.serverURL) } - - PatreonAPI.shared.refreshPatreonAccount() } func sceneDidEnterBackground(_ scene: UIScene) diff --git a/AltStore/Settings/AboutPatreonHeaderView.xib b/AltStore/Settings/AboutPatreonHeaderView.xib index 3864ffb7..bf56dac3 100644 --- a/AltStore/Settings/AboutPatreonHeaderView.xib +++ b/AltStore/Settings/AboutPatreonHeaderView.xib @@ -1,9 +1,9 @@ - + - + @@ -23,7 +23,7 @@ - + @@ -31,36 +31,19 @@ - + - + - - - - - - - - - - - - - - - @@ -149,7 +124,6 @@ Following us on social media allows us to give quick updates and spread the word - @@ -158,8 +132,7 @@ Following us on social media allows us to give quick updates and spread the word - - + diff --git a/AltStore/Settings/OperationsLoggingContolView.swift b/AltStore/Settings/OperationsLoggingContolView.swift index 2f85516b..06a7bc77 100644 --- a/AltStore/Settings/OperationsLoggingContolView.swift +++ b/AltStore/Settings/OperationsLoggingContolView.swift @@ -42,63 +42,56 @@ struct OperationsLoggingControlView: View { } )) - CustomToggle("2. VerifyAppPledge", isOn: Binding( - get: { self.viewModel.getFromDatabase(for: VerifyAppPledgeOperation.self) }, - set: { value in - self.viewModel.updateDatabase(for: VerifyAppPledgeOperation.self, value: value) - } - )) - - CustomToggle("3. DownloadApp", isOn: Binding( + CustomToggle("2. DownloadApp", isOn: Binding( get: { self.viewModel.getFromDatabase(for: DownloadAppOperation.self) }, set: { value in self.viewModel.updateDatabase(for: DownloadAppOperation.self, value: value) } )) - CustomToggle("4. VerifyApp", isOn: Binding( + CustomToggle("3. VerifyApp", isOn: Binding( get: { self.viewModel.getFromDatabase(for: VerifyAppOperation.self) }, set: { value in self.viewModel.updateDatabase(for: VerifyAppOperation.self, value: value) } )) - CustomToggle("5. RemoveAppExtensions", isOn: Binding( + CustomToggle("4. RemoveAppExtensions", isOn: Binding( get: { self.viewModel.getFromDatabase(for: RemoveAppExtensionsOperation.self) }, set: { value in self.viewModel.updateDatabase(for: RemoveAppExtensionsOperation.self, value: value) } )) - CustomToggle("6. FetchAnisetteData", isOn: Binding( + CustomToggle("5. FetchAnisetteData", isOn: Binding( get: { self.viewModel.getFromDatabase(for: FetchAnisetteDataOperation.self) }, set: { value in self.viewModel.updateDatabase(for: FetchAnisetteDataOperation.self, value: value) } )) - CustomToggle("7. FetchProvisioningProfiles(I)", isOn: Binding( + CustomToggle("6. FetchProvisioningProfiles(I)", isOn: Binding( get: { self.viewModel.getFromDatabase(for: FetchProvisioningProfilesInstallOperation.self) }, set: { value in self.viewModel.updateDatabase(for: FetchProvisioningProfilesInstallOperation.self, value: value) } )) - CustomToggle("8. ResignApp", isOn: Binding( + CustomToggle("7. ResignApp", isOn: Binding( get: { self.viewModel.getFromDatabase(for: ResignAppOperation.self) }, set: { value in self.viewModel.updateDatabase(for: ResignAppOperation.self, value: value) } )) - CustomToggle("9. SendApp", isOn: Binding( + CustomToggle("8. SendApp", isOn: Binding( get: { self.viewModel.getFromDatabase(for: SendAppOperation.self) }, set: { value in self.viewModel.updateDatabase(for: SendAppOperation.self, value: value) } )) - CustomToggle("10. InstallApp", isOn: Binding( + CustomToggle("9. InstallApp", isOn: Binding( get: { self.viewModel.getFromDatabase(for: InstallAppOperation.self) }, set: { value in self.viewModel.updateDatabase(for: InstallAppOperation.self, value: value) @@ -203,16 +196,6 @@ struct OperationsLoggingControlView: View { )) } - CustomSection(header: Text("Patrons Operations")) - { - CustomToggle("1. UpdatePatrons", isOn: Binding( - get: { self.viewModel.getFromDatabase(for: UpdatePatronsOperation.self) }, - set: { value in - self.viewModel.updateDatabase(for: UpdatePatronsOperation.self, value: value) - } - )) - } - CustomSection(header: Text("Cache Operations")) { CustomToggle("1. ClearAppCache", isOn: Binding( diff --git a/AltStore/Settings/PatreonComponents.swift b/AltStore/Settings/PatreonComponents.swift index 299c4984..0e0a4ea5 100644 --- a/AltStore/Settings/PatreonComponents.swift +++ b/AltStore/Settings/PatreonComponents.swift @@ -13,60 +13,18 @@ final class PatronCollectionViewCell: UICollectionViewCell @IBOutlet var textLabel: UILabel! } -final class PatronsHeaderView: UICollectionReusableView -{ - let textLabel = UILabel() - - override init(frame: CGRect) - { - super.init(frame: frame) - - self.textLabel.font = UIFont.boldSystemFont(ofSize: 17) - self.textLabel.textColor = .white - self.addSubview(self.textLabel, pinningEdgesWith: UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20)) - } - - required init?(coder aDecoder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } -} - -final class PatronsFooterView: UICollectionReusableView -{ - let button = UIButton(type: .system) - - override init(frame: CGRect) - { - super.init(frame: frame) - - self.button.translatesAutoresizingMaskIntoConstraints = false - self.button.activityIndicatorView.style = .medium - self.button.activityIndicatorView.color = .white - self.button.titleLabel?.textColor = .white - self.addSubview(self.button) - - NSLayoutConstraint.activate([self.button.centerXAnchor.constraint(equalTo: self.centerXAnchor), - self.button.centerYAnchor.constraint(equalTo: self.centerYAnchor)]) - } - - required init?(coder aDecoder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } -} final class AboutPatreonHeaderView: UICollectionReusableView { @IBOutlet var supportButton: UIButton! @IBOutlet var twitterButton: UIButton! @IBOutlet var instagramButton: UIButton! - @IBOutlet var accountButton: UIButton! @IBOutlet var textView: UITextView! @IBOutlet private var rileyLabel: UILabel! @IBOutlet private var shaneLabel: UILabel! @IBOutlet private var rileyImageView: UIImageView! - @IBOutlet private var shaneImageView: UIImageView! override func awakeFromNib() { @@ -76,13 +34,13 @@ final class AboutPatreonHeaderView: UICollectionReusableView self.textView.layer.cornerRadius = 20 self.textView.textContainer.lineFragmentPadding = 0 - for imageView in [self.rileyImageView, self.shaneImageView].compactMap({$0}) + for imageView in [self.rileyImageView].compactMap({$0}) { imageView.clipsToBounds = true imageView.layer.cornerRadius = imageView.bounds.midY } - for button in [self.supportButton, self.accountButton, self.twitterButton, self.instagramButton].compactMap({$0}) + for button in [self.supportButton, self.twitterButton, self.instagramButton].compactMap({$0}) { button.clipsToBounds = true button.layer.cornerRadius = 16 diff --git a/AltStore/Settings/PatreonViewController.swift b/AltStore/Settings/PatreonViewController.swift index 2a0dbe0a..f95ae098 100644 --- a/AltStore/Settings/PatreonViewController.swift +++ b/AltStore/Settings/PatreonViewController.swift @@ -13,26 +13,10 @@ import AuthenticationServices import AltStoreCore import Roxas -extension PatreonViewController -{ - private enum Section: Int, CaseIterable - { - case about - case patrons - } -} - final class PatreonViewController: UICollectionViewController { -// private lazy var dataSource = self.makeDataSource() - private lazy var patronsDataSource = self.makePatronsDataSource() - private var prototypeAboutHeader: AboutPatreonHeaderView! - override var preferredStatusBarStyle: UIStatusBarStyle { - return .lightContent - } - override func viewDidLoad() { super.viewDidLoad() @@ -40,24 +24,14 @@ final class PatreonViewController: UICollectionViewController let aboutHeaderNib = UINib(nibName: "AboutPatreonHeaderView", bundle: nil) self.prototypeAboutHeader = aboutHeaderNib.instantiate(withOwner: nil, options: nil)[0] as? AboutPatreonHeaderView -// self.collectionView.dataSource = self.dataSource - self.collectionView.register(aboutHeaderNib, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: "AboutHeader") - self.collectionView.register(PatronsHeaderView.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: "PatronsHeader") - self.collectionView.register(PatronsFooterView.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionFooter, withReuseIdentifier: "PatronsFooter") - - NotificationCenter.default.addObserver(self, selector: #selector(PatreonViewController.didUpdatePatrons(_:)), name: AppManager.didUpdatePatronsNotification, object: nil) - - self.update() + self.collectionView.reloadData() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) - - //self.fetchPatrons() - - self.update() + self.collectionView.reloadData() } override func viewDidLayoutSubviews() @@ -76,103 +50,17 @@ final class PatreonViewController: UICollectionViewController private extension PatreonViewController { - func makeDataSource() -> RSTCompositeCollectionViewDataSource - { - let aboutDataSource = RSTDynamicCollectionViewDataSource() - aboutDataSource.numberOfSectionsHandler = { 1 } - aboutDataSource.numberOfItemsHandler = { _ in 0 } - - let dataSource = RSTCompositeCollectionViewDataSource(dataSources: [aboutDataSource, self.patronsDataSource]) - dataSource.proxy = self - return dataSource - } - - func makePatronsDataSource() -> RSTFetchedResultsCollectionViewDataSource - { - let fetchRequest: NSFetchRequest = ManagedPatron.fetchRequest() - fetchRequest.sortDescriptors = [NSSortDescriptor(key: #keyPath(ManagedPatron.name), ascending: true, selector: #selector(NSString.caseInsensitiveCompare(_:)))] - - let patronsDataSource = RSTFetchedResultsCollectionViewDataSource(fetchRequest: fetchRequest, managedObjectContext: DatabaseManager.shared.viewContext) - patronsDataSource.cellConfigurationHandler = { (cell, patron, indexPath) in - let cell = cell as! PatronCollectionViewCell - cell.textLabel.text = patron.name - } - - return patronsDataSource - } - - func update() - { - self.collectionView.reloadData() - } - func prepare(_ headerView: AboutPatreonHeaderView) { headerView.layoutMargins = self.view.layoutMargins - headerView.supportButton.addTarget(self, action: #selector(PatreonViewController.openPatreonURL(_:)), for: .primaryActionTriggered) headerView.twitterButton.addTarget(self, action: #selector(PatreonViewController.openTwitterURL(_:)), for: .primaryActionTriggered) headerView.instagramButton.addTarget(self, action: #selector(PatreonViewController.openInstagramURL(_:)), for: .primaryActionTriggered) - - let defaultSupportButtonTitle = NSLocalizedString("Become a patron", comment: "") - let isPatronSupportButtonTitle = NSLocalizedString("View Patreon", comment: "") - - let defaultText = NSLocalizedString(""" - Hello, thank you for using SideStore! - - If you would subscribe to the patreon that would support us and make sure we can continue developing SideStore for you. - - -SideTeam - """, comment: "") - - let isPatronText = NSLocalizedString(""" - Hey , - - You’re the best. Your account was linked successfully, so you now have access to any beta versions of our apps. You can find them all in the Browse tab. - - Thanks for all of your support. Enjoy! - - SideTeam - """, comment: "") - - if let account = DatabaseManager.shared.patreonAccount(), PatreonAPI.shared.isAuthenticated - { - headerView.accountButton.addTarget(self, action: #selector(PatreonViewController.signOut(_:)), for: .primaryActionTriggered) - headerView.accountButton.setTitle(String(format: NSLocalizedString("Unlink %@", comment: ""), account.name), for: .normal) - - if account.isAltStorePatron - { - headerView.supportButton.setTitle(isPatronSupportButtonTitle, for: .normal) - - let font = UIFont.systemFont(ofSize: 16) - - let attributedText = NSMutableAttributedString(string: isPatronText, attributes: [.font: font, - .foregroundColor: UIColor.white]) - - let boldedName = NSAttributedString(string: account.firstName ?? account.name, - attributes: [.font: UIFont.boldSystemFont(ofSize: font.pointSize), - .foregroundColor: UIColor.white]) - attributedText.insert(boldedName, at: 4) - - headerView.textView.attributedText = attributedText - } - else - { - headerView.supportButton.setTitle(defaultSupportButtonTitle, for: .normal) - headerView.textView.text = defaultText - } - } - } } private extension PatreonViewController { - @objc func fetchPatrons() - { - AppManager.shared.updatePatronsIfNeeded() - self.update() - } - @objc func openPatreonURL(_ sender: UIButton) { let patreonURL = URL(string: "https://www.patreon.com/SideStoreIO")! @@ -199,148 +87,15 @@ private extension PatreonViewController safariViewController.preferredControlTintColor = self.view.tintColor self.present(safariViewController, animated: true, completion: nil) } - - @IBAction func authenticate(_ sender: UIBarButtonItem) - { - PatreonAPI.shared.authenticate(presentingViewController: self) { (result) in - do - { - let account = try result.get() - try account.managedObjectContext?.save() - - // Update sources to show any Patreon-only apps. - AppManager.shared.fetchSources { result in - do - { - let (_, context) = try result.get() - try context.save() - } - catch - { - Logger.main.error("Failed to update sources after authenticating Patreon account. \(error.localizedDescription, privacy: .public)") - } - - DispatchQueue.main.async { - self.update() - } - } - } - catch is CancellationError - { - // Clear in-app browser cache in case they are signed into wrong account. - Task.detached { - await PatreonAPI.shared.deleteAuthCookies() - } - } - catch - { - DispatchQueue.main.async { - let toastView = ToastView(error: error) - toastView.show(in: self) - } - } - } - } - - @IBAction func signOut(_ sender: UIBarButtonItem) - { - func signOut() - { - PatreonAPI.shared.signOut { (result) in - do - { - try result.get() - - DispatchQueue.main.async { - self.update() - } - } - catch - { - DispatchQueue.main.async { - let toastView = ToastView(error: error) - toastView.show(in: self) - } - } - } - } - - - #if MARKETPLACE - let message = NSLocalizedString("You will no longer be able to install or update any apps that require pledges.", comment: "") - #else - let message = NSLocalizedString("You will no longer be able to install or refresh any apps that require pledges.", comment: "") - #endif - - let alertController = UIAlertController(title: NSLocalizedString("Are you sure you want to unlink your Patreon account?", comment: ""), message: message, preferredStyle: .actionSheet) - alertController.addAction(UIAlertAction(title: NSLocalizedString("Unlink Patreon Account", comment: ""), style: .destructive) { _ in signOut() }) - alertController.addAction(.cancel) - self.present(alertController, animated: true, completion: nil) - } - - @objc func didUpdatePatrons(_ notification: Notification) - { - DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { - // Wait short delay before reloading or else footer won't properly update if it's already visible 🤷‍♂️ - self.collectionView.reloadData() - } - } } extension PatreonViewController { override func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { - let section = Section.allCases[indexPath.section] - switch section - { - case .about: - let headerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "AboutHeader", for: indexPath) as! AboutPatreonHeaderView - self.prepare(headerView) - return headerView - - case .patrons: - if kind == UICollectionView.elementKindSectionHeader - { - let headerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "PatronsHeader", for: indexPath) as! PatronsHeaderView - headerView.textLabel.text = NSLocalizedString("Special thanks to...", comment: "") - return headerView - } - else - { - let footerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "PatronsFooter", for: indexPath) as! PatronsFooterView - footerView.button.isIndicatingActivity = false - footerView.button.isHidden = false - //footerView.button.addTarget(self, action: #selector(PatreonViewController.fetchPatrons), for: .primaryActionTriggered) - - switch AppManager.shared.updatePatronsResult - { - case .none: footerView.button.isIndicatingActivity = true - case .success?: footerView.button.isHidden = true - case .failure?: - // In simulator debug builds only enable debug mode flag - #if DEBUG && targetEnvironment(simulator) - let debug = true - #else - let debug = false - #endif - - if self.patronsDataSource.itemCount == 0 || debug - { - // Only show error message if there aren't any cached Patrons (or if this is a debug build). - - footerView.button.isHidden = false - footerView.button.setTitle(NSLocalizedString("Error Loading Patrons", comment: ""), for: .normal) - } - else - { - footerView.button.isHidden = true - } - } - - return footerView - } - } + let headerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "AboutHeader", for: indexPath) as! AboutPatreonHeaderView + self.prepare(headerView) + return headerView } } @@ -348,31 +103,11 @@ extension PatreonViewController: UICollectionViewDelegateFlowLayout { func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize { - let section = Section.allCases[section] - switch section - { - case .about: - let widthConstraint = self.prototypeAboutHeader.widthAnchor.constraint(equalToConstant: collectionView.bounds.width) - NSLayoutConstraint.activate([widthConstraint]) - defer { NSLayoutConstraint.deactivate([widthConstraint]) } - - self.prepare(self.prototypeAboutHeader) - - let size = self.prototypeAboutHeader.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize) - return size - - case .patrons: - return CGSize(width: 0, height: 0) - } - } - - func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForFooterInSection section: Int) -> CGSize - { - let section = Section.allCases[section] - switch section - { - case .about: return .zero - case .patrons: return CGSize(width: 320, height: 44) - } + let widthConstraint = self.prototypeAboutHeader.widthAnchor.constraint(equalToConstant: collectionView.bounds.width) + NSLayoutConstraint.activate([widthConstraint]) + defer { NSLayoutConstraint.deactivate([widthConstraint]) } + + self.prepare(self.prototypeAboutHeader) + return self.prototypeAboutHeader.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize) } } diff --git a/AltStore/Settings/Settings.storyboard b/AltStore/Settings/Settings.storyboard index f14d7c1a..358d5c0d 100644 --- a/AltStore/Settings/Settings.storyboard +++ b/AltStore/Settings/Settings.storyboard @@ -22,7 +22,7 @@ - +