A simple macOS Pomodoro timer and a demo project showing how to set up any Mac app with Sparkle auto-updates and Amore licensing.
Demo license key: 6E847-B1F9A-73BA7-A91F0-61A71-90113-7E033-073BE
- Over-the-air updates via Sparkle + Amore, so users get update prompts automatically
- License key validation via the AmoreLicensing SDK
- One-command releases with
amore releaseto build, sign, notarize, and publish
Everything shown here via the CLI can also be done through the Amore app GUI.
Add Sparkle as an SPM dependency, then initialize the updater in your App struct:
import Sparkle
private let updaterController = SPUStandardUpdaterController(
startingUpdater: true, updaterDelegate: nil, userDriverDelegate: nil
)Add SUFeedURL, SUPublicEDKey, and SUEnableInstallerLauncherService to your Info.plist. If your app is sandboxed, you also need mach-lookup exceptions for Sparkle's XPC services in your entitlements:
<key>com.apple.security.temporary-exception.mach-lookup.global-name</key>
<array>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)-spks</string>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)-spki</string>
</array>Run amore setup YourApp.app to register the app and generate Sparkle signing keys.
Add AmoreKit as an SPM dependency. Initialize with your licensing public key:
import AmoreLicensing
let licensing = try AmoreLicensing(publicKey: "your-license-public-key")The licensing.status property is @Observable. Switch on it to gate your UI:
switch licensing.status {
case .valid, .gracePeriod:
TimerView()
default:
LicenseView(licensing: licensing)
}Create a product with the CLI:
amore products create -b com.example.App --name "My App" --device-limit 3amore release --scheme YourApp --release-notes "What's new"This archives, code signs, creates a DMG, notarizes with Apple, signs for Sparkle, and uploads, all in one command.
- macOS 14.0+
- Amore for the CLI