v0.10.3 — Distribution hotfix (Gatekeeper acceptance)
Pre-releaseDistribution hotfix — Gatekeeper acceptance
v0.10.0, v0.10.1, and v0.10.2 all shipped distribution ZIPs that, on the user's machine, failed Gatekeeper verification with "sealed resource is missing or invalid" — surfacing as "app chưa sign" when Sparkle tried to install an update.
The bug: hidden AppleDouble metadata files (the ._* files) inside the embedded Sparkle.framework, introduced by SwiftPM's xcframework extraction on macOS. They were invisible to codesign --sign (which signs the real files), so the build chain succeeded — but post-extraction codesign --verify --deep --strict treated them as foreign content and rejected the bundle.
v0.10.3 carries zero application code changes — it is purely the v0.10.2 codebase re-packaged with the build pipeline fixed.
How to install
Recommended: download the v0.10.3 ZIP from this page — Sparkle on a v0.10.0 install that already aborted a v0.10.1/v0.10.2 update is likely in an inconsistent state. Unzip, drag the .app into /Applications replacing the old copy, run it. Future Sparkle updates (v0.10.4 onwards) install cleanly through Sparkle.
If Sparkle's Check for Updates does work — even better. The v0.10.3 bundle is correctly signed + notarized + stapled, and the distribution ZIP no longer contains the offending metadata.
Build pipeline fixes
scripts/package_app.shstrips._*files BEFORE and AFTER the codesign chain (defense in depth).- The script's final step runs
codesign --verify --deep --strictas an invariant check — if a future toolchain combination re-introduces the problem, the build fails loudly. - The distribution ZIP is now created with
ditto --norsrc --noextattr --noaclso that ditto does not re-pack metadata into the ZIP via xattr packaging.
Verified end-to-end
$ unzip Contextual-Mac-Translator-v0.10.3-macos-arm64.zip
$ find "Contextual Mac Translator.app" -name "._*" | wc -l
0
$ codesign --verify --deep --strict --verbose=2 "Contextual Mac Translator.app"
valid on disk; satisfies its Designated Requirement
$ spctl --assess --type execute --verbose "Contextual Mac Translator.app"
accepted; source=Notarized Developer ID
$ xcrun stapler validate "Contextual Mac Translator.app"
The validate action worked!
Apple Silicon only. macOS 14 or later.