* Update Sparkle to latest version * Bump minimum macOS target For launch, I propose we support the current version of macOS (14.x) and one version earlier (13.x). * Add WFNavigation wrapper to use NavigationSplitView in macOS * Replace NavigationView with WFNavigation in ContentView * Fix deprecation warnings on locale * Update docs for updating the Mac app * Fix for being sent back to post list on app reactivate * Bump build version * Remove debugging statements * Bump Sparkle version to address security fix
2.4 KiB
Mac Software Updater
To make updating the Mac app easy, we're using the Sparkle framework.
Troubleshooting
If Xcode throws an error when you try to build the project
You may need to reset the package caches:
- From the File menu in Xcode, choose Swift Packages → Reset Package Caches
- Again from the File menu, choose Swift Packages → Update to Latest Package Versions
You should then be able to build and run the Mac target.
If you can't run generate_keys
because "Apple cannot check it for malicious software"
If you run into a code signing issue with Sparkle, right-click on generate_keys
in the Finder and choose Open (reference).
Deploying Updates
To publish an update to the app, you'll need the Sparkle-for-Swift-Package-Manager.zip archive —
specifically, you'll need the generate_appcast
tool. Download and de-compress the archive.
You will need some credentials and signing certificates to proceed with this process; speak to the project maintainer if you're responsible for creating the update, and confirm you have:
- the app's Developer ID Application certificate (check your Mac's system Keychain)
- the Sparkle EdDSA signing key (again, check your Mac's system Keychain)
Sign and notarize the app archive, then click on Export Notarized App in Xcode's Organizer window. Open the Terminal and navigate to where you de-compressed the Sparkle-for-Swift-Package-Manager archive, then create a zip file that preserves symlinks:
% ditto -c -k --sequesterRsrc --keepParent <source_path_to_app> <zip_destination>
For example, if you export the notarized app to the desktop, all prior updates are located in ~/Developer/WriteFreely/Updates
, and
the final archive should be called WFMac.zip
, you would run:
% ditto -c -k --sequesterRsrc --keepParent ~/Desktop/WriteFreely\ for\ Mac.app ~/Developer/WriteFreely/Updates/WFMac.zip
Then, generate an appcast file:
% ./bin/generate_appcast ~/Developer/WriteFreely/Updates
Once that's done, upload the appcast.xml and WFMac.zip files to the update distribution server (files.writefreely.org/apps/mac
)
and they'll be made available to users.