From 2d16cb666b49c5eb5c510e349675c060778e37e0 Mon Sep 17 00:00:00 2001 From: relikd Date: Thu, 6 Nov 2025 01:06:53 +0100 Subject: [PATCH] feat: show xcarchive developer notes --- QLAppBundle.xcodeproj/project.pbxproj | 4 ++++ resources/template.html | 5 +++++ src/Preview+ArchiveInfo.swift | 29 +++++++++++++++++++++++++++ src/PreviewGenerator.swift | 4 ++-- 4 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 src/Preview+ArchiveInfo.swift diff --git a/QLAppBundle.xcodeproj/project.pbxproj b/QLAppBundle.xcodeproj/project.pbxproj index 46722e5..a300cab 100644 --- a/QLAppBundle.xcodeproj/project.pbxproj +++ b/QLAppBundle.xcodeproj/project.pbxproj @@ -9,6 +9,7 @@ /* Begin PBXBuildFile section */ 5405CF5E2EA1199B00613856 /* MetaInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5405CF5D2EA1199B00613856 /* MetaInfo.swift */; }; 5405CF652EA1376B00613856 /* Zip.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5405CF642EA1376B00613856 /* Zip.swift */; }; + 5412DECE2EBC168600F9040D /* Preview+ArchiveInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5412DECD2EBC168600F9040D /* Preview+ArchiveInfo.swift */; }; 543FE5742EB3BB5E0059F98B /* AppIcon.icns in Resources */ = {isa = PBXBuildFile; fileRef = 543FE5732EB3BB5E0059F98B /* AppIcon.icns */; }; 54442C232E378BAF008A870E /* Quartz.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54442C222E378BAF008A870E /* Quartz.framework */; }; 54442C702E378BDD008A870E /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54442C6A2E378BDD008A870E /* AppDelegate.swift */; }; @@ -124,6 +125,7 @@ /* Begin PBXFileReference section */ 5405CF5D2EA1199B00613856 /* MetaInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MetaInfo.swift; sourceTree = ""; }; 5405CF642EA1376B00613856 /* Zip.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Zip.swift; sourceTree = ""; }; + 5412DECD2EBC168600F9040D /* Preview+ArchiveInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Preview+ArchiveInfo.swift"; sourceTree = ""; }; 54352E8A2EB6A79A0082F61D /* AssetCarReader.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = AssetCarReader.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 543FE5732EB3BB5E0059F98B /* AppIcon.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon.icns; sourceTree = ""; }; 543FE5752EB3BC740059F98B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -217,6 +219,7 @@ 547F52DC2EB2C15D002B6D5F /* ExpirationStatus.swift */, 547F52E62EB2C41C002B6D5F /* PreviewGenerator.swift */, 547F52EC2EB2C822002B6D5F /* Preview+AppInfo.swift */, + 5412DECD2EBC168600F9040D /* Preview+ArchiveInfo.swift */, 547F52E32EB2C3D8002B6D5F /* Preview+iTunesPurchase.swift */, 549E3BA32EBC021500ADFF56 /* Preview+TransportSecurity.swift */, 547F52F32EB2CA05002B6D5F /* Preview+Entitlements.swift */, @@ -529,6 +532,7 @@ buildActionMask = 2147483647; files = ( 549E3BA42EBC021500ADFF56 /* Preview+TransportSecurity.swift in Sources */, + 5412DECE2EBC168600F9040D /* Preview+ArchiveInfo.swift in Sources */, 54D3A6F02EA3F49F001EF4F6 /* NSBezierPath+RoundedRect.swift in Sources */, 547F52E42EB2C3D8002B6D5F /* Preview+iTunesPurchase.swift in Sources */, 547F52F72EB2CAC7002B6D5F /* Preview+Footer.swift in Sources */, diff --git a/resources/template.html b/resources/template.html index f53809e..e2213dd 100644 --- a/resources/template.html +++ b/resources/template.html @@ -22,6 +22,11 @@
+
+

Archive Notes

+
__ArchiveComment__
+
+

iTunes Metadata

iTunesId: __iTunesId__
diff --git a/src/Preview+ArchiveInfo.swift b/src/Preview+ArchiveInfo.swift new file mode 100644 index 0000000..77424d8 --- /dev/null +++ b/src/Preview+ArchiveInfo.swift @@ -0,0 +1,29 @@ +import Foundation + +extension MetaInfo { + /// Read `Info.plist` if type `.Archive` + func readPlistXCArchive() -> PlistDict? { + switch self.type { + case .Archive: + // not `readPayloadFile` because plist is in root dir + return try? Data(contentsOf: self.url.appendingPathComponent("Info.plist", isDirectory: false)).asPlistOrNil() + case .IPA, .Extension: + return nil + } + } +} + +extension PreviewGenerator { + /// Process info of `.xcarchive` stored in root `Info.plist` + mutating func procArchiveInfo(_ archivePlist: PlistDict?) { + guard let archivePlist, let comment = archivePlist["Comment"] as? String else { + self.apply(["ArchiveHidden": CLASS_HIDDEN]) + return + } + + self.apply([ + "ArchiveHidden": CLASS_VISIBLE, + "ArchiveComment": comment, + ]) + } +} diff --git a/src/PreviewGenerator.swift b/src/PreviewGenerator.swift index 4314f57..465f5cd 100644 --- a/src/PreviewGenerator.swift +++ b/src/PreviewGenerator.swift @@ -10,13 +10,13 @@ struct PreviewGenerator { init(_ meta: MetaInfo) { self.meta = meta let plistApp = meta.readPlistApp() - let plistItunes = meta.readPlistItunes() let plistProvision = meta.readPlistProvision() data["QuickLookTitle"] = stringForFileType(meta) procAppInfo(plistApp, isOSX: meta.isOSX) - procItunesMeta(plistItunes) + procArchiveInfo(meta.readPlistXCArchive()) + procItunesMeta(meta.readPlistItunes()) procTransportSecurity(plistApp) procEntitlements(meta, plistApp, plistProvision) procProvision(plistProvision, isOSX: meta.isOSX)