Our app is being stored in /Users/Shared/OurAppData/OurApp.app. One of the reasons for this is to enforce user to use launcher.
But, now we've met the problem, when we want to update our app through the launcher(we download zip file, extract that and that wants to replace our app with the new one with)
try FileManager.default.replaceItemAt(URL(fileURLWithPath : Paths.ourAppPath) , withItemAt: extractedURL)
"You don’t have permission to save the file “OurApp” in the folder “ OurApp Data”."
My question is - is there a way to handle that situation? I guess the best solution to promt user for login and password for permissions, and to replace that file? I guess this is something outside the Swift scope, and probably AppleScript, or even .sh.
Please, help.
Thanks
I recommend to have a look at the Sparkle framework for updating applications.
Sparkle handles the checking if an update is available, downloading the update, asking for an administrator password if required, and cleaning up the downloaded files after the update.
For most application it is enough to just have the new version archived as zip archive.
But it is also possible to update application with helper applications or agents which are outside of the main application bundle.
This can be done with installer package *.pkg
. If you are familiar with Sparkle, the "Automatic installation" referred here will only show the Sparkle UI. In the background it will use macOS’s built-in command line installer, /usr/sbin/installer
.
In most cases it will make sense to have the same .pkg
as user facing installer and update, it is not required.
If your application is sandbox, there are a couple of forks of the framework.