From 96001e4d408c41e2faa4fca58f901dfb2ddb61f3 Mon Sep 17 00:00:00 2001 From: relikd Date: Tue, 4 Nov 2025 19:45:29 +0100 Subject: [PATCH] ref: make app plist required --- QLThumbnail/ThumbnailProvider.swift | 5 ++++- resources/template.html | 26 ++++++++++---------------- src/AppIcon.swift | 5 ++--- src/Preview+AppInfo.swift | 13 +------------ src/Preview+Entitlements.swift | 4 ++-- src/PreviewGenerator.swift | 4 +++- 6 files changed, 22 insertions(+), 35 deletions(-) diff --git a/QLThumbnail/ThumbnailProvider.swift b/QLThumbnail/ThumbnailProvider.swift index 1887385..c1d8bc0 100644 --- a/QLThumbnail/ThumbnailProvider.swift +++ b/QLThumbnail/ThumbnailProvider.swift @@ -22,7 +22,10 @@ class ThumbnailProvider: QLThumbnailProvider { override func provideThumbnail(for request: QLFileThumbnailRequest, _ handler: @escaping (QLThumbnailReply?, Error?) -> Void) { let meta = MetaInfo(request.fileURL) - let img = AppIcon(meta).extractImage(from: meta.readPlistApp()).withRoundCorners() + guard let appPlist = meta.readPlistApp() else { + return + } + let img = AppIcon(meta).extractImage(from: appPlist).withRoundCorners() // First way: Draw the thumbnail into the current context, set up with UIKit's coordinate system. let reply = QLThumbnailReply(contextSize: request.maximumSize, currentContextDrawing: { () -> Bool in diff --git a/resources/template.html b/resources/template.html index 0b16d57..6b75b39 100644 --- a/resources/template.html +++ b/resources/template.html @@ -5,7 +5,7 @@ -
+

__AppInfoTitle__

App icon
@@ -23,41 +23,35 @@

App Transport Security

__AppTransportSecurity__
- +
-
-

Provisioning

- Profile name: __ProvisionProfileName__
-
-
-

__ProvisionProfileName__

-
- +

Provisioning

+ Profile name: __ProvisionProfileName__
Profile UUID: __ProvisionProfileId__
Profile Type: __ProvisionProfilePlatform__ __ProvisionProfileType__
Team: __ProvisionTeamName__ (__ProvisionTeamIds__)
Creation date: __ProvisionCreateDate__
Expiration Date: __ProvisionExpireDate__
- +

Entitlements

-
+
Entitlements extraction failed.
__EntitlementsDict__
- +

Developer Certificates

__ProvisionDevelopCertificates__
- +

Devices (__ProvisionDeviceCount__)

__ProvisionDeviceIds__
- +

iTunes Metadata

iTunesId: __iTunesId__
@@ -69,7 +63,7 @@ Purchased: __iTunesPurchaseDate__
Price: __iTunesPrice__
- +

File info

__FileName__
diff --git a/src/AppIcon.swift b/src/AppIcon.swift index 4f077ac..0ac9caa 100644 --- a/src/AppIcon.swift +++ b/src/AppIcon.swift @@ -15,7 +15,7 @@ struct AppIcon { /// Try multiple methods to extract image. /// This method will always return an image even if none is found, in which case it returns the default image. - func extractImage(from appPlist: PlistDict?) -> NSImage { + func extractImage(from appPlist: PlistDict) -> NSImage { // no need to unwrap the plist, and most .ipa should include the Artwork anyway if meta.type == .IPA { if let data = meta.zipFile!.unzipFile("iTunesArtwork") { @@ -68,8 +68,7 @@ extension AppIcon { /// Parse app plist to find the bundle icon filename. /// @param appPlist If `nil`, will load plist on the fly (used for thumbnail) /// @return Filenames which do not necessarily exist on filesystem. This may include `@2x` and/or no file extension. - private func iconNamesFromPlist(_ appPlist: PlistDict?) -> [String] { - let appPlist = appPlist == nil ? meta.readPlistApp()! : appPlist! + private func iconNamesFromPlist(_ appPlist: PlistDict) -> [String] { // Check for CFBundleIcons (since 5.0) if let icons = unpackNameListFromPlistDict(appPlist["CFBundleIcons"]), !icons.isEmpty { return icons diff --git a/src/Preview+AppInfo.swift b/src/Preview+AppInfo.swift index fa7ed06..65fe86d 100644 --- a/src/Preview+AppInfo.swift +++ b/src/Preview+AppInfo.swift @@ -57,15 +57,7 @@ extension PreviewGenerator { } /// Process info stored in `Info.plist` - mutating func procAppInfo(_ appPlist: PlistDict?) { - guard let appPlist else { - self.apply([ - "AppInfoHidden": CLASS_HIDDEN, - "ProvisionTitleHidden": "", - ]) - return - } - + mutating func procAppInfo(_ appPlist: PlistDict) { var platforms = (appPlist["UIDeviceFamily"] as? [Int])?.compactMap({ switch $0 { case 1: return "iPhone" @@ -83,9 +75,6 @@ extension PreviewGenerator { let extensionType = (appPlist["NSExtension"] as? PlistDict)?["NSExtensionPointIdentifier"] as? String self.apply([ - "AppInfoHidden": "", - "ProvisionTitleHidden": CLASS_HIDDEN, - "AppName": appPlist["CFBundleDisplayName"] as? String ?? appPlist["CFBundleName"] as? String ?? "", "AppVersion": appPlist["CFBundleShortVersionString"] as? String ?? "", "AppBuildVer": appPlist["CFBundleVersion"] as? String ?? "", diff --git a/src/Preview+Entitlements.swift b/src/Preview+Entitlements.swift index 5d2dee7..044131c 100644 --- a/src/Preview+Entitlements.swift +++ b/src/Preview+Entitlements.swift @@ -24,8 +24,8 @@ extension PreviewGenerator { } /// Process compiled binary and provision plist to extract `Entitlements` - mutating func procEntitlements(_ meta: MetaInfo, _ appPlist: PlistDict?, _ provisionPlist: PlistDict?) { - var entitlements = readEntitlements(meta, appPlist?["CFBundleExecutable"] as? String) + mutating func procEntitlements(_ meta: MetaInfo, _ appPlist: PlistDict, _ provisionPlist: PlistDict?) { + var entitlements = readEntitlements(meta, appPlist["CFBundleExecutable"] as? String) entitlements.applyFallbackIfNeeded(provisionPlist?["Entitlements"] as? PlistDict) self.apply([ diff --git a/src/PreviewGenerator.swift b/src/PreviewGenerator.swift index 8fb771a..62cb4f1 100644 --- a/src/PreviewGenerator.swift +++ b/src/PreviewGenerator.swift @@ -8,7 +8,9 @@ struct PreviewGenerator { init(_ meta: MetaInfo) { self.meta = meta - let plistApp = meta.readPlistApp() + guard let plistApp = meta.readPlistApp() else { + return + } let plistItunes = meta.readPlistItunes() let plistProvision = meta.readPlistProvision()