[AltStoreCore] Adds AppScreenshot to support dynamically-sized screenshots

Preserves StoreApp.imageURL field in database model for backwards compatibility.
This commit is contained in:
Riley Testut
2023-10-11 15:05:27 -05:00
committed by Magesh K
parent 59a72ad096
commit 932e66deca
5 changed files with 211 additions and 5 deletions

View File

@@ -136,6 +136,11 @@ public class StoreApp: NSManagedObject, Decodable, Fetchable
{
permission.sourceID = self.sourceIdentifier ?? ""
}
for screenshot in self.screenshots
{
screenshot.sourceID = self.sourceIdentifier ?? ""
}
}
}
@NSManaged private var primitiveSourceIdentifier: String?
@@ -200,6 +205,10 @@ public class StoreApp: NSManagedObject, Decodable, Fetchable
guard let version = self.latestSupportedVersion else { return nil }
return version.downloadURL
}
@nonobjc public var screenshots: [AppScreenshot] {
return self._screenshots.array as! [AppScreenshot]
}
@NSManaged @objc(screenshots) private(set) var _screenshots: NSOrderedSet
private override init(entity: NSEntityDescription, insertInto context: NSManagedObjectContext?)
{
@@ -212,19 +221,24 @@ public class StoreApp: NSManagedObject, Decodable, Fetchable
case bundleIdentifier
case developerName
case localizedDescription
case version
case versionDescription
case versionDate
case iconURL
case screenshotURLs
case downloadURL
case platformURLs
case screenshots
case tintColor
case subtitle
case permissions = "appPermissions"
case size
case isBeta = "beta"
case versions
// Legacy
case version
case versionDescription
case versionDate
case downloadURL
case screenshotURLs
}
public required init(from decoder: Decoder) throws
@@ -245,7 +259,6 @@ public class StoreApp: NSManagedObject, Decodable, Fetchable
self.subtitle = try container.decodeIfPresent(String.self, forKey: .subtitle)
self.iconURL = try container.decode(URL.self, forKey: .iconURL)
self.screenshotURLs = try container.decodeIfPresent([URL].self, forKey: .screenshotURLs) ?? []
var downloadURL = try container.decodeIfPresent(URL.self, forKey: .downloadURL)
let platformURLs = try container.decodeIfPresent(PlatformURLs.self.self, forKey: .platformURLs)
@@ -291,6 +304,33 @@ public class StoreApp: NSManagedObject, Decodable, Fetchable
self.isBeta = try container.decodeIfPresent(Bool.self, forKey: .isBeta) ?? false
if let screenshots = try container.decodeIfPresent([AppScreenshot].self, forKey: .screenshots)
{
for screenshot in screenshots
{
screenshot.appBundleID = self.bundleIdentifier
}
self.setScreenshots(screenshots)
}
else if let screenshotURLs = try container.decodeIfPresent([URL].self, forKey: .screenshotURLs)
{
// Assume 9:16 iPhone 8 screen dimensions for legacy screenshotURLs.
let legacyAspectRatio = CGSize(width: 750, height: 1334)
let screenshots = screenshotURLs.map { imageURL in
let screenshot = AppScreenshot(imageURL: imageURL, size: legacyAspectRatio, context: context)
screenshot.appBundleID = self.bundleIdentifier
return screenshot
}
self.setScreenshots(screenshots)
}
else
{
self.setScreenshots([])
}
if let appPermissions = try container.decodeIfPresent(AppPermissions.self, forKey: .permissions)
{
let allPermissions = appPermissions.entitlements + appPermissions.privacy
@@ -402,6 +442,26 @@ internal extension StoreApp
self._permissions = permissions as NSSet
}
func setScreenshots(_ screenshots: [AppScreenshot])
{
for case let screenshot as AppScreenshot in self._screenshots
{
if screenshots.contains(screenshot)
{
screenshot.app = self
}
else
{
screenshot.app = nil
}
}
self._screenshots = NSOrderedSet(array: screenshots)
// Backwards compatibility
self.screenshotURLs = screenshots.map { $0.imageURL }
}
}
public extension StoreApp