SPUUpdater is a main-thread-only API; calling resetUpdateCycle() from a
detached utility task violated Sparkle's threading contract and raised
a Swift 6 concurrency error (non-Sendable SPUUpdater captured in a
detached task). A plain main-actor Task keeps the deferral that avoids
running the feed-cache work synchronously inside the didSet.
- Add macOS-specific entitlements via CODE_SIGN_ENTITLEMENTS[sdk=macosx*]:
the iOS aps-environment key is silently dropped from macOS exports,
leaving distribution builds without a push entitlement (no CloudKit
sync pushes). Release now uses Yattee-macOS.entitlements with
com.apple.developer.aps-environment = production.
- Release-DeveloperID uses Yattee-macOS-DeveloperID.entitlements, adding
the Sparkle mach-lookup temporary exceptions (-spks/-spki) required
for the updater to install in a sandboxed app.
- Default Sparkle updater to the beta channel while only beta releases
exist, so testers receive updates without toggling Advanced settings.
- Set NSHumanReadableCopyright for the app target.
New Release-DeveloperID configuration gates Sparkle behind a SPARKLE
compile flag so the App Store Release build stays Sparkle-free. Adds
SPUStandardUpdaterController wrapper, Check for Updates menu command,
Advanced Settings section with beta channel toggle, and a Ruby script
plus GitHub Actions job that signs each release and publishes the
appcast to gh-pages for consumption by Sparkle and Homebrew cask.