ref: make app plist required

This commit is contained in:
relikd
2025-11-04 19:45:29 +01:00
parent 6898eeb42c
commit 96001e4d40
6 changed files with 22 additions and 35 deletions

View File

@@ -22,7 +22,10 @@ class ThumbnailProvider: QLThumbnailProvider {
override func provideThumbnail(for request: QLFileThumbnailRequest, _ handler: @escaping (QLThumbnailReply?, Error?) -> Void) { override func provideThumbnail(for request: QLFileThumbnailRequest, _ handler: @escaping (QLThumbnailReply?, Error?) -> Void) {
let meta = MetaInfo(request.fileURL) 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. // 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 let reply = QLThumbnailReply(contextSize: request.maximumSize, currentContextDrawing: { () -> Bool in

View File

@@ -5,7 +5,7 @@
<style>__CSS__</style> <style>__CSS__</style>
</head> </head>
<body> <body>
<div class="app __AppInfoHidden__"> <div class="app">
<h1>__AppInfoTitle__</h1> <h1>__AppInfoTitle__</h1>
<div class="floatLeft icon"><img alt="App icon" src="data:image/png;base64,__AppIcon__"/></div> <div class="floatLeft icon"><img alt="App icon" src="data:image/png;base64,__AppIcon__"/></div>
<div class="floatLeft info"> <div class="floatLeft info">
@@ -25,14 +25,8 @@
</div> </div>
<div class="__ProvisionHidden__"> <div class="__ProvisionHidden__">
<div class="__AppInfoHidden__">
<h2>Provisioning</h2> <h2>Provisioning</h2>
Profile name: <strong>__ProvisionProfileName__</strong><br /> Profile name: <strong>__ProvisionProfileName__</strong><br />
</div>
<div class="__ProvisionTitleHidden__">
<h1><span class="__ProvisionExpireStatus__">__ProvisionProfileName__</span></h1>
</div>
Profile UUID: __ProvisionProfileId__<br /> Profile UUID: __ProvisionProfileId__<br />
Profile Type: __ProvisionProfilePlatform__ __ProvisionProfileType__<br /> Profile Type: __ProvisionProfilePlatform__ __ProvisionProfileType__<br />
Team: __ProvisionTeamName__ (__ProvisionTeamIds__)<br /> Team: __ProvisionTeamName__ (__ProvisionTeamIds__)<br />
@@ -42,7 +36,7 @@
<div> <div>
<h2>Entitlements</h2> <h2>Entitlements</h2>
<div class="__EntitlementsWarningHidden__ warning"> <div class="warning __EntitlementsWarningHidden__">
<strong>Entitlements extraction failed.</strong> <strong>Entitlements extraction failed.</strong>
</div> </div>
__EntitlementsDict__ __EntitlementsDict__

View File

@@ -15,7 +15,7 @@ struct AppIcon {
/// Try multiple methods to extract image. /// 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. /// 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 // no need to unwrap the plist, and most .ipa should include the Artwork anyway
if meta.type == .IPA { if meta.type == .IPA {
if let data = meta.zipFile!.unzipFile("iTunesArtwork") { if let data = meta.zipFile!.unzipFile("iTunesArtwork") {
@@ -68,8 +68,7 @@ extension AppIcon {
/// Parse app plist to find the bundle icon filename. /// Parse app plist to find the bundle icon filename.
/// @param appPlist If `nil`, will load plist on the fly (used for thumbnail) /// @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. /// @return Filenames which do not necessarily exist on filesystem. This may include `@2x` and/or no file extension.
private func iconNamesFromPlist(_ appPlist: PlistDict?) -> [String] { private func iconNamesFromPlist(_ appPlist: PlistDict) -> [String] {
let appPlist = appPlist == nil ? meta.readPlistApp()! : appPlist!
// Check for CFBundleIcons (since 5.0) // Check for CFBundleIcons (since 5.0)
if let icons = unpackNameListFromPlistDict(appPlist["CFBundleIcons"]), !icons.isEmpty { if let icons = unpackNameListFromPlistDict(appPlist["CFBundleIcons"]), !icons.isEmpty {
return icons return icons

View File

@@ -57,15 +57,7 @@ extension PreviewGenerator {
} }
/// Process info stored in `Info.plist` /// Process info stored in `Info.plist`
mutating func procAppInfo(_ appPlist: PlistDict?) { mutating func procAppInfo(_ appPlist: PlistDict) {
guard let appPlist else {
self.apply([
"AppInfoHidden": CLASS_HIDDEN,
"ProvisionTitleHidden": "",
])
return
}
var platforms = (appPlist["UIDeviceFamily"] as? [Int])?.compactMap({ var platforms = (appPlist["UIDeviceFamily"] as? [Int])?.compactMap({
switch $0 { switch $0 {
case 1: return "iPhone" case 1: return "iPhone"
@@ -83,9 +75,6 @@ extension PreviewGenerator {
let extensionType = (appPlist["NSExtension"] as? PlistDict)?["NSExtensionPointIdentifier"] as? String let extensionType = (appPlist["NSExtension"] as? PlistDict)?["NSExtensionPointIdentifier"] as? String
self.apply([ self.apply([
"AppInfoHidden": "",
"ProvisionTitleHidden": CLASS_HIDDEN,
"AppName": appPlist["CFBundleDisplayName"] as? String ?? appPlist["CFBundleName"] as? String ?? "", "AppName": appPlist["CFBundleDisplayName"] as? String ?? appPlist["CFBundleName"] as? String ?? "",
"AppVersion": appPlist["CFBundleShortVersionString"] as? String ?? "", "AppVersion": appPlist["CFBundleShortVersionString"] as? String ?? "",
"AppBuildVer": appPlist["CFBundleVersion"] as? String ?? "", "AppBuildVer": appPlist["CFBundleVersion"] as? String ?? "",

View File

@@ -24,8 +24,8 @@ extension PreviewGenerator {
} }
/// Process compiled binary and provision plist to extract `Entitlements` /// Process compiled binary and provision plist to extract `Entitlements`
mutating func procEntitlements(_ meta: MetaInfo, _ appPlist: PlistDict?, _ provisionPlist: PlistDict?) { mutating func procEntitlements(_ meta: MetaInfo, _ appPlist: PlistDict, _ provisionPlist: PlistDict?) {
var entitlements = readEntitlements(meta, appPlist?["CFBundleExecutable"] as? String) var entitlements = readEntitlements(meta, appPlist["CFBundleExecutable"] as? String)
entitlements.applyFallbackIfNeeded(provisionPlist?["Entitlements"] as? PlistDict) entitlements.applyFallbackIfNeeded(provisionPlist?["Entitlements"] as? PlistDict)
self.apply([ self.apply([

View File

@@ -8,7 +8,9 @@ struct PreviewGenerator {
init(_ meta: MetaInfo) { init(_ meta: MetaInfo) {
self.meta = meta self.meta = meta
let plistApp = meta.readPlistApp() guard let plistApp = meta.readPlistApp() else {
return
}
let plistItunes = meta.readPlistItunes() let plistItunes = meta.readPlistItunes()
let plistProvision = meta.readPlistProvision() let plistProvision = meta.readPlistProvision()