mirror of
https://github.com/SideStore/SideStore.git
synced 2026-02-08 22:33:26 +01:00
- [WIP]: migrations fix for coredata from v11(0.5.9) to v17_1(0.6.1) and v17(0.6.0 to v17_1(0.6.1)
This commit is contained in:
@@ -69,15 +69,21 @@
|
|||||||
A81A8CD12D68BA9B0086C96F /* TreeMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = A81A8CB02D68B0320086C96F /* TreeMap.swift */; };
|
A81A8CD12D68BA9B0086C96F /* TreeMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = A81A8CB02D68B0320086C96F /* TreeMap.swift */; };
|
||||||
A81A8CD22D68BAA30086C96F /* SingletonGenericMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = A868CFE32D319988002F1201 /* SingletonGenericMap.swift */; };
|
A81A8CD22D68BAA30086C96F /* SingletonGenericMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = A868CFE32D319988002F1201 /* SingletonGenericMap.swift */; };
|
||||||
A81A8CD42D68BAFF0086C96F /* DataStructureTests.xctestplan in Resources */ = {isa = PBXBuildFile; fileRef = A81A8CD32D68BAFF0086C96F /* DataStructureTests.xctestplan */; };
|
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 */; };
|
||||||
|
A81BF9ED2D84CF5900768940 /* ReleaseTrack17To17_1MigrationPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = A81BF9EC2D84CF5900768940 /* ReleaseTrack17To17_1MigrationPolicy.swift */; };
|
||||||
A82067842D03DC0600645C0D /* OperatingSystemVersion+Comparable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5708416292448DA00D42D34 /* OperatingSystemVersion+Comparable.swift */; };
|
A82067842D03DC0600645C0D /* OperatingSystemVersion+Comparable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5708416292448DA00D42D34 /* OperatingSystemVersion+Comparable.swift */; };
|
||||||
A82067C42D03E0DE00645C0D /* SemanticVersion in Frameworks */ = {isa = PBXBuildFile; productRef = A82067C32D03E0DE00645C0D /* SemanticVersion */; };
|
A82067C42D03E0DE00645C0D /* SemanticVersion in Frameworks */ = {isa = PBXBuildFile; productRef = A82067C32D03E0DE00645C0D /* SemanticVersion */; };
|
||||||
A8228B5B2D6E2C0C00F7CE0E /* (null) in Sources */ = {isa = PBXBuildFile; };
|
A8228B5B2D6E2C0C00F7CE0E /* (null) in Sources */ = {isa = PBXBuildFile; };
|
||||||
A8228B5D2D6E361F00F7CE0E /* (null) in Sources */ = {isa = PBXBuildFile; };
|
A8228B5D2D6E361F00F7CE0E /* (null) in Sources */ = {isa = PBXBuildFile; };
|
||||||
A859ED5C2D1EE827003DCC58 /* OpenSSL.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = A859ED5B2D1EE80D003DCC58 /* OpenSSL.xcframework */; };
|
A859ED5C2D1EE827003DCC58 /* OpenSSL.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = A859ED5B2D1EE80D003DCC58 /* OpenSSL.xcframework */; };
|
||||||
A859ED5D2D1EE827003DCC58 /* OpenSSL.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = A859ED5B2D1EE80D003DCC58 /* OpenSSL.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
A859ED5D2D1EE827003DCC58 /* OpenSSL.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = A859ED5B2D1EE80D003DCC58 /* OpenSSL.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||||
|
A85E436C2D8AF6CD00E89240 /* Source11To17_1MigrationPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = A85E436B2D8AF6CD00E89240 /* Source11To17_1MigrationPolicy.swift */; };
|
||||||
|
A85E436E2D8AF72F00E89240 /* StoreApp11To17_1MigrationPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = A85E436D2D8AF72F00E89240 /* StoreApp11To17_1MigrationPolicy.swift */; };
|
||||||
|
A85E43702D8AF77A00E89240 /* AppPermission11To17_1MigrationPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = A85E436F2D8AF77A00E89240 /* AppPermission11To17_1MigrationPolicy.swift */; };
|
||||||
|
A85E43722D8AF7F100E89240 /* ReleaseTrack11To17_1MigrationPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = A85E43712D8AF7F100E89240 /* ReleaseTrack11To17_1MigrationPolicy.swift */; };
|
||||||
A86315DF2D3EB2DE0048FA40 /* ErrorProcessing.swift in Sources */ = {isa = PBXBuildFile; fileRef = A86315DE2D3EB2D80048FA40 /* ErrorProcessing.swift */; };
|
A86315DF2D3EB2DE0048FA40 /* ErrorProcessing.swift in Sources */ = {isa = PBXBuildFile; fileRef = A86315DE2D3EB2D80048FA40 /* ErrorProcessing.swift */; };
|
||||||
A8696EE42D34512C00E96389 /* RemoveAppExtensionsOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8696EE32D34512C00E96389 /* RemoveAppExtensionsOperation.swift */; };
|
A8696EE42D34512C00E96389 /* RemoveAppExtensionsOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8696EE32D34512C00E96389 /* RemoveAppExtensionsOperation.swift */; };
|
||||||
A881E7C72D6EF58C00954AD2 /* AltStore11ToAltStore17.xcmappingmodel in Sources */ = {isa = PBXBuildFile; fileRef = A881E7C62D6EF58C00954AD2 /* AltStore11ToAltStore17.xcmappingmodel */; };
|
|
||||||
A881E7CB2D6EF5AB00954AD2 /* StoreApp11To17MigrationPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = A881E7CA2D6EF5AB00954AD2 /* StoreApp11To17MigrationPolicy.swift */; };
|
A881E7CB2D6EF5AB00954AD2 /* StoreApp11To17MigrationPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = A881E7CA2D6EF5AB00954AD2 /* StoreApp11To17MigrationPolicy.swift */; };
|
||||||
A88B8C492D35AD3200F53F9D /* OperationsLoggingContolView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A88B8C482D35AD3200F53F9D /* OperationsLoggingContolView.swift */; };
|
A88B8C492D35AD3200F53F9D /* OperationsLoggingContolView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A88B8C482D35AD3200F53F9D /* OperationsLoggingContolView.swift */; };
|
||||||
A88B8C552D35F1EC00F53F9D /* OperationsLoggingControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = A88B8C542D35F1EC00F53F9D /* OperationsLoggingControl.swift */; };
|
A88B8C552D35F1EC00F53F9D /* OperationsLoggingControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = A88B8C542D35F1EC00F53F9D /* OperationsLoggingControl.swift */; };
|
||||||
@@ -103,6 +109,9 @@
|
|||||||
A8C6D5142D1EE8D700DF01F1 /* OpenSSL.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = A859ED5B2D1EE80D003DCC58 /* OpenSSL.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
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 */; };
|
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, ); }; };
|
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 */; };
|
||||||
|
A8C924282D8E7463009D9953 /* AltStore11ToAltStore17_1.xcmappingmodel in Sources */ = {isa = PBXBuildFile; fileRef = A8C924272D8E7463009D9953 /* AltStore11ToAltStore17_1.xcmappingmodel */; };
|
||||||
|
A8C9242A2D8E75AD009D9953 /* AltStore17ToAltStore17_1.xcmappingmodel in Sources */ = {isa = PBXBuildFile; fileRef = A8C924292D8E75AD009D9953 /* AltStore17ToAltStore17_1.xcmappingmodel */; };
|
||||||
A8D484D82D0CD306002C691D /* AltBackup.ipa in Resources */ = {isa = PBXBuildFile; fileRef = A8D484D72D0CD306002C691D /* AltBackup.ipa */; };
|
A8D484D82D0CD306002C691D /* AltBackup.ipa in Resources */ = {isa = PBXBuildFile; fileRef = A8D484D72D0CD306002C691D /* AltBackup.ipa */; };
|
||||||
A8D49F532D3D2F9400844B92 /* ProcessInfo+AltStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8D49F522D3D2F9400844B92 /* ProcessInfo+AltStore.swift */; };
|
A8D49F532D3D2F9400844B92 /* ProcessInfo+AltStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8D49F522D3D2F9400844B92 /* ProcessInfo+AltStore.swift */; };
|
||||||
A8E2DB312D684E2A009E5D31 /* UITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8E2DB2E2D684E2A009E5D31 /* UITests.swift */; };
|
A8E2DB312D684E2A009E5D31 /* UITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8E2DB2E2D684E2A009E5D31 /* UITests.swift */; };
|
||||||
@@ -667,6 +676,10 @@
|
|||||||
A81A8CC52D68BA610086C96F /* DataStructureTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DataStructureTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
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 = "<group>"; };
|
A81A8CC72D68BA610086C96F /* DataStructuresTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataStructuresTests.swift; sourceTree = "<group>"; };
|
||||||
A81A8CD32D68BAFF0086C96F /* DataStructureTests.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = DataStructureTests.xctestplan; sourceTree = "<group>"; };
|
A81A8CD32D68BAFF0086C96F /* DataStructureTests.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = DataStructureTests.xctestplan; sourceTree = "<group>"; };
|
||||||
|
A81BF9E12D84C9E900768940 /* AltStore 17_1.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "AltStore 17_1.xcdatamodel"; sourceTree = "<group>"; };
|
||||||
|
A81BF9E22D84CB0C00768940 /* AppPermission17To17_1MigrationPolicy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppPermission17To17_1MigrationPolicy.swift; sourceTree = "<group>"; };
|
||||||
|
A81BF9E32D84CB0C00768940 /* Source17To17_1MigrationPolicy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Source17To17_1MigrationPolicy.swift; sourceTree = "<group>"; };
|
||||||
|
A81BF9EC2D84CF5900768940 /* ReleaseTrack17To17_1MigrationPolicy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReleaseTrack17To17_1MigrationPolicy.swift; sourceTree = "<group>"; };
|
||||||
A859ED5B2D1EE80D003DCC58 /* OpenSSL.xcframework */ = {isa = PBXFileReference; expectedSignature = "AppleDeveloperProgram:67RAULRX93:Marcin Krzyzanowski"; lastKnownFileType = wrapper.xcframework; name = OpenSSL.xcframework; path = SideStore/AltSign/Dependencies/OpenSSL/Frameworks/OpenSSL.xcframework; sourceTree = "<group>"; };
|
A859ED5B2D1EE80D003DCC58 /* OpenSSL.xcframework */ = {isa = PBXFileReference; expectedSignature = "AppleDeveloperProgram:67RAULRX93:Marcin Krzyzanowski"; lastKnownFileType = wrapper.xcframework; name = OpenSSL.xcframework; path = SideStore/AltSign/Dependencies/OpenSSL/Frameworks/OpenSSL.xcframework; sourceTree = "<group>"; };
|
||||||
A85ACB8E2D1F31C400AA3DE7 /* AltBackup.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AltBackup.xcconfig; sourceTree = "<group>"; };
|
A85ACB8E2D1F31C400AA3DE7 /* AltBackup.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AltBackup.xcconfig; sourceTree = "<group>"; };
|
||||||
A85ACB8F2D1F31C400AA3DE7 /* AltStore.debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AltStore.debug.xcconfig; sourceTree = "<group>"; };
|
A85ACB8F2D1F31C400AA3DE7 /* AltStore.debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AltStore.debug.xcconfig; sourceTree = "<group>"; };
|
||||||
@@ -674,12 +687,15 @@
|
|||||||
A85ACB912D1F31C400AA3DE7 /* AltStoreCore.debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AltStoreCore.debug.xcconfig; sourceTree = "<group>"; };
|
A85ACB912D1F31C400AA3DE7 /* AltStoreCore.debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AltStoreCore.debug.xcconfig; sourceTree = "<group>"; };
|
||||||
A85ACB922D1F31C400AA3DE7 /* AltStoreCore.release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AltStoreCore.release.xcconfig; sourceTree = "<group>"; };
|
A85ACB922D1F31C400AA3DE7 /* AltStoreCore.release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AltStoreCore.release.xcconfig; sourceTree = "<group>"; };
|
||||||
A85ACB932D1F31C400AA3DE7 /* AltWidgetExtension.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AltWidgetExtension.xcconfig; sourceTree = "<group>"; };
|
A85ACB932D1F31C400AA3DE7 /* AltWidgetExtension.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AltWidgetExtension.xcconfig; sourceTree = "<group>"; };
|
||||||
|
A85E436B2D8AF6CD00E89240 /* Source11To17_1MigrationPolicy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Source11To17_1MigrationPolicy.swift; sourceTree = "<group>"; };
|
||||||
|
A85E436D2D8AF72F00E89240 /* StoreApp11To17_1MigrationPolicy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreApp11To17_1MigrationPolicy.swift; sourceTree = "<group>"; };
|
||||||
|
A85E436F2D8AF77A00E89240 /* AppPermission11To17_1MigrationPolicy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppPermission11To17_1MigrationPolicy.swift; sourceTree = "<group>"; };
|
||||||
|
A85E43712D8AF7F100E89240 /* ReleaseTrack11To17_1MigrationPolicy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReleaseTrack11To17_1MigrationPolicy.swift; sourceTree = "<group>"; };
|
||||||
A86202322D1F35640091187B /* AltStore.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AltStore.xcconfig; sourceTree = "<group>"; };
|
A86202322D1F35640091187B /* AltStore.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AltStore.xcconfig; sourceTree = "<group>"; };
|
||||||
A86202332D1F35640091187B /* AltStoreCore.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AltStoreCore.xcconfig; sourceTree = "<group>"; };
|
A86202332D1F35640091187B /* AltStoreCore.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AltStoreCore.xcconfig; sourceTree = "<group>"; };
|
||||||
A86315DE2D3EB2D80048FA40 /* ErrorProcessing.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorProcessing.swift; sourceTree = "<group>"; };
|
A86315DE2D3EB2D80048FA40 /* ErrorProcessing.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorProcessing.swift; sourceTree = "<group>"; };
|
||||||
A868CFE32D319988002F1201 /* SingletonGenericMap.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SingletonGenericMap.swift; sourceTree = "<group>"; };
|
A868CFE32D319988002F1201 /* SingletonGenericMap.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SingletonGenericMap.swift; sourceTree = "<group>"; };
|
||||||
A8696EE32D34512C00E96389 /* RemoveAppExtensionsOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoveAppExtensionsOperation.swift; sourceTree = "<group>"; };
|
A8696EE32D34512C00E96389 /* RemoveAppExtensionsOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoveAppExtensionsOperation.swift; sourceTree = "<group>"; };
|
||||||
A881E7C62D6EF58C00954AD2 /* AltStore11ToAltStore17.xcmappingmodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcmappingmodel; path = AltStore11ToAltStore17.xcmappingmodel; sourceTree = "<group>"; };
|
|
||||||
A881E7CA2D6EF5AB00954AD2 /* StoreApp11To17MigrationPolicy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreApp11To17MigrationPolicy.swift; sourceTree = "<group>"; };
|
A881E7CA2D6EF5AB00954AD2 /* StoreApp11To17MigrationPolicy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreApp11To17MigrationPolicy.swift; sourceTree = "<group>"; };
|
||||||
A881E8562D6FBBAF00954AD2 /* DataStructureTests.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = DataStructureTests.xcconfig; sourceTree = "<group>"; };
|
A881E8562D6FBBAF00954AD2 /* DataStructureTests.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = DataStructureTests.xcconfig; sourceTree = "<group>"; };
|
||||||
A88B8C482D35AD3200F53F9D /* OperationsLoggingContolView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OperationsLoggingContolView.swift; sourceTree = "<group>"; };
|
A88B8C482D35AD3200F53F9D /* OperationsLoggingContolView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OperationsLoggingContolView.swift; sourceTree = "<group>"; };
|
||||||
@@ -696,6 +712,9 @@
|
|||||||
A8C38C2B2D206AD900E83DBD /* AbstractClassError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AbstractClassError.swift; sourceTree = "<group>"; };
|
A8C38C2B2D206AD900E83DBD /* AbstractClassError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AbstractClassError.swift; sourceTree = "<group>"; };
|
||||||
A8C38C312D206B2500E83DBD /* FileOutputStream.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileOutputStream.swift; sourceTree = "<group>"; };
|
A8C38C312D206B2500E83DBD /* FileOutputStream.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileOutputStream.swift; sourceTree = "<group>"; };
|
||||||
A8C38C372D2084D000E83DBD /* ConsoleLogView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConsoleLogView.swift; sourceTree = "<group>"; };
|
A8C38C372D2084D000E83DBD /* ConsoleLogView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConsoleLogView.swift; sourceTree = "<group>"; };
|
||||||
|
A8C924232D8E73B1009D9953 /* AltStore11ToAltStore17.xcmappingmodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcmappingmodel; path = AltStore11ToAltStore17.xcmappingmodel; sourceTree = "<group>"; };
|
||||||
|
A8C924272D8E7463009D9953 /* AltStore11ToAltStore17_1.xcmappingmodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcmappingmodel; path = AltStore11ToAltStore17_1.xcmappingmodel; sourceTree = "<group>"; };
|
||||||
|
A8C924292D8E75AD009D9953 /* AltStore17ToAltStore17_1.xcmappingmodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcmappingmodel; path = AltStore17ToAltStore17_1.xcmappingmodel; sourceTree = "<group>"; };
|
||||||
A8D484D72D0CD306002C691D /* AltBackup.ipa */ = {isa = PBXFileReference; lastKnownFileType = file; path = AltBackup.ipa; sourceTree = "<group>"; };
|
A8D484D72D0CD306002C691D /* AltBackup.ipa */ = {isa = PBXFileReference; lastKnownFileType = file; path = AltBackup.ipa; sourceTree = "<group>"; };
|
||||||
A8D49F522D3D2F9400844B92 /* ProcessInfo+AltStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ProcessInfo+AltStore.swift"; sourceTree = "<group>"; };
|
A8D49F522D3D2F9400844B92 /* ProcessInfo+AltStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ProcessInfo+AltStore.swift"; sourceTree = "<group>"; };
|
||||||
A8E2DB212D684CBD009E5D31 /* UITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = UITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
A8E2DB212D684CBD009E5D31 /* UITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = UITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
@@ -1281,6 +1300,36 @@
|
|||||||
path = xcconfigs;
|
path = xcconfigs;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
A85E43732D8AF82100E89240 /* v11-to-v17 */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
A881E7CA2D6EF5AB00954AD2 /* StoreApp11To17MigrationPolicy.swift */,
|
||||||
|
D5185B812AE1E71D00646E33 /* Source11To17MigrationPolicy.swift */,
|
||||||
|
);
|
||||||
|
path = "v11-to-v17";
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
A85E43742D8AF84200E89240 /* v17-to-v17_1 */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
A81BF9E32D84CB0C00768940 /* Source17To17_1MigrationPolicy.swift */,
|
||||||
|
A81BF9E22D84CB0C00768940 /* AppPermission17To17_1MigrationPolicy.swift */,
|
||||||
|
A81BF9EC2D84CF5900768940 /* ReleaseTrack17To17_1MigrationPolicy.swift */,
|
||||||
|
);
|
||||||
|
path = "v17-to-v17_1";
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
A85E43752D8AF86400E89240 /* v11-to-v17_1 */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
A85E436B2D8AF6CD00E89240 /* Source11To17_1MigrationPolicy.swift */,
|
||||||
|
A85E436D2D8AF72F00E89240 /* StoreApp11To17_1MigrationPolicy.swift */,
|
||||||
|
A85E436F2D8AF77A00E89240 /* AppPermission11To17_1MigrationPolicy.swift */,
|
||||||
|
A85E43712D8AF7F100E89240 /* ReleaseTrack11To17_1MigrationPolicy.swift */,
|
||||||
|
);
|
||||||
|
path = "v11-to-v17_1";
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
A86315DD2D3EB2BD0048FA40 /* errors */ = {
|
A86315DD2D3EB2BD0048FA40 /* errors */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
@@ -1821,10 +1870,11 @@
|
|||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
BF66EEAF2501AECA007EE018 /* InstalledAppPolicy.swift */,
|
BF66EEAF2501AECA007EE018 /* InstalledAppPolicy.swift */,
|
||||||
D5185B812AE1E71D00646E33 /* Source11To17MigrationPolicy.swift */,
|
|
||||||
BF66EEAE2501AECA007EE018 /* StoreAppPolicy.swift */,
|
BF66EEAE2501AECA007EE018 /* StoreAppPolicy.swift */,
|
||||||
D5F99A1928D12B1400476A16 /* StoreApp10ToStoreApp11Policy.swift */,
|
D5F99A1928D12B1400476A16 /* StoreApp10ToStoreApp11Policy.swift */,
|
||||||
A881E7CA2D6EF5AB00954AD2 /* StoreApp11To17MigrationPolicy.swift */,
|
A85E43732D8AF82100E89240 /* v11-to-v17 */,
|
||||||
|
A85E43752D8AF86400E89240 /* v11-to-v17_1 */,
|
||||||
|
A85E43742D8AF84200E89240 /* v17-to-v17_1 */,
|
||||||
);
|
);
|
||||||
path = Policies;
|
path = Policies;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -1832,7 +1882,9 @@
|
|||||||
BF66EEB02501AECA007EE018 /* Mapping Models */ = {
|
BF66EEB02501AECA007EE018 /* Mapping Models */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
A881E7C62D6EF58C00954AD2 /* AltStore11ToAltStore17.xcmappingmodel */,
|
A8C924292D8E75AD009D9953 /* AltStore17ToAltStore17_1.xcmappingmodel */,
|
||||||
|
A8C924272D8E7463009D9953 /* AltStore11ToAltStore17_1.xcmappingmodel */,
|
||||||
|
A8C924232D8E73B1009D9953 /* AltStore11ToAltStore17.xcmappingmodel */,
|
||||||
D5F99A1728D11DB500476A16 /* AltStore10ToAltStore11.xcmappingmodel */,
|
D5F99A1728D11DB500476A16 /* AltStore10ToAltStore11.xcmappingmodel */,
|
||||||
D5CA0C4D280E249E00469595 /* AltStore9ToAltStore10.xcmappingmodel */,
|
D5CA0C4D280E249E00469595 /* AltStore9ToAltStore10.xcmappingmodel */,
|
||||||
BFBF331A2526762200B7B8C9 /* AltStore8ToAltStore9.xcmappingmodel */,
|
BFBF331A2526762200B7B8C9 /* AltStore8ToAltStore9.xcmappingmodel */,
|
||||||
@@ -3106,6 +3158,7 @@
|
|||||||
BF66EECD2501AECA007EE018 /* StoreAppPolicy.swift in Sources */,
|
BF66EECD2501AECA007EE018 /* StoreAppPolicy.swift in Sources */,
|
||||||
BF66EEE82501AED0007EE018 /* UserDefaults+AltStore.swift in Sources */,
|
BF66EEE82501AED0007EE018 /* UserDefaults+AltStore.swift in Sources */,
|
||||||
BF340E9A250AD39500A192CB /* ViewApp.intentdefinition in Sources */,
|
BF340E9A250AD39500A192CB /* ViewApp.intentdefinition in Sources */,
|
||||||
|
A8C924242D8E73B1009D9953 /* AltStore11ToAltStore17.xcmappingmodel in Sources */,
|
||||||
D552EB062AF453F900A3AB4D /* URL+Normalized.swift in Sources */,
|
D552EB062AF453F900A3AB4D /* URL+Normalized.swift in Sources */,
|
||||||
BFAECC522501B0A400528F27 /* CodableError.swift in Sources */,
|
BFAECC522501B0A400528F27 /* CodableError.swift in Sources */,
|
||||||
A8FD915F2D046F5200322782 /* UserInfoValue.swift in Sources */,
|
A8FD915F2D046F5200322782 /* UserInfoValue.swift in Sources */,
|
||||||
@@ -3113,6 +3166,8 @@
|
|||||||
BF66EE9E2501AEC1007EE018 /* Fetchable.swift in Sources */,
|
BF66EE9E2501AEC1007EE018 /* Fetchable.swift in Sources */,
|
||||||
BF66EEDF2501AECA007EE018 /* PatreonAccount.swift in Sources */,
|
BF66EEDF2501AECA007EE018 /* PatreonAccount.swift in Sources */,
|
||||||
BFAECC532501B0A400528F27 /* ServerProtocol.swift in Sources */,
|
BFAECC532501B0A400528F27 /* ServerProtocol.swift in Sources */,
|
||||||
|
A81BF9E52D84CB0C00768940 /* AppPermission17To17_1MigrationPolicy.swift in Sources */,
|
||||||
|
A81BF9E72D84CB0C00768940 /* Source17To17_1MigrationPolicy.swift in Sources */,
|
||||||
BFAECC572501B0A400528F27 /* ConnectionManager.swift in Sources */,
|
BFAECC572501B0A400528F27 /* ConnectionManager.swift in Sources */,
|
||||||
BF66EE9D2501AEC1007EE018 /* AppProtocol.swift in Sources */,
|
BF66EE9D2501AEC1007EE018 /* AppProtocol.swift in Sources */,
|
||||||
D519AD46292D665B004B12F9 /* Managed.swift in Sources */,
|
D519AD46292D665B004B12F9 /* Managed.swift in Sources */,
|
||||||
@@ -3121,6 +3176,7 @@
|
|||||||
D5CA0C4B280E141900469595 /* ManagedPatron.swift in Sources */,
|
D5CA0C4B280E141900469595 /* ManagedPatron.swift in Sources */,
|
||||||
BF66EE8C2501AEB2007EE018 /* Keychain.swift in Sources */,
|
BF66EE8C2501AEB2007EE018 /* Keychain.swift in Sources */,
|
||||||
BF66EED42501AECA007EE018 /* AltStore5ToAltStore6.xcmappingmodel in Sources */,
|
BF66EED42501AECA007EE018 /* AltStore5ToAltStore6.xcmappingmodel in Sources */,
|
||||||
|
A85E436C2D8AF6CD00E89240 /* Source11To17_1MigrationPolicy.swift in Sources */,
|
||||||
BF66EE972501AEBC007EE018 /* ALTAppPermissions.m in Sources */,
|
BF66EE972501AEBC007EE018 /* ALTAppPermissions.m in Sources */,
|
||||||
BFAECC552501B0A400528F27 /* Connection.swift in Sources */,
|
BFAECC552501B0A400528F27 /* Connection.swift in Sources */,
|
||||||
BF66EEDA2501AECA007EE018 /* RefreshAttempt.swift in Sources */,
|
BF66EEDA2501AECA007EE018 /* RefreshAttempt.swift in Sources */,
|
||||||
@@ -3129,6 +3185,7 @@
|
|||||||
BF66EEA92501AEC5007EE018 /* Tier.swift in Sources */,
|
BF66EEA92501AEC5007EE018 /* Tier.swift in Sources */,
|
||||||
A8228B5B2D6E2C0C00F7CE0E /* (null) in Sources */,
|
A8228B5B2D6E2C0C00F7CE0E /* (null) in Sources */,
|
||||||
BF66EEDB2501AECA007EE018 /* StoreApp.swift in Sources */,
|
BF66EEDB2501AECA007EE018 /* StoreApp.swift in Sources */,
|
||||||
|
A85E436E2D8AF72F00E89240 /* StoreApp11To17_1MigrationPolicy.swift in Sources */,
|
||||||
BF66EEDE2501AECA007EE018 /* AppID.swift in Sources */,
|
BF66EEDE2501AECA007EE018 /* AppID.swift in Sources */,
|
||||||
BF66EECF2501AECA007EE018 /* AltStoreToAltStore2.xcmappingmodel in Sources */,
|
BF66EECF2501AECA007EE018 /* AltStoreToAltStore2.xcmappingmodel in Sources */,
|
||||||
BF66EEA82501AEC5007EE018 /* Patron.swift in Sources */,
|
BF66EEA82501AEC5007EE018 /* Patron.swift in Sources */,
|
||||||
@@ -3155,10 +3212,12 @@
|
|||||||
D5F48B4C29CD0C48002B52A4 /* AsyncManaged.swift in Sources */,
|
D5F48B4C29CD0C48002B52A4 /* AsyncManaged.swift in Sources */,
|
||||||
BFAECC5C2501B0A400528F27 /* CFNotificationName+AltStore.m in Sources */,
|
BFAECC5C2501B0A400528F27 /* CFNotificationName+AltStore.m in Sources */,
|
||||||
BF66EED82501AECA007EE018 /* SecureValueTransformer.swift in Sources */,
|
BF66EED82501AECA007EE018 /* SecureValueTransformer.swift in Sources */,
|
||||||
|
A85E43702D8AF77A00E89240 /* AppPermission11To17_1MigrationPolicy.swift in Sources */,
|
||||||
BF8B17EB250AC40000F8157F /* FileManager+SharedDirectories.swift in Sources */,
|
BF8B17EB250AC40000F8157F /* FileManager+SharedDirectories.swift in Sources */,
|
||||||
BF66EEE02501AECA007EE018 /* Account.swift in Sources */,
|
BF66EEE02501AECA007EE018 /* Account.swift in Sources */,
|
||||||
BF66EED52501AECA007EE018 /* AltStore.xcdatamodeld in Sources */,
|
BF66EED52501AECA007EE018 /* AltStore.xcdatamodeld in Sources */,
|
||||||
BFAECC582501B0A400528F27 /* ALTConstants.m in Sources */,
|
BFAECC582501B0A400528F27 /* ALTConstants.m in Sources */,
|
||||||
|
A81BF9ED2D84CF5900768940 /* ReleaseTrack17To17_1MigrationPolicy.swift in Sources */,
|
||||||
D5F99A1A28D12B1400476A16 /* StoreApp10ToStoreApp11Policy.swift in Sources */,
|
D5F99A1A28D12B1400476A16 /* StoreApp10ToStoreApp11Policy.swift in Sources */,
|
||||||
BFAECC562501B0A400528F27 /* ALTServerError+Conveniences.swift in Sources */,
|
BFAECC562501B0A400528F27 /* ALTServerError+Conveniences.swift in Sources */,
|
||||||
A80D60D32D3DD85100CEF65D /* ReleaseTrack.swift in Sources */,
|
A80D60D32D3DD85100CEF65D /* ReleaseTrack.swift in Sources */,
|
||||||
@@ -3177,12 +3236,14 @@
|
|||||||
D5A645232AF5B5C50047D980 /* PatreonAPI+Responses.swift in Sources */,
|
D5A645232AF5B5C50047D980 /* PatreonAPI+Responses.swift in Sources */,
|
||||||
D5185B822AE1E71D00646E33 /* Source11To17MigrationPolicy.swift in Sources */,
|
D5185B822AE1E71D00646E33 /* Source11To17MigrationPolicy.swift in Sources */,
|
||||||
BF66EECE2501AECA007EE018 /* InstalledAppPolicy.swift in Sources */,
|
BF66EECE2501AECA007EE018 /* InstalledAppPolicy.swift in Sources */,
|
||||||
|
A8C9242A2D8E75AD009D9953 /* AltStore17ToAltStore17_1.xcmappingmodel in Sources */,
|
||||||
BF1FE359251A9FB000C3CE09 /* NSXPCConnection+MachServices.swift in Sources */,
|
BF1FE359251A9FB000C3CE09 /* NSXPCConnection+MachServices.swift in Sources */,
|
||||||
BF66EEA62501AEC5007EE018 /* PatreonAPI.swift in Sources */,
|
BF66EEA62501AEC5007EE018 /* PatreonAPI.swift in Sources */,
|
||||||
A881E7C72D6EF58C00954AD2 /* AltStore11ToAltStore17.xcmappingmodel in Sources */,
|
|
||||||
BF66EED02501AECA007EE018 /* AltStore6ToAltStore7.xcmappingmodel in Sources */,
|
BF66EED02501AECA007EE018 /* AltStore6ToAltStore7.xcmappingmodel in Sources */,
|
||||||
BF66EEDC2501AECA007EE018 /* MergePolicy.swift in Sources */,
|
BF66EEDC2501AECA007EE018 /* MergePolicy.swift in Sources */,
|
||||||
BF66EEE22501AECA007EE018 /* InstalledExtension.swift in Sources */,
|
BF66EEE22501AECA007EE018 /* InstalledExtension.swift in Sources */,
|
||||||
|
A85E43722D8AF7F100E89240 /* ReleaseTrack11To17_1MigrationPolicy.swift in Sources */,
|
||||||
|
A8C924282D8E7463009D9953 /* AltStore11ToAltStore17_1.xcmappingmodel in Sources */,
|
||||||
BF66EED62501AECA007EE018 /* NewsItem.swift in Sources */,
|
BF66EED62501AECA007EE018 /* NewsItem.swift in Sources */,
|
||||||
BF66EEA72501AEC5007EE018 /* Campaign.swift in Sources */,
|
BF66EEA72501AEC5007EE018 /* Campaign.swift in Sources */,
|
||||||
D52C8F032AFC56F000CA0BDD /* StoreCategory.swift in Sources */,
|
D52C8F032AFC56F000CA0BDD /* StoreCategory.swift in Sources */,
|
||||||
@@ -4340,6 +4401,7 @@
|
|||||||
BF66EEB72501AECA007EE018 /* AltStore.xcdatamodeld */ = {
|
BF66EEB72501AECA007EE018 /* AltStore.xcdatamodeld */ = {
|
||||||
isa = XCVersionGroup;
|
isa = XCVersionGroup;
|
||||||
children = (
|
children = (
|
||||||
|
A81BF9E12D84C9E900768940 /* AltStore 17_1.xcdatamodel */,
|
||||||
D51E83802B86926B0092FC61 /* AltStore 17.xcdatamodel */,
|
D51E83802B86926B0092FC61 /* AltStore 17.xcdatamodel */,
|
||||||
D52E988928D002D30032BE6B /* AltStore 11.xcdatamodel */,
|
D52E988928D002D30032BE6B /* AltStore 11.xcdatamodel */,
|
||||||
D5CA0C4C280E242500469595 /* AltStore 10.xcdatamodel */,
|
D5CA0C4C280E242500469595 /* AltStore 10.xcdatamodel */,
|
||||||
@@ -4353,7 +4415,7 @@
|
|||||||
BF66EEBD2501AECA007EE018 /* AltStore 2.xcdatamodel */,
|
BF66EEBD2501AECA007EE018 /* AltStore 2.xcdatamodel */,
|
||||||
BF66EEB92501AECA007EE018 /* AltStore.xcdatamodel */,
|
BF66EEB92501AECA007EE018 /* AltStore.xcdatamodel */,
|
||||||
);
|
);
|
||||||
currentVersion = D51E83802B86926B0092FC61 /* AltStore 17.xcdatamodel */;
|
currentVersion = A81BF9E12D84C9E900768940 /* AltStore 17_1.xcdatamodel */;
|
||||||
path = AltStore.xcdatamodeld;
|
path = AltStore.xcdatamodeld;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
versionGroupType = wrapper.xcdatamodel;
|
versionGroupType = wrapper.xcdatamodel;
|
||||||
|
|||||||
@@ -246,9 +246,13 @@ private extension FetchSourceOperation
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if let previousSourceID = self.$source.identifier
|
|
||||||
|
let incomingSourceID = try! Source.sourceID(from: source.sourceURL)
|
||||||
|
let previousSourceID = self.$source.identifier
|
||||||
|
|
||||||
|
if incomingSourceID != previousSourceID
|
||||||
{
|
{
|
||||||
guard source.identifier == previousSourceID else { throw SourceError.changedID(source.identifier, previousID: previousSourceID, source: source) }
|
throw SourceError.changedID(source.identifier, previousID: self.$source.identifier ?? "nil", source: source)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -514,27 +514,27 @@ extension SourcesViewController: NSFetchedResultsControllerDelegate
|
|||||||
let context = DatabaseManager.shared.persistentContainer.newBackgroundContext()
|
let context = DatabaseManager.shared.persistentContainer.newBackgroundContext()
|
||||||
context.performAndWait {
|
context.performAndWait {
|
||||||
_ = Source.make(name: "OatmealDome's AltStore Source",
|
_ = Source.make(name: "OatmealDome's AltStore Source",
|
||||||
identifier: "me.oatmealdome.altstore",
|
groupID: "me.oatmealdome.altstore",
|
||||||
sourceURL: URL(string: "https://altstore.oatmealdome.me")!,
|
sourceURL: URL(string: "https://altstore.oatmealdome.me")!,
|
||||||
context: context)
|
context: context)
|
||||||
|
|
||||||
_ = Source.make(name: "UTM Repository",
|
_ = Source.make(name: "UTM Repository",
|
||||||
identifier: "com.utmapp.repos.UTM",
|
groupID: "com.utmapp.repos.UTM",
|
||||||
sourceURL: URL(string: "https://alt.getutm.app")!,
|
sourceURL: URL(string: "https://alt.getutm.app")!,
|
||||||
context: context)
|
context: context)
|
||||||
|
|
||||||
_ = Source.make(name: "Flyinghead",
|
_ = Source.make(name: "Flyinghead",
|
||||||
identifier: "com.flyinghead.source",
|
groupID: "com.flyinghead.source",
|
||||||
sourceURL: URL(string: "https://flyinghead.github.io/flycast-builds/altstore.json")!,
|
sourceURL: URL(string: "https://flyinghead.github.io/flycast-builds/altstore.json")!,
|
||||||
context: context)
|
context: context)
|
||||||
|
|
||||||
_ = Source.make(name: "Provenance",
|
_ = Source.make(name: "Provenance",
|
||||||
identifier: "org.provenance-emu.AltStore",
|
groupID: "org.provenance-emu.AltStore",
|
||||||
sourceURL: URL(string: "https://provenance-emu.com/apps.json")!,
|
sourceURL: URL(string: "https://provenance-emu.com/apps.json")!,
|
||||||
context: context)
|
context: context)
|
||||||
|
|
||||||
_ = Source.make(name: "PojavLauncher Repository",
|
_ = Source.make(name: "PojavLauncher Repository",
|
||||||
identifier: "dev.crystall1ne.repos.PojavLauncher",
|
groupID: "dev.crystall1ne.repos.PojavLauncher",
|
||||||
sourceURL: URL(string: "http://alt.crystall1ne.dev")!,
|
sourceURL: URL(string: "http://alt.crystall1ne.dev")!,
|
||||||
context: context)
|
context: context)
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,6 @@
|
|||||||
<plist version="1.0">
|
<plist version="1.0">
|
||||||
<dict>
|
<dict>
|
||||||
<key>_XCCurrentVersionName</key>
|
<key>_XCCurrentVersionName</key>
|
||||||
<string>AltStore 17.xcdatamodel</string>
|
<string>AltStore 17_1.xcdatamodel</string>
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
|
|||||||
@@ -0,0 +1,308 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||||
|
<model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="23605" systemVersion="24D70" minimumToolsVersion="Automatic" sourceLanguage="Swift" userDefinedModelVersionIdentifier="v17.1">
|
||||||
|
<entity name="Account" representedClassName="Account" syncable="YES">
|
||||||
|
<attribute name="appleID" attributeType="String"/>
|
||||||
|
<attribute name="firstName" attributeType="String"/>
|
||||||
|
<attribute name="identifier" attributeType="String"/>
|
||||||
|
<attribute name="isActiveAccount" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
|
||||||
|
<attribute name="lastName" attributeType="String"/>
|
||||||
|
<relationship name="teams" toMany="YES" deletionRule="Cascade" destinationEntity="Team" inverseName="account" inverseEntity="Team"/>
|
||||||
|
<uniquenessConstraints>
|
||||||
|
<uniquenessConstraint>
|
||||||
|
<constraint value="identifier"/>
|
||||||
|
</uniquenessConstraint>
|
||||||
|
</uniquenessConstraints>
|
||||||
|
</entity>
|
||||||
|
<entity name="AppID" representedClassName="AppID" syncable="YES">
|
||||||
|
<attribute name="bundleIdentifier" attributeType="String"/>
|
||||||
|
<attribute name="expirationDate" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
|
||||||
|
<attribute name="features" attributeType="Transformable" valueTransformerName="ALTSecureValueTransformer"/>
|
||||||
|
<attribute name="identifier" attributeType="String"/>
|
||||||
|
<attribute name="name" attributeType="String"/>
|
||||||
|
<relationship name="team" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Team" inverseName="appIDs" inverseEntity="Team"/>
|
||||||
|
<uniquenessConstraints>
|
||||||
|
<uniquenessConstraint>
|
||||||
|
<constraint value="identifier"/>
|
||||||
|
</uniquenessConstraint>
|
||||||
|
</uniquenessConstraints>
|
||||||
|
</entity>
|
||||||
|
<entity name="AppPermission" representedClassName="AppPermission" syncable="YES">
|
||||||
|
<attribute name="appBundleID" optional="YES" attributeType="String"/>
|
||||||
|
<attribute name="permission" optional="YES" attributeType="String"/>
|
||||||
|
<attribute name="sourceID" optional="YES" attributeType="String"/>
|
||||||
|
<attribute name="type" attributeType="String"/>
|
||||||
|
<attribute name="usageDescription" attributeType="String"/>
|
||||||
|
<relationship name="app" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="StoreApp" inverseName="permissions" inverseEntity="StoreApp"/>
|
||||||
|
<uniquenessConstraints>
|
||||||
|
<uniquenessConstraint>
|
||||||
|
<constraint value="appBundleID"/>
|
||||||
|
<constraint value="sourceID"/>
|
||||||
|
<constraint value="type"/>
|
||||||
|
<constraint value="permission"/>
|
||||||
|
</uniquenessConstraint>
|
||||||
|
</uniquenessConstraints>
|
||||||
|
</entity>
|
||||||
|
<entity name="AppScreenshot" representedClassName="AppScreenshot" syncable="YES">
|
||||||
|
<attribute name="appBundleID" attributeType="String"/>
|
||||||
|
<attribute name="deviceType" attributeType="Integer 16" defaultValueString="0" usesScalarValueType="YES"/>
|
||||||
|
<attribute name="height" optional="YES" attributeType="Integer 16" usesScalarValueType="NO"/>
|
||||||
|
<attribute name="imageURL" attributeType="URI"/>
|
||||||
|
<attribute name="sourceID" attributeType="String"/>
|
||||||
|
<attribute name="width" optional="YES" attributeType="Integer 16" usesScalarValueType="NO"/>
|
||||||
|
<relationship name="app" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="StoreApp" inverseName="screenshots" inverseEntity="StoreApp"/>
|
||||||
|
<uniquenessConstraints>
|
||||||
|
<uniquenessConstraint>
|
||||||
|
<constraint value="appBundleID"/>
|
||||||
|
<constraint value="sourceID"/>
|
||||||
|
<constraint value="imageURL"/>
|
||||||
|
</uniquenessConstraint>
|
||||||
|
</uniquenessConstraints>
|
||||||
|
</entity>
|
||||||
|
<entity name="AppVersion" representedClassName="AppVersion" syncable="YES">
|
||||||
|
<attribute name="appBundleID" attributeType="String"/>
|
||||||
|
<attribute name="buildVersion" optional="YES" attributeType="String"/>
|
||||||
|
<attribute name="channel" optional="YES" attributeType="String"/>
|
||||||
|
<attribute name="date" attributeType="Date" usesScalarValueType="NO"/>
|
||||||
|
<attribute name="downloadURL" attributeType="URI"/>
|
||||||
|
<attribute name="localizedDescription" optional="YES" attributeType="String"/>
|
||||||
|
<attribute name="maxOSVersion" optional="YES" attributeType="String"/>
|
||||||
|
<attribute name="minOSVersion" optional="YES" attributeType="String"/>
|
||||||
|
<attribute name="sha256" optional="YES" attributeType="String"/>
|
||||||
|
<attribute name="size" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="YES"/>
|
||||||
|
<attribute name="sourceID" optional="YES" attributeType="String"/>
|
||||||
|
<attribute name="version" attributeType="String"/>
|
||||||
|
<relationship name="app" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="StoreApp" inverseName="versions" inverseEntity="StoreApp"/>
|
||||||
|
<relationship name="latestVersionApp" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="StoreApp" inverseName="latestVersion" inverseEntity="StoreApp"/>
|
||||||
|
<relationship name="releaseTrack" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="ReleaseTrack" inverseName="releases" inverseEntity="ReleaseTrack"/>
|
||||||
|
<uniquenessConstraints>
|
||||||
|
<uniquenessConstraint>
|
||||||
|
<constraint value="appBundleID"/>
|
||||||
|
<constraint value="sourceID"/>
|
||||||
|
<constraint value="version"/>
|
||||||
|
<constraint value="buildVersion"/>
|
||||||
|
</uniquenessConstraint>
|
||||||
|
</uniquenessConstraints>
|
||||||
|
</entity>
|
||||||
|
<entity name="InstalledApp" representedClassName="InstalledApp" syncable="YES">
|
||||||
|
<attribute name="buildVersion" optional="YES" attributeType="String"/>
|
||||||
|
<attribute name="bundleIdentifier" attributeType="String"/>
|
||||||
|
<attribute name="certificateSerialNumber" optional="YES" attributeType="String"/>
|
||||||
|
<attribute name="expirationDate" attributeType="Date" usesScalarValueType="NO"/>
|
||||||
|
<attribute name="hasAlternateIcon" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
|
||||||
|
<attribute name="hasUpdate" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
|
||||||
|
<attribute name="installedDate" attributeType="Date" usesScalarValueType="NO"/>
|
||||||
|
<attribute name="isActive" attributeType="Boolean" defaultValueString="YES" usesScalarValueType="YES"/>
|
||||||
|
<attribute name="isRefreshing" transient="YES" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
|
||||||
|
<attribute name="name" attributeType="String"/>
|
||||||
|
<attribute name="needsResign" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
|
||||||
|
<attribute name="refreshedDate" attributeType="Date" usesScalarValueType="NO"/>
|
||||||
|
<attribute name="resignedBundleIdentifier" attributeType="String"/>
|
||||||
|
<attribute name="storeBuildVersion" optional="YES" attributeType="String"/>
|
||||||
|
<attribute name="version" attributeType="String"/>
|
||||||
|
<relationship name="appExtensions" toMany="YES" deletionRule="Cascade" destinationEntity="InstalledExtension" inverseName="parentApp" inverseEntity="InstalledExtension"/>
|
||||||
|
<relationship name="loggedErrors" toMany="YES" deletionRule="Nullify" destinationEntity="LoggedError" inverseName="installedApp" inverseEntity="LoggedError"/>
|
||||||
|
<relationship name="storeApp" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="StoreApp" inverseName="installedApp" inverseEntity="StoreApp"/>
|
||||||
|
<relationship name="team" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Team" inverseName="installedApps" inverseEntity="Team"/>
|
||||||
|
<uniquenessConstraints>
|
||||||
|
<uniquenessConstraint>
|
||||||
|
<constraint value="bundleIdentifier"/>
|
||||||
|
</uniquenessConstraint>
|
||||||
|
</uniquenessConstraints>
|
||||||
|
</entity>
|
||||||
|
<entity name="InstalledExtension" representedClassName="InstalledExtension" syncable="YES">
|
||||||
|
<attribute name="bundleIdentifier" attributeType="String"/>
|
||||||
|
<attribute name="expirationDate" attributeType="Date" usesScalarValueType="NO"/>
|
||||||
|
<attribute name="installedDate" attributeType="Date" usesScalarValueType="NO"/>
|
||||||
|
<attribute name="name" attributeType="String"/>
|
||||||
|
<attribute name="refreshedDate" attributeType="Date" usesScalarValueType="NO"/>
|
||||||
|
<attribute name="resignedBundleIdentifier" attributeType="String"/>
|
||||||
|
<attribute name="version" attributeType="String"/>
|
||||||
|
<relationship name="parentApp" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="InstalledApp" inverseName="appExtensions" inverseEntity="InstalledApp"/>
|
||||||
|
</entity>
|
||||||
|
<entity name="LoggedError" representedClassName="LoggedError" syncable="YES">
|
||||||
|
<attribute name="appBundleID" attributeType="String"/>
|
||||||
|
<attribute name="appName" attributeType="String"/>
|
||||||
|
<attribute name="code" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="YES"/>
|
||||||
|
<attribute name="date" attributeType="Date" usesScalarValueType="NO"/>
|
||||||
|
<attribute name="domain" attributeType="String"/>
|
||||||
|
<attribute name="operation" optional="YES" attributeType="String"/>
|
||||||
|
<attribute name="userInfo" attributeType="Transformable" valueTransformerName="ALTSecureValueTransformer"/>
|
||||||
|
<relationship name="installedApp" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="InstalledApp" inverseName="loggedErrors" inverseEntity="InstalledApp"/>
|
||||||
|
<relationship name="storeApp" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="StoreApp" inverseName="loggedErrors" inverseEntity="StoreApp"/>
|
||||||
|
</entity>
|
||||||
|
<entity name="NewsItem" representedClassName="NewsItem" syncable="YES">
|
||||||
|
<attribute name="appID" optional="YES" attributeType="String"/>
|
||||||
|
<attribute name="caption" attributeType="String"/>
|
||||||
|
<attribute name="date" attributeType="Date" usesScalarValueType="NO"/>
|
||||||
|
<attribute name="externalURL" optional="YES" attributeType="URI"/>
|
||||||
|
<attribute name="identifier" attributeType="String"/>
|
||||||
|
<attribute name="imageURL" optional="YES" attributeType="URI"/>
|
||||||
|
<attribute name="isSilent" attributeType="Boolean" defaultValueString="YES" usesScalarValueType="YES"/>
|
||||||
|
<attribute name="sortIndex" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="YES"/>
|
||||||
|
<attribute name="sourceIdentifier" optional="YES" attributeType="String"/>
|
||||||
|
<attribute name="tintColor" optional="YES" attributeType="Transformable" valueTransformerName="ALTSecureValueTransformer"/>
|
||||||
|
<attribute name="title" attributeType="String"/>
|
||||||
|
<relationship name="source" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Source" inverseName="newsItems" inverseEntity="Source"/>
|
||||||
|
<relationship name="storeApp" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="StoreApp" inverseName="newsItems" inverseEntity="StoreApp"/>
|
||||||
|
<uniquenessConstraints>
|
||||||
|
<uniquenessConstraint>
|
||||||
|
<constraint value="identifier"/>
|
||||||
|
<constraint value="sourceIdentifier"/>
|
||||||
|
</uniquenessConstraint>
|
||||||
|
</uniquenessConstraints>
|
||||||
|
</entity>
|
||||||
|
<entity name="PatreonAccount" representedClassName="PatreonAccount" syncable="YES">
|
||||||
|
<attribute name="firstName" optional="YES" attributeType="String"/>
|
||||||
|
<attribute name="identifier" attributeType="String"/>
|
||||||
|
<attribute name="isPatron" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
|
||||||
|
<attribute name="name" attributeType="String"/>
|
||||||
|
<relationship name="pledges" toMany="YES" deletionRule="Cascade" destinationEntity="Pledge" inverseName="account" inverseEntity="Pledge"/>
|
||||||
|
<uniquenessConstraints>
|
||||||
|
<uniquenessConstraint>
|
||||||
|
<constraint value="identifier"/>
|
||||||
|
</uniquenessConstraint>
|
||||||
|
</uniquenessConstraints>
|
||||||
|
</entity>
|
||||||
|
<entity name="Patron" representedClassName="ManagedPatron" syncable="YES">
|
||||||
|
<attribute name="identifier" attributeType="String"/>
|
||||||
|
<attribute name="name" attributeType="String"/>
|
||||||
|
<uniquenessConstraints>
|
||||||
|
<uniquenessConstraint>
|
||||||
|
<constraint value="identifier"/>
|
||||||
|
</uniquenessConstraint>
|
||||||
|
</uniquenessConstraints>
|
||||||
|
</entity>
|
||||||
|
<entity name="Pledge" representedClassName="Pledge" syncable="YES">
|
||||||
|
<attribute name="amount" attributeType="Decimal" defaultValueString="0"/>
|
||||||
|
<attribute name="campaignURL" attributeType="URI"/>
|
||||||
|
<attribute name="identifier" attributeType="String"/>
|
||||||
|
<relationship name="account" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="PatreonAccount" inverseName="pledges" inverseEntity="PatreonAccount"/>
|
||||||
|
<relationship name="rewards" optional="YES" toMany="YES" deletionRule="Cascade" destinationEntity="PledgeReward" inverseName="pledge" inverseEntity="PledgeReward"/>
|
||||||
|
<relationship name="tiers" optional="YES" toMany="YES" deletionRule="Cascade" destinationEntity="PledgeTier" inverseName="pledge" inverseEntity="PledgeTier"/>
|
||||||
|
<uniquenessConstraints>
|
||||||
|
<uniquenessConstraint>
|
||||||
|
<constraint value="identifier"/>
|
||||||
|
</uniquenessConstraint>
|
||||||
|
</uniquenessConstraints>
|
||||||
|
</entity>
|
||||||
|
<entity name="PledgeReward" representedClassName="PledgeReward" syncable="YES">
|
||||||
|
<attribute name="identifier" attributeType="String"/>
|
||||||
|
<attribute name="name" attributeType="String"/>
|
||||||
|
<relationship name="pledge" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Pledge" inverseName="rewards" inverseEntity="Pledge"/>
|
||||||
|
<uniquenessConstraints>
|
||||||
|
<uniquenessConstraint>
|
||||||
|
<constraint value="identifier"/>
|
||||||
|
</uniquenessConstraint>
|
||||||
|
</uniquenessConstraints>
|
||||||
|
</entity>
|
||||||
|
<entity name="PledgeTier" representedClassName="PledgeTier" syncable="YES">
|
||||||
|
<attribute name="amount" attributeType="Decimal" defaultValueString="0.0"/>
|
||||||
|
<attribute name="identifier" attributeType="String"/>
|
||||||
|
<attribute name="name" optional="YES" attributeType="String"/>
|
||||||
|
<relationship name="pledge" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Pledge" inverseName="tiers" inverseEntity="Pledge"/>
|
||||||
|
<uniquenessConstraints>
|
||||||
|
<uniquenessConstraint>
|
||||||
|
<constraint value="identifier"/>
|
||||||
|
</uniquenessConstraint>
|
||||||
|
</uniquenessConstraints>
|
||||||
|
</entity>
|
||||||
|
<entity name="RefreshAttempt" representedClassName="RefreshAttempt" syncable="YES">
|
||||||
|
<attribute name="date" attributeType="Date" usesScalarValueType="NO"/>
|
||||||
|
<attribute name="errorDescription" optional="YES" attributeType="String"/>
|
||||||
|
<attribute name="identifier" attributeType="String"/>
|
||||||
|
<attribute name="isSuccess" attributeType="Boolean" defaultValueString="YES" usesScalarValueType="YES"/>
|
||||||
|
<uniquenessConstraints>
|
||||||
|
<uniquenessConstraint>
|
||||||
|
<constraint value="identifier"/>
|
||||||
|
</uniquenessConstraint>
|
||||||
|
</uniquenessConstraints>
|
||||||
|
</entity>
|
||||||
|
<entity name="ReleaseTrack" representedClassName="ReleaseTrack" syncable="YES">
|
||||||
|
<attribute name="appBundleID" optional="YES" attributeType="String"/>
|
||||||
|
<attribute name="sourceID" optional="YES" attributeType="String"/>
|
||||||
|
<attribute name="track" optional="YES" attributeType="String"/>
|
||||||
|
<relationship name="releases" optional="YES" toMany="YES" deletionRule="Cascade" ordered="YES" destinationEntity="AppVersion" inverseName="releaseTrack" inverseEntity="AppVersion"/>
|
||||||
|
<relationship name="storeApp" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="StoreApp" inverseName="releaseTracks" inverseEntity="StoreApp"/>
|
||||||
|
</entity>
|
||||||
|
<entity name="Source" representedClassName="Source" syncable="YES">
|
||||||
|
<attribute name="error" optional="YES" attributeType="Transformable" valueTransformerName="ALTSecureValueTransformer"/>
|
||||||
|
<attribute name="featuredSortID" optional="YES" attributeType="String"/>
|
||||||
|
<attribute name="groupID" optional="YES" attributeType="String"/>
|
||||||
|
<attribute name="hasFeaturedApps" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
|
||||||
|
<attribute name="headerImageURL" optional="YES" attributeType="URI"/>
|
||||||
|
<attribute name="iconURL" optional="YES" attributeType="URI"/>
|
||||||
|
<attribute name="identifier" attributeType="String"/>
|
||||||
|
<attribute name="localizedDescription" optional="YES" attributeType="String"/>
|
||||||
|
<attribute name="name" attributeType="String"/>
|
||||||
|
<attribute name="patreonURL" optional="YES" attributeType="URI"/>
|
||||||
|
<attribute name="sourceURL" attributeType="URI"/>
|
||||||
|
<attribute name="subtitle" optional="YES" attributeType="String"/>
|
||||||
|
<attribute name="tintColor" optional="YES" attributeType="Transformable" valueTransformerName="ALTSecureValueTransformer"/>
|
||||||
|
<attribute name="version" attributeType="Integer 64" defaultValueString="1" usesScalarValueType="YES"/>
|
||||||
|
<attribute name="websiteURL" optional="YES" attributeType="URI"/>
|
||||||
|
<relationship name="apps" toMany="YES" deletionRule="Cascade" ordered="YES" destinationEntity="StoreApp" inverseName="source" inverseEntity="StoreApp"/>
|
||||||
|
<relationship name="featuredApps" optional="YES" toMany="YES" deletionRule="Nullify" ordered="YES" destinationEntity="StoreApp" inverseName="featuringSource" inverseEntity="StoreApp"/>
|
||||||
|
<relationship name="newsItems" toMany="YES" deletionRule="Cascade" ordered="YES" destinationEntity="NewsItem" inverseName="source" inverseEntity="NewsItem"/>
|
||||||
|
<uniquenessConstraints>
|
||||||
|
<uniquenessConstraint>
|
||||||
|
<constraint value="identifier"/>
|
||||||
|
</uniquenessConstraint>
|
||||||
|
</uniquenessConstraints>
|
||||||
|
</entity>
|
||||||
|
<entity name="StoreApp" representedClassName="StoreApp" syncable="YES">
|
||||||
|
<attribute name="bundleIdentifier" attributeType="String"/>
|
||||||
|
<attribute name="category" optional="YES" attributeType="String"/>
|
||||||
|
<attribute name="developerName" attributeType="String"/>
|
||||||
|
<attribute name="downloadURL" optional="YES" attributeType="URI"/>
|
||||||
|
<attribute name="featuredSortID" optional="YES" attributeType="String"/>
|
||||||
|
<attribute name="iconURL" attributeType="URI"/>
|
||||||
|
<attribute name="isHiddenWithoutPledge" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
|
||||||
|
<attribute name="isPledged" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
|
||||||
|
<attribute name="isPledgeRequired" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
|
||||||
|
<attribute name="localizedDescription" attributeType="String"/>
|
||||||
|
<attribute name="marketplaceID" optional="YES" attributeType="String"/>
|
||||||
|
<attribute name="name" attributeType="String"/>
|
||||||
|
<attribute name="pledgeAmount" optional="YES" attributeType="Decimal"/>
|
||||||
|
<attribute name="pledgeCurrency" optional="YES" attributeType="String"/>
|
||||||
|
<attribute name="prefersCustomPledge" optional="YES" attributeType="Boolean" usesScalarValueType="YES"/>
|
||||||
|
<attribute name="screenshotURLs" attributeType="Transformable" valueTransformerName="ALTSecureValueTransformer"/>
|
||||||
|
<attribute name="size" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="YES"/>
|
||||||
|
<attribute name="sortIndex" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="YES"/>
|
||||||
|
<attribute name="sourceIdentifier" optional="YES" attributeType="String"/>
|
||||||
|
<attribute name="subtitle" optional="YES" attributeType="String"/>
|
||||||
|
<attribute name="tintColor" optional="YES" attributeType="Transformable" valueTransformerName="ALTSecureValueTransformer"/>
|
||||||
|
<attribute name="version" optional="YES" attributeType="String"/>
|
||||||
|
<attribute name="versionDate" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
|
||||||
|
<attribute name="versionDescription" optional="YES" attributeType="String"/>
|
||||||
|
<relationship name="featuringSource" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Source" inverseName="featuredApps" inverseEntity="Source"/>
|
||||||
|
<relationship name="installedApp" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="InstalledApp" inverseName="storeApp" inverseEntity="InstalledApp"/>
|
||||||
|
<relationship name="latestVersion" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="AppVersion" inverseName="latestVersionApp" inverseEntity="AppVersion"/>
|
||||||
|
<relationship name="loggedErrors" toMany="YES" deletionRule="Nullify" destinationEntity="LoggedError" inverseName="storeApp" inverseEntity="LoggedError"/>
|
||||||
|
<relationship name="newsItems" toMany="YES" deletionRule="Nullify" destinationEntity="NewsItem" inverseName="storeApp" inverseEntity="NewsItem"/>
|
||||||
|
<relationship name="permissions" toMany="YES" deletionRule="Cascade" destinationEntity="AppPermission" inverseName="app" inverseEntity="AppPermission"/>
|
||||||
|
<relationship name="releaseTracks" optional="YES" toMany="YES" deletionRule="Cascade" ordered="YES" destinationEntity="ReleaseTrack" inverseName="storeApp" inverseEntity="ReleaseTrack"/>
|
||||||
|
<relationship name="screenshots" toMany="YES" deletionRule="Cascade" ordered="YES" destinationEntity="AppScreenshot" inverseName="app" inverseEntity="AppScreenshot"/>
|
||||||
|
<relationship name="source" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Source" inverseName="apps" inverseEntity="Source"/>
|
||||||
|
<relationship name="versions" toMany="YES" deletionRule="Cascade" ordered="YES" destinationEntity="AppVersion" inverseName="app" inverseEntity="AppVersion"/>
|
||||||
|
<uniquenessConstraints>
|
||||||
|
<uniquenessConstraint>
|
||||||
|
<constraint value="sourceIdentifier"/>
|
||||||
|
<constraint value="bundleIdentifier"/>
|
||||||
|
</uniquenessConstraint>
|
||||||
|
</uniquenessConstraints>
|
||||||
|
</entity>
|
||||||
|
<entity name="Team" representedClassName="Team" syncable="YES">
|
||||||
|
<attribute name="identifier" attributeType="String"/>
|
||||||
|
<attribute name="isActiveTeam" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
|
||||||
|
<attribute name="name" attributeType="String"/>
|
||||||
|
<attribute name="type" attributeType="Integer 16" defaultValueString="0" usesScalarValueType="YES"/>
|
||||||
|
<relationship name="account" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Account" inverseName="teams" inverseEntity="Account"/>
|
||||||
|
<relationship name="appIDs" toMany="YES" deletionRule="Cascade" destinationEntity="AppID" inverseName="team" inverseEntity="AppID"/>
|
||||||
|
<relationship name="installedApps" toMany="YES" deletionRule="Nullify" destinationEntity="InstalledApp" inverseName="team" inverseEntity="InstalledApp"/>
|
||||||
|
<uniquenessConstraints>
|
||||||
|
<uniquenessConstraint>
|
||||||
|
<constraint value="identifier"/>
|
||||||
|
</uniquenessConstraint>
|
||||||
|
</uniquenessConstraints>
|
||||||
|
</entity>
|
||||||
|
</model>
|
||||||
@@ -33,7 +33,7 @@ public class AppPermission: BaseEntity
|
|||||||
default: return UnknownAppPermission(rawValue: self._permission)
|
default: return UnknownAppPermission(rawValue: self._permission)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@NSManaged @objc(permission) private var _permission: String
|
@NSManaged @objc(permission) private(set) public var _permission: String
|
||||||
|
|
||||||
// Set by StoreApp.
|
// Set by StoreApp.
|
||||||
@NSManaged public var appBundleID: String
|
@NSManaged public var appBundleID: String
|
||||||
|
|||||||
@@ -213,9 +213,10 @@ extension MergePolicy{
|
|||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
break
|
||||||
// Unknown context-level conflict.
|
// Unknown context-level conflict.
|
||||||
// assertionFailure("MergePolicy is only intended to work with database-level conflicts.")
|
// assertionFailure("MergePolicy is only intended to work with database-level conflicts.")
|
||||||
assertionFailure("Context Conflict Detected: is there ambigious data in your incoming sources?\nConflict:\(conflict)")
|
// assertionFailure("Context Conflict Detected: is there ambigious data in your incoming sources?\nConflict:\(conflict)")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,5 +1,5 @@
|
|||||||
//
|
//
|
||||||
// SourceMigrationPolicy.swift
|
// Source11To17MigrationPolicy.swift
|
||||||
// AltStoreCore
|
// AltStoreCore
|
||||||
//
|
//
|
||||||
// Created by Riley Testut on 10/19/23.
|
// Created by Riley Testut on 10/19/23.
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
//
|
//
|
||||||
// StoreAppMigration11To17Policy.swift
|
// StoreApp11To17MigrationPolicy.swift
|
||||||
// AltStore
|
// AltStore
|
||||||
//
|
//
|
||||||
// Created by Magesh K on 25/02/25.
|
// Created by Magesh K on 25/02/25.
|
||||||
@@ -108,7 +108,7 @@ class StoreApp11To17MigrationPolicy: NSEntityMigrationPolicy {
|
|||||||
|
|
||||||
// Create a new ReleaseTrack entity
|
// Create a new ReleaseTrack entity
|
||||||
let context = dInstance.managedObjectContext!
|
let context = dInstance.managedObjectContext!
|
||||||
let releaseTrack = NSEntityDescription.insertNewObject(forEntityName: ReleaseTrack.entity().name!, into: context)
|
let releaseTrack = NSEntityDescription.insertNewObject(forEntityName: ReleaseTrack.entity().name! ?? ReleaseTrack.description(), into: context)
|
||||||
releaseTrack.setValue(defaultChannel, forKey: #keyPath(ReleaseTrack._track))
|
releaseTrack.setValue(defaultChannel, forKey: #keyPath(ReleaseTrack._track))
|
||||||
|
|
||||||
// Connect the releaseTrack to the destination StoreApp
|
// Connect the releaseTrack to the destination StoreApp
|
||||||
@@ -116,7 +116,7 @@ class StoreApp11To17MigrationPolicy: NSEntityMigrationPolicy {
|
|||||||
|
|
||||||
|
|
||||||
// Find the mapping name for AppVersion (make sure this exactly matches your mapping model)
|
// Find the mapping name for AppVersion (make sure this exactly matches your mapping model)
|
||||||
let appVersionMappingName = findEntityMappingName(for: AppVersion.entity().name!, in: manager)
|
let appVersionMappingName = findEntityMappingName(for: AppVersion.entity().name ?? AppVersion.description(), in: manager)
|
||||||
|
|
||||||
// Create a mutable ordered set for the destination AppVersion objects
|
// Create a mutable ordered set for the destination AppVersion objects
|
||||||
let destinationVersionsSet = NSMutableOrderedSet()
|
let destinationVersionsSet = NSMutableOrderedSet()
|
||||||
@@ -145,5 +145,5 @@ class StoreApp11To17MigrationPolicy: NSEntityMigrationPolicy {
|
|||||||
// dInstance.setValue(NSOrderedSet(), forKey: #keyPath(StoreApp._versions))
|
// dInstance.setValue(NSOrderedSet(), forKey: #keyPath(StoreApp._versions))
|
||||||
dInstance.setValue(nil, forKey: #keyPath(StoreApp._versions))
|
dInstance.setValue(nil, forKey: #keyPath(StoreApp._versions))
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
//
|
||||||
|
// AppPermission11To17_1MigrationPolicy.swift
|
||||||
|
// AltStore
|
||||||
|
//
|
||||||
|
// Created by Magesh K on 15/03/25.
|
||||||
|
// Copyright © 2025 SideStore. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import CoreData
|
||||||
|
|
||||||
|
@objc(AppPermission11To17_1MigrationPolicy)
|
||||||
|
class AppPermission11To17_1MigrationPolicy: AppPermission17To17_1MigrationPolicy
|
||||||
|
{
|
||||||
|
override func createDestinationInstances(forSource sInstance: NSManagedObject, in mapping: NSEntityMapping, manager: NSMigrationManager) throws {
|
||||||
|
try super.createDestinationInstances(forSource: sInstance, in: mapping, manager: manager)
|
||||||
|
}
|
||||||
|
|
||||||
|
override func createRelationships(forDestination dInstance: NSManagedObject, in mapping: NSEntityMapping, manager: NSMigrationManager) throws {
|
||||||
|
try super.createRelationships(forDestination: dInstance, in: mapping, manager: manager)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
//
|
||||||
|
// ReleaseTrack11To17_1MigrationPolicy.swift
|
||||||
|
// AltStore
|
||||||
|
//
|
||||||
|
// Created by Magesh K on 15/03/25.
|
||||||
|
// Copyright © 2025 SideStore. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import CoreData
|
||||||
|
|
||||||
|
@objc(ReleaseTrack11To17_1MigrationPolicy)
|
||||||
|
class ReleaseTrack11To17_1MigrationPolicy: ReleaseTrack17To17_1MigrationPolicy
|
||||||
|
{
|
||||||
|
override func createDestinationInstances(forSource sInstance: NSManagedObject, in mapping: NSEntityMapping, manager: NSMigrationManager) throws {
|
||||||
|
try super.createDestinationInstances(forSource: sInstance, in: mapping, manager: manager)
|
||||||
|
}
|
||||||
|
|
||||||
|
override func createRelationships(forDestination dInstance: NSManagedObject, in mapping: NSEntityMapping, manager: NSMigrationManager) throws {
|
||||||
|
try super.createRelationships(forDestination: dInstance, in: mapping, manager: manager)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
//
|
||||||
|
// Source17To17_1MigrationPolicy.swift
|
||||||
|
// AltStore
|
||||||
|
//
|
||||||
|
// Created by Magesh K on 15/03/25.
|
||||||
|
// Copyright © 2025 SideStore. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import CoreData
|
||||||
|
|
||||||
|
@objc(Source11To17_1MigrationPolicy)
|
||||||
|
class Source11To17_1MigrationPolicy: Source17To17_1MigrationPolicy
|
||||||
|
{
|
||||||
|
override func createDestinationInstances(forSource sInstance: NSManagedObject, in mapping: NSEntityMapping, manager: NSMigrationManager) throws {
|
||||||
|
try super.createDestinationInstances(forSource: sInstance, in: mapping, manager: manager)
|
||||||
|
}
|
||||||
|
|
||||||
|
override func createRelationships(forDestination dInstance: NSManagedObject, in mapping: NSEntityMapping, manager: NSMigrationManager) throws {
|
||||||
|
try super.createRelationships(forDestination: dInstance, in: mapping, manager: manager)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
//
|
||||||
|
// StoreApp11To17_1MigrationPolicy.swift
|
||||||
|
// AltStore
|
||||||
|
//
|
||||||
|
// Created by Magesh K on 15/03/25.
|
||||||
|
// Copyright © 2025 SideStore. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import CoreData
|
||||||
|
|
||||||
|
@objc(StoreApp11To17_1MigrationPolicy)
|
||||||
|
class StoreApp11To17_1MigrationPolicy: StoreApp11To17MigrationPolicy
|
||||||
|
{
|
||||||
|
override func createDestinationInstances(forSource sInstance: NSManagedObject, in mapping: NSEntityMapping, manager: NSMigrationManager) throws {
|
||||||
|
try super.createDestinationInstances(forSource: sInstance, in: mapping, manager: manager)
|
||||||
|
}
|
||||||
|
|
||||||
|
override func createRelationships(forDestination dInstance: NSManagedObject, in mapping: NSEntityMapping, manager: NSMigrationManager) throws {
|
||||||
|
try super.createRelationships(forDestination: dInstance, in: mapping, manager: manager)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,101 @@
|
|||||||
|
//
|
||||||
|
// AppPermission17To17_1MigrationPolicy.swift
|
||||||
|
// AltStore
|
||||||
|
//
|
||||||
|
// Created by Magesh K on 15/03/25.
|
||||||
|
// Copyright © 2025 SideStore. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import CoreData
|
||||||
|
|
||||||
|
@objc(AppPermission17To17_1MigrationPolicy)
|
||||||
|
class AppPermission17To17_1MigrationPolicy: NSEntityMigrationPolicy {
|
||||||
|
|
||||||
|
override func createDestinationInstances(forSource sInstance: NSManagedObject, in mapping: NSEntityMapping, manager: NSMigrationManager) throws {
|
||||||
|
// Let the default implementation create the basic destination AppPermission
|
||||||
|
try super.createDestinationInstances(forSource: sInstance, in: mapping, manager: manager)
|
||||||
|
|
||||||
|
// Get the destination AppPermission instance that was created
|
||||||
|
guard let destinationPermission = manager.destinationInstances(forEntityMappingName: mapping.name, sourceInstances: [sInstance]).first else {
|
||||||
|
print("Failed to locate destination AppPermission instance")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Extract the type value from source
|
||||||
|
if let type = sInstance.value(forKey: #keyPath(AppPermission.type)) as? String {
|
||||||
|
// In the new model, "permission" is the actual permission string, which needs to be derived from the old "type"
|
||||||
|
let permission = self.derivePermissionFromType(type)
|
||||||
|
destinationPermission.setValue(permission, forKey: #keyPath(AppPermission._permission))
|
||||||
|
}
|
||||||
|
|
||||||
|
// set initial values copied from source as-is
|
||||||
|
// (will be updated by StoreApp and Source migration policy in its createRelationship() method)
|
||||||
|
if let storeApp = sInstance.value(forKey: #keyPath(AppPermission.app)) as? NSManagedObject{
|
||||||
|
if let appBundle = storeApp.value(forKey: #keyPath(StoreApp.bundleIdentifier)) as? String{
|
||||||
|
destinationPermission.setValue(appBundle, forKey: #keyPath(AppPermission.appBundleID))
|
||||||
|
}
|
||||||
|
|
||||||
|
if let sourceID = storeApp.value(forKey: #keyPath(StoreApp.sourceIdentifier)) as? String {
|
||||||
|
destinationPermission.setValue(sourceID, forKey: #keyPath(AppPermission.sourceID))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
override func createRelationships(
|
||||||
|
forDestination dInstance: NSManagedObject,
|
||||||
|
in mapping: NSEntityMapping,
|
||||||
|
manager: NSMigrationManager
|
||||||
|
) throws {
|
||||||
|
// Retrieve the corresponding source instance for the destination StoreApp
|
||||||
|
let sourceInstances = manager.sourceInstances(forEntityMappingName: mapping.name, destinationInstances: [dInstance])
|
||||||
|
guard let sInstance = sourceInstances.first else {
|
||||||
|
print("No source instance found for destination: \(dInstance)")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Retrieve the source storeApp from the source appPermission
|
||||||
|
guard let storeApp = sInstance.value(forKey: #keyPath(AppPermission.app)) as? NSManagedObject else {
|
||||||
|
print("Source \(AppPermission.description()) has no storeApp")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// set initial values copied from source as-is to satisfy unique constraints
|
||||||
|
// (will be updated by StoreApp and Source migration policy in its createRelationship() method)
|
||||||
|
if let appBundle = storeApp.value(forKey: #keyPath(StoreApp.bundleIdentifier)) as? String{
|
||||||
|
dInstance.setValue(appBundle, forKey: #keyPath(AppPermission.appBundleID))
|
||||||
|
}
|
||||||
|
|
||||||
|
if let sourceID = storeApp.value(forKey: #keyPath(StoreApp.sourceIdentifier)) as? String {
|
||||||
|
dInstance.setValue(sourceID, forKey: #keyPath(AppPermission.sourceID))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Helper method to derive permission string from type
|
||||||
|
private func derivePermissionFromType(_ type: String) -> String {
|
||||||
|
// Based on the code in the documents, we need to map the ALTAppPermissionType to permission strings
|
||||||
|
switch type {
|
||||||
|
case "photos": return "NSPhotosUsageDescription"
|
||||||
|
case "camera": return "NSCameraUsageDescription"
|
||||||
|
case "location": return "NSLocationUsageDescription"
|
||||||
|
case "contacts": return "NSContactsUsageDescription"
|
||||||
|
case "reminders": return "NSRemindersUsageDescription"
|
||||||
|
case "music": return "NSAppleMusicUsageDescription"
|
||||||
|
case "microphone": return "NSMicrophoneUsageDescription"
|
||||||
|
case "speech-recognition": return "NSSpeechRecognitionUsageDescription"
|
||||||
|
case "background-audio": return "NSBackgroundAudioUsageDescription"
|
||||||
|
case "background-fetch": return "NSBackgroundFetchUsageDescription"
|
||||||
|
case "bluetooth": return "NSBluetoothUsageDescription"
|
||||||
|
case "network": return "NSNetworkUsageDescription"
|
||||||
|
case "calendars": return "NSCalendarsUsageDescription"
|
||||||
|
case "touchID": return "NSTouchIDUsageDescription"
|
||||||
|
case "faceID": return "NSFaceIDUsageDescription"
|
||||||
|
case "siri": return "NSSiriUsageDescription"
|
||||||
|
case "motion": return "NSMotionUsageDescription"
|
||||||
|
case "entitlement": return type // For entitlements, we might keep the raw value
|
||||||
|
case "privacy": return type // For privacy permissions, we might keep the raw value
|
||||||
|
default: return type // Default fallback
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
//
|
||||||
|
// ReleaseTrack17To17_1MigrationPolicy.swift
|
||||||
|
// AltStore
|
||||||
|
//
|
||||||
|
// Created by Magesh K on 15/03/25.
|
||||||
|
// Copyright © 2025 SideStore. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import CoreData
|
||||||
|
|
||||||
|
@objc(ReleaseTrack17To17_1MigrationPolicy)
|
||||||
|
class ReleaseTrack17To17_1MigrationPolicy: NSEntityMigrationPolicy {
|
||||||
|
|
||||||
|
override func createDestinationInstances(forSource sInstance: NSManagedObject, in mapping: NSEntityMapping, manager: NSMigrationManager) throws {
|
||||||
|
// Let the default implementation create the basic destination AppPermission
|
||||||
|
try super.createDestinationInstances(forSource: sInstance, in: mapping, manager: manager)
|
||||||
|
|
||||||
|
// Get the destination AppPermission instance that was created
|
||||||
|
guard let destinationPermission = manager.destinationInstances(forEntityMappingName: mapping.name, sourceInstances: [sInstance]).first else {
|
||||||
|
print("Failed to locate destination ReleaseTrack instance")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if let track = sInstance.value(forKey: #keyPath(ReleaseTrack._track)) as? String {
|
||||||
|
destinationPermission.setValue(track, forKey: #keyPath(ReleaseTrack._track))
|
||||||
|
}
|
||||||
|
|
||||||
|
// set initial values migrated from source as-is
|
||||||
|
if let storeApp = sInstance.value(forKey: #keyPath(ReleaseTrack.storeApp)) as? NSManagedObject{
|
||||||
|
if let appBundle = storeApp.value(forKey: #keyPath(StoreApp.bundleIdentifier)) as? String{
|
||||||
|
destinationPermission.setValue(appBundle, forKey: #keyPath(ReleaseTrack._appBundleID))
|
||||||
|
}
|
||||||
|
|
||||||
|
if let sourceID = storeApp.value(forKey: #keyPath(StoreApp.sourceIdentifier)) as? String {
|
||||||
|
destinationPermission.setValue(sourceID, forKey: #keyPath(ReleaseTrack._sourceID))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
override func createRelationships(
|
||||||
|
forDestination dInstance: NSManagedObject,
|
||||||
|
in mapping: NSEntityMapping,
|
||||||
|
manager: NSMigrationManager
|
||||||
|
) throws {
|
||||||
|
// Retrieve the corresponding source instance for the destination StoreApp
|
||||||
|
let sourceInstances = manager.sourceInstances(forEntityMappingName: mapping.name, destinationInstances: [dInstance])
|
||||||
|
guard let sInstance = sourceInstances.first else {
|
||||||
|
print("No source instance found for destination: \(dInstance)")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Retrieve the source storeApp from the source ReleaseTrack
|
||||||
|
guard let storeApp = sInstance.value(forKey: #keyPath(ReleaseTrack.storeApp)) as? NSManagedObject else {
|
||||||
|
print("Source \(ReleaseTrack.description()) has no storeApp")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// set initial values copied from source as-is to satisfy unique constraints
|
||||||
|
// (will be updated by StoreApp and Source migration policy in its createRelationship() method)
|
||||||
|
if let appBundle = storeApp.value(forKey: #keyPath(StoreApp.bundleIdentifier)) as? String{
|
||||||
|
dInstance.setValue(appBundle, forKey: #keyPath(ReleaseTrack._appBundleID))
|
||||||
|
}
|
||||||
|
|
||||||
|
if let sourceID = storeApp.value(forKey: #keyPath(StoreApp.sourceIdentifier)) as? String {
|
||||||
|
dInstance.setValue(sourceID, forKey: #keyPath(ReleaseTrack._sourceID))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,185 @@
|
|||||||
|
//
|
||||||
|
// Source17To17_1MigrationPolicy.swift
|
||||||
|
// AltStore
|
||||||
|
//
|
||||||
|
// Created by Magesh K on 15/03/25.
|
||||||
|
// Copyright © 2025 SideStore. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import CoreData
|
||||||
|
|
||||||
|
fileprivate extension NSManagedObject
|
||||||
|
{
|
||||||
|
var sourceSourceURL: URL? {
|
||||||
|
let sourceURL = self.value(forKey: #keyPath(Source.sourceURL)) as? URL
|
||||||
|
return sourceURL
|
||||||
|
}
|
||||||
|
|
||||||
|
var sourceSourceId: String? {
|
||||||
|
let sourceId = self.value(forKey: #keyPath(Source.identifier)) as? String
|
||||||
|
return sourceId
|
||||||
|
}
|
||||||
|
|
||||||
|
var sourceApps: NSOrderedSet? {
|
||||||
|
let apps = self.value(forKey: #keyPath(Source._apps)) as? NSOrderedSet
|
||||||
|
return apps
|
||||||
|
}
|
||||||
|
|
||||||
|
var sourceNewsItems: NSOrderedSet? {
|
||||||
|
let newsItems = self.value(forKey: #keyPath(Source._newsItems)) as? NSOrderedSet
|
||||||
|
return newsItems
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fileprivate extension NSManagedObject
|
||||||
|
{
|
||||||
|
func setSourceId(_ sourceID: String)
|
||||||
|
{
|
||||||
|
self.setValue(sourceID, forKey: #keyPath(Source.identifier))
|
||||||
|
}
|
||||||
|
|
||||||
|
func setGroupId(_ groupID: String)
|
||||||
|
{
|
||||||
|
self.setValue(groupID, forKey: #keyPath(Source.groupID))
|
||||||
|
}
|
||||||
|
|
||||||
|
func setSourceSourceUrl(_ sourceURL: URL)
|
||||||
|
{
|
||||||
|
self.setValue(sourceURL, forKey: #keyPath(Source.sourceURL))
|
||||||
|
}
|
||||||
|
|
||||||
|
func setSourceSourceID(_ sourceID: String)
|
||||||
|
{
|
||||||
|
self.setValue(sourceID, forKey: #keyPath(Source.identifier))
|
||||||
|
}
|
||||||
|
|
||||||
|
func setStoreAppSourceID(_ sourceID: String)
|
||||||
|
{
|
||||||
|
self.setValue(sourceID, forKey: #keyPath(StoreApp.sourceIdentifier))
|
||||||
|
}
|
||||||
|
|
||||||
|
func setNewsItemSourceID(_ sourceID: String)
|
||||||
|
{
|
||||||
|
self.setValue(sourceID, forKey: #keyPath(NewsItem.sourceIdentifier))
|
||||||
|
}
|
||||||
|
|
||||||
|
func setAppVersionSourceID(_ sourceID: String)
|
||||||
|
{
|
||||||
|
self.setValue(sourceID, forKey: #keyPath(AppVersion.sourceID))
|
||||||
|
}
|
||||||
|
|
||||||
|
func setAppPermissionSourceID(_ sourceID: String)
|
||||||
|
{
|
||||||
|
self.setValue(sourceID, forKey: #keyPath(AppPermission.sourceID))
|
||||||
|
}
|
||||||
|
|
||||||
|
func setAppScreenshotSourceID(_ sourceID: String)
|
||||||
|
{
|
||||||
|
self.setValue(sourceID, forKey: #keyPath(AppScreenshot.sourceID))
|
||||||
|
}
|
||||||
|
|
||||||
|
func setReleaseTracksSourceID(_ sourceID: String)
|
||||||
|
{
|
||||||
|
self.setValue(sourceID, forKey: #keyPath(ReleaseTrack._sourceID))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fileprivate extension NSManagedObject
|
||||||
|
{
|
||||||
|
var storeAppVersions: NSOrderedSet? {
|
||||||
|
let versions = self.value(forKey: #keyPath(StoreApp._versions)) as? NSOrderedSet
|
||||||
|
return versions
|
||||||
|
}
|
||||||
|
|
||||||
|
var storeAppPermissions: NSSet? {
|
||||||
|
let permissions = self.value(forKey: #keyPath(StoreApp._permissions)) as? NSSet
|
||||||
|
return permissions
|
||||||
|
}
|
||||||
|
|
||||||
|
var storeAppScreenshots: NSOrderedSet? {
|
||||||
|
let screenshots = self.value(forKey: #keyPath(StoreApp._screenshots)) as? NSOrderedSet
|
||||||
|
return screenshots
|
||||||
|
}
|
||||||
|
|
||||||
|
var storeAppReleaseTracks: NSOrderedSet? {
|
||||||
|
let tracks = self.value(forKey: #keyPath(StoreApp._releaseTracks)) as? NSOrderedSet
|
||||||
|
return tracks
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@objc(Source17To17_1MigrationPolicy)
|
||||||
|
class Source17To17_1MigrationPolicy: NSEntityMigrationPolicy
|
||||||
|
{
|
||||||
|
override func createDestinationInstances(forSource sInstance: NSManagedObject, in mapping: NSEntityMapping, manager: NSMigrationManager) throws {
|
||||||
|
// Let the default implementation create the basic destination AppPermission
|
||||||
|
try super.createDestinationInstances(forSource: sInstance, in: mapping, manager: manager)
|
||||||
|
|
||||||
|
// Get the destination Source instance that was created
|
||||||
|
guard let dInstance = manager.destinationInstances(forEntityMappingName: mapping.name, sourceInstances: [sInstance]).first else {
|
||||||
|
print("Failed to locate destination Source instance")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// update new fields with initial values
|
||||||
|
if let sourceID = sInstance.value(forKey: #keyPath(Source.identifier)) as? String {
|
||||||
|
dInstance.setValue(sourceID, forKey: #keyPath(Source.groupID))
|
||||||
|
}
|
||||||
|
|
||||||
|
guard var sourceURL = dInstance.sourceSourceURL else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// sidestore official source has been moved to sidestore.io/apps-v2.json
|
||||||
|
// if we don't switch, users will end up with 2 offical sources
|
||||||
|
let normalizedSourceURL = try? sourceURL.normalized()
|
||||||
|
if normalizedSourceURL == "apps.sidestore.io" // if using old source url (<0.5.9)
|
||||||
|
{
|
||||||
|
sourceURL = Source.altStoreSourceURL // switch to latest
|
||||||
|
dInstance.setSourceSourceUrl(sourceURL) // and use it for current
|
||||||
|
}
|
||||||
|
|
||||||
|
var sourceID = try Source.sourceID(from: sourceURL)
|
||||||
|
dInstance.setSourceId(sourceID)
|
||||||
|
|
||||||
|
// for older versions migrating to current (their sourceID is their groupID)
|
||||||
|
dInstance.setGroupId(sourceID)
|
||||||
|
|
||||||
|
if sourceID == "apps.sidestore.io" {
|
||||||
|
sourceID = Source.altStoreIdentifier
|
||||||
|
dInstance.setSourceId(sourceID)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override func createRelationships(forDestination dInstance: NSManagedObject, in mapping: NSEntityMapping, manager: NSMigrationManager) throws
|
||||||
|
{
|
||||||
|
try super.createRelationships(forDestination: dInstance, in: mapping, manager: manager)
|
||||||
|
|
||||||
|
guard let sourceID = dInstance.sourceSourceId else { return }
|
||||||
|
|
||||||
|
for case let app as NSManagedObject in dInstance.sourceApps ?? []
|
||||||
|
{
|
||||||
|
app.setStoreAppSourceID(sourceID)
|
||||||
|
|
||||||
|
for case let version as NSManagedObject in app.storeAppVersions ?? []
|
||||||
|
{
|
||||||
|
version.setAppVersionSourceID(sourceID)
|
||||||
|
}
|
||||||
|
|
||||||
|
for case let permission as NSManagedObject in app.storeAppPermissions ?? []
|
||||||
|
{
|
||||||
|
permission.setAppPermissionSourceID(sourceID)
|
||||||
|
}
|
||||||
|
|
||||||
|
for case let screenshot as NSManagedObject in app.storeAppScreenshots ?? []
|
||||||
|
{
|
||||||
|
screenshot.setAppScreenshotSourceID(sourceID)
|
||||||
|
}
|
||||||
|
|
||||||
|
for case let tracks as NSManagedObject in app.storeAppReleaseTracks ?? []
|
||||||
|
{
|
||||||
|
tracks.setReleaseTracksSourceID(sourceID)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -14,7 +14,9 @@ public class ReleaseTrack: BaseEntity, Decodable
|
|||||||
{
|
{
|
||||||
// attributes
|
// attributes
|
||||||
@NSManaged @objc(track) public private(set) var _track: String?
|
@NSManaged @objc(track) public private(set) var _track: String?
|
||||||
|
@NSManaged @objc(appBundleID) public private(set) var _appBundleID: String?
|
||||||
|
@NSManaged @objc(sourceID) public private(set) var _sourceID: String?
|
||||||
|
|
||||||
// RelationShips
|
// RelationShips
|
||||||
@NSManaged @objc(releases) public private(set) var _releases: NSOrderedSet?
|
@NSManaged @objc(releases) public private(set) var _releases: NSOrderedSet?
|
||||||
@NSManaged public private(set) var storeApp: StoreApp?
|
@NSManaged public private(set) var storeApp: StoreApp?
|
||||||
@@ -109,6 +111,10 @@ public extension ReleaseTrack{
|
|||||||
if key == NSExpression(forKeyPath: #keyPath(ReleaseTrack.storeApp)).keyPath
|
if key == NSExpression(forKeyPath: #keyPath(ReleaseTrack.storeApp)).keyPath
|
||||||
{
|
{
|
||||||
updateVersions(for: storeApp)
|
updateVersions(for: storeApp)
|
||||||
|
|
||||||
|
// update unique constraint attribs
|
||||||
|
self._appBundleID = storeApp?.bundleIdentifier
|
||||||
|
self._sourceID = storeApp?.sourceIdentifier
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,7 +11,11 @@ import UIKit
|
|||||||
|
|
||||||
public extension Source
|
public extension Source
|
||||||
{
|
{
|
||||||
static let altStoreIdentifier = try! Source.sourceID(from: Source.altStoreSourceURL)
|
#if ALPHA
|
||||||
|
static let altStoreGroupIdentifier = Bundle.Info.appbundleIdentifier
|
||||||
|
#else
|
||||||
|
static let altStoreGroupIdentifier = Bundle.Info.appbundleIdentifier
|
||||||
|
#endif
|
||||||
|
|
||||||
#if STAGING
|
#if STAGING
|
||||||
|
|
||||||
@@ -24,13 +28,15 @@ public extension Source
|
|||||||
#else
|
#else
|
||||||
|
|
||||||
#if ALPHA
|
#if ALPHA
|
||||||
static let altStoreSourceURL = URL(string: "https://apps.sidestore.io/")!
|
static let altStoreSourceURL = URL(string: "https://sidestore.io/apps-v2.json/")!
|
||||||
#else
|
#else
|
||||||
// static let altStoreSourceURL = URL(string: "https://apps.sidestore.io/")!
|
static let altStoreSourceURL = URL(string: "https://sidestore.io/apps-v2.json/")!
|
||||||
static let altStoreSourceURL = URL(string: "https://sidestore.io/apps-v2.json/")! // using v2 for alpha releases
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// normalized url is the source identifier (or) p-key!
|
||||||
|
static let altStoreIdentifier = try! Source.sourceID(from: altStoreSourceURL)
|
||||||
}
|
}
|
||||||
|
|
||||||
// public struct AppPermissionFeed: Codable {
|
// public struct AppPermissionFeed: Codable {
|
||||||
@@ -205,7 +211,8 @@ public class Source: BaseEntity, Decodable
|
|||||||
/* Properties */
|
/* Properties */
|
||||||
@NSManaged public var version: Int
|
@NSManaged public var version: Int
|
||||||
@NSManaged public var name: String
|
@NSManaged public var name: String
|
||||||
@NSManaged public private(set) var identifier: String
|
@NSManaged public private(set) var identifier: String // NOTE: sourceID is just normalized sourceURL
|
||||||
|
@NSManaged public private(set) var groupID: String?
|
||||||
@NSManaged public var sourceURL: URL
|
@NSManaged public var sourceURL: URL
|
||||||
|
|
||||||
/* Source Detail */
|
/* Source Detail */
|
||||||
@@ -280,6 +287,9 @@ public class Source: BaseEntity, Decodable
|
|||||||
case news
|
case news
|
||||||
case featuredApps
|
case featuredApps
|
||||||
case userInfo
|
case userInfo
|
||||||
|
|
||||||
|
// case identifier
|
||||||
|
case groupID = "identifier"
|
||||||
}
|
}
|
||||||
|
|
||||||
private override init(entity: NSEntityDescription, insertInto context: NSManagedObjectContext?)
|
private override init(entity: NSEntityDescription, insertInto context: NSManagedObjectContext?)
|
||||||
@@ -359,6 +369,24 @@ public class Source: BaseEntity, Decodable
|
|||||||
|
|
||||||
// Updates identifier + apps & newsItems
|
// Updates identifier + apps & newsItems
|
||||||
try self.setSourceURL(sourceURL)
|
try self.setSourceURL(sourceURL)
|
||||||
|
|
||||||
|
|
||||||
|
// NOTE: Source ID is just normalized sourceURL. coz normalized url is the primary key which needs to be unique
|
||||||
|
// Hence if a source's URL changed, then it means it is a different source now.
|
||||||
|
// This also means that the identifier field in the source is irrelevant (if any)
|
||||||
|
|
||||||
|
// if we want grouping of sources from same author or something like that then we should have used groupID (a new field)
|
||||||
|
// shouldn't use the existing "identifier" field, hence the following is commented out
|
||||||
|
|
||||||
|
// // if an explicit identifier is present, then use it
|
||||||
|
// if let identifier = try container.decodeIfPresent(String.self, forKey: .identifier)
|
||||||
|
// {
|
||||||
|
// self.identifier = identifier
|
||||||
|
// }
|
||||||
|
|
||||||
|
// if an explicit (group)identifier is present, then use it as groupID else use sourceID as groupID too
|
||||||
|
self.groupID = try container.decodeIfPresent(String.self, forKey: .groupID) ?? self.identifier
|
||||||
|
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
@@ -405,7 +433,7 @@ public extension Source
|
|||||||
|
|
||||||
// TODO: Support alternate URLs
|
// TODO: Support alternate URLs
|
||||||
let isRecommended = recommendedSources.contains { source in
|
let isRecommended = recommendedSources.contains { source in
|
||||||
return source.identifier == self.identifier || source.sourceURL?.absoluteString.lowercased() == self.sourceURL.absoluteString
|
return source.identifier == self.identifier || source.sourceURL?.absoluteString.lowercased() == self.sourceURL.absoluteString.lowercased()
|
||||||
}
|
}
|
||||||
return isRecommended
|
return isRecommended
|
||||||
}
|
}
|
||||||
@@ -418,14 +446,17 @@ public extension Source
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal extension Source
|
public extension Source
|
||||||
{
|
{
|
||||||
class func sourceID(from sourceURL: URL) throws -> String
|
class func sourceID(from sourceURL: URL) throws -> String
|
||||||
{
|
{
|
||||||
let sourceID = try sourceURL.normalized()
|
let sourceID = try sourceURL.normalized()
|
||||||
return sourceID
|
return sourceID
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal extension Source
|
||||||
|
{
|
||||||
func setFeaturedApps(_ featuredApps: [StoreApp]?)
|
func setFeaturedApps(_ featuredApps: [StoreApp]?)
|
||||||
{
|
{
|
||||||
// Explicitly update relationships for all apps to ensure featuredApps merges correctly.
|
// Explicitly update relationships for all apps to ensure featuredApps merges correctly.
|
||||||
@@ -451,17 +482,23 @@ public extension Source
|
|||||||
{
|
{
|
||||||
func setSourceURL(_ sourceURL: URL) throws
|
func setSourceURL(_ sourceURL: URL) throws
|
||||||
{
|
{
|
||||||
let identifier = try Source.sourceID(from: sourceURL)
|
|
||||||
|
|
||||||
self.identifier = identifier
|
|
||||||
self.sourceURL = sourceURL
|
self.sourceURL = sourceURL
|
||||||
|
|
||||||
|
// update the normalized sourceURL as the identifier
|
||||||
|
let identifier = try Source.sourceID(from: sourceURL)
|
||||||
|
try self.setSourceID(identifier)
|
||||||
|
}
|
||||||
|
|
||||||
|
func setSourceID(_ identifier: String) throws
|
||||||
|
{
|
||||||
|
self.identifier = identifier
|
||||||
|
|
||||||
for app in self.apps
|
for app in self.apps
|
||||||
{
|
{
|
||||||
app.sourceIdentifier = identifier
|
app.sourceIdentifier = identifier
|
||||||
}
|
}
|
||||||
|
|
||||||
for newsItem in self.newsItems
|
for newsItem in self.newsItems
|
||||||
{
|
{
|
||||||
newsItem.sourceIdentifier = identifier
|
newsItem.sourceIdentifier = identifier
|
||||||
}
|
}
|
||||||
@@ -479,6 +516,7 @@ public extension Source
|
|||||||
{
|
{
|
||||||
let source = Source(context: context)
|
let source = Source(context: context)
|
||||||
source.name = "SideStore Offical"
|
source.name = "SideStore Offical"
|
||||||
|
source.groupID = Source.altStoreGroupIdentifier
|
||||||
source.identifier = Source.altStoreIdentifier
|
source.identifier = Source.altStoreIdentifier
|
||||||
try! source.setSourceURL(Source.altStoreSourceURL)
|
try! source.setSourceURL(Source.altStoreSourceURL)
|
||||||
|
|
||||||
@@ -491,13 +529,14 @@ public extension Source
|
|||||||
return source
|
return source
|
||||||
}
|
}
|
||||||
|
|
||||||
class func make(name: String, identifier: String, sourceURL: URL, context: NSManagedObjectContext) -> Source
|
class func make(name: String, groupID: String, sourceURL: URL, context: NSManagedObjectContext) -> Source
|
||||||
{
|
{
|
||||||
let source = Source(context: context)
|
let source = Source(context: context)
|
||||||
source.name = name
|
source.name = name
|
||||||
source.identifier = identifier
|
|
||||||
source.sourceURL = sourceURL
|
source.sourceURL = sourceURL
|
||||||
|
source.sourceURL = sourceURL
|
||||||
|
source.identifier = try! Source.sourceID(from: sourceURL)
|
||||||
|
|
||||||
return source
|
return source
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
// Configuration settings file format documentation can be found at:
|
// Configuration settings file format documentation can be found at:
|
||||||
// https://help.apple.com/xcode/#/dev745c5c974
|
// https://help.apple.com/xcode/#/dev745c5c974
|
||||||
|
|
||||||
MARKETING_VERSION = 0.6.0
|
MARKETING_VERSION = 0.6.1
|
||||||
CURRENT_PROJECT_VERSION = 6000
|
CURRENT_PROJECT_VERSION = 0601
|
||||||
|
|
||||||
// Vars to be overwritten by `CodeSigning.xcconfig` if exists
|
// Vars to be overwritten by `CodeSigning.xcconfig` if exists
|
||||||
DEVELOPMENT_TEAM = S32Z3HMYVQ
|
DEVELOPMENT_TEAM = S32Z3HMYVQ
|
||||||
|
|||||||
Reference in New Issue
Block a user