├── Frameworks ├── Sparkle.framework │ ├── Versions │ │ ├── Current │ │ └── A │ │ │ ├── Updater.app │ │ │ └── Contents │ │ │ │ ├── PkgInfo │ │ │ │ ├── MacOS │ │ │ │ └── Updater │ │ │ │ ├── Resources │ │ │ │ ├── SUStatus.nib │ │ │ │ ├── ca.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── cs.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── da.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── de.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── el.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── es.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── fi.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── fr.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── he.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── hr.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── is.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── it.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── ja.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── ko.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── nb.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── nl.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── pl.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── ro.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── ru.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── sk.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── sl.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── sv.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── th.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── tr.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── uk.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── Base.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── pt_BR.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── pt_PT.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── zh_CN.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ └── zh_TW.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ └── Info.plist │ │ │ ├── Sparkle │ │ │ ├── Autoupdate │ │ │ ├── Modules │ │ │ └── module.modulemap │ │ │ ├── Resources │ │ │ ├── SUStatus.nib │ │ │ ├── ca.lproj │ │ │ │ ├── Sparkle.strings │ │ │ │ └── SUUpdateAlert.strings │ │ │ ├── cs.lproj │ │ │ │ ├── Sparkle.strings │ │ │ │ ├── SUUpdateAlert.strings │ │ │ │ └── SUUpdatePermissionPrompt.strings │ │ │ ├── da.lproj │ │ │ │ ├── Sparkle.strings │ │ │ │ ├── SUUpdateAlert.strings │ │ │ │ └── SUUpdatePermissionPrompt.strings │ │ │ ├── de.lproj │ │ │ │ ├── Sparkle.strings │ │ │ │ ├── SUUpdateAlert.strings │ │ │ │ └── SUUpdatePermissionPrompt.strings │ │ │ ├── el.lproj │ │ │ │ ├── Sparkle.strings │ │ │ │ ├── SUUpdateAlert.strings │ │ │ │ └── SUUpdatePermissionPrompt.strings │ │ │ ├── es.lproj │ │ │ │ ├── Sparkle.strings │ │ │ │ ├── SUUpdateAlert.strings │ │ │ │ └── SUUpdatePermissionPrompt.strings │ │ │ ├── fi.lproj │ │ │ │ ├── Sparkle.strings │ │ │ │ ├── SUUpdateAlert.strings │ │ │ │ └── SUUpdatePermissionPrompt.strings │ │ │ ├── fr.lproj │ │ │ │ ├── Sparkle.strings │ │ │ │ ├── SUUpdateAlert.strings │ │ │ │ └── SUUpdatePermissionPrompt.strings │ │ │ ├── he.lproj │ │ │ │ ├── Sparkle.strings │ │ │ │ └── SUUpdateAlert.strings │ │ │ ├── hr.lproj │ │ │ │ ├── Sparkle.strings │ │ │ │ ├── SUUpdateAlert.strings │ │ │ │ └── SUUpdatePermissionPrompt.strings │ │ │ ├── is.lproj │ │ │ │ ├── Sparkle.strings │ │ │ │ ├── SUUpdateAlert.strings │ │ │ │ └── SUUpdatePermissionPrompt.strings │ │ │ ├── it.lproj │ │ │ │ ├── Sparkle.strings │ │ │ │ ├── SUUpdateAlert.strings │ │ │ │ └── SUUpdatePermissionPrompt.strings │ │ │ ├── ja.lproj │ │ │ │ ├── Sparkle.strings │ │ │ │ ├── SUUpdateAlert.strings │ │ │ │ └── SUUpdatePermissionPrompt.strings │ │ │ ├── ko.lproj │ │ │ │ ├── Sparkle.strings │ │ │ │ ├── SUUpdateAlert.strings │ │ │ │ └── SUUpdatePermissionPrompt.strings │ │ │ ├── nb.lproj │ │ │ │ ├── Sparkle.strings │ │ │ │ ├── SUUpdateAlert.strings │ │ │ │ └── SUUpdatePermissionPrompt.strings │ │ │ ├── nl.lproj │ │ │ │ ├── Sparkle.strings │ │ │ │ ├── SUUpdateAlert.strings │ │ │ │ └── SUUpdatePermissionPrompt.strings │ │ │ ├── pl.lproj │ │ │ │ ├── Sparkle.strings │ │ │ │ ├── SUUpdateAlert.strings │ │ │ │ └── SUUpdatePermissionPrompt.strings │ │ │ ├── ro.lproj │ │ │ │ ├── Sparkle.strings │ │ │ │ ├── SUUpdateAlert.strings │ │ │ │ └── SUUpdatePermissionPrompt.strings │ │ │ ├── ru.lproj │ │ │ │ ├── Sparkle.strings │ │ │ │ ├── SUUpdateAlert.strings │ │ │ │ └── SUUpdatePermissionPrompt.strings │ │ │ ├── sk.lproj │ │ │ │ ├── Sparkle.strings │ │ │ │ ├── SUUpdateAlert.strings │ │ │ │ └── SUUpdatePermissionPrompt.strings │ │ │ ├── sl.lproj │ │ │ │ ├── Sparkle.strings │ │ │ │ ├── SUUpdateAlert.strings │ │ │ │ └── SUUpdatePermissionPrompt.strings │ │ │ ├── sv.lproj │ │ │ │ ├── Sparkle.strings │ │ │ │ ├── SUUpdateAlert.strings │ │ │ │ └── SUUpdatePermissionPrompt.strings │ │ │ ├── th.lproj │ │ │ │ ├── Sparkle.strings │ │ │ │ ├── SUUpdateAlert.strings │ │ │ │ └── SUUpdatePermissionPrompt.strings │ │ │ ├── tr.lproj │ │ │ │ ├── Sparkle.strings │ │ │ │ ├── SUUpdateAlert.strings │ │ │ │ └── SUUpdatePermissionPrompt.strings │ │ │ ├── uk.lproj │ │ │ │ ├── Sparkle.strings │ │ │ │ ├── SUUpdateAlert.strings │ │ │ │ └── SUUpdatePermissionPrompt.strings │ │ │ ├── Base.lproj │ │ │ │ ├── Sparkle.strings │ │ │ │ ├── SUUpdateAlert.nib │ │ │ │ └── SUUpdatePermissionPrompt.nib │ │ │ │ │ ├── keyedobjects.nib │ │ │ │ │ └── keyedobjects-110000.nib │ │ │ ├── pt_BR.lproj │ │ │ │ ├── Sparkle.strings │ │ │ │ ├── SUUpdateAlert.strings │ │ │ │ └── SUUpdatePermissionPrompt.strings │ │ │ ├── pt_PT.lproj │ │ │ │ ├── Sparkle.strings │ │ │ │ ├── SUUpdateAlert.strings │ │ │ │ └── SUUpdatePermissionPrompt.strings │ │ │ ├── zh_CN.lproj │ │ │ │ ├── Sparkle.strings │ │ │ │ ├── SUUpdateAlert.strings │ │ │ │ └── SUUpdatePermissionPrompt.strings │ │ │ ├── zh_TW.lproj │ │ │ │ ├── Sparkle.strings │ │ │ │ ├── SUUpdateAlert.strings │ │ │ │ └── SUUpdatePermissionPrompt.strings │ │ │ ├── ar.lproj │ │ │ │ ├── SUUpdateAlert.strings │ │ │ │ └── SUUpdatePermissionPrompt.strings │ │ │ ├── hu.lproj │ │ │ │ └── SUUpdatePermissionPrompt.strings │ │ │ ├── ReleaseNotesColorStyle.css │ │ │ ├── en.lproj │ │ │ │ ├── SUUpdateAlert.strings │ │ │ │ └── SUUpdatePermissionPrompt.strings │ │ │ ├── Info.plist │ │ │ └── SUModelTranslation.plist │ │ │ └── Headers │ │ │ ├── SUExport.h │ │ │ ├── SUVersionDisplayProtocol.h │ │ │ ├── SUVersionComparisonProtocol.h │ │ │ ├── SUAppcast.h │ │ │ ├── SPUUpdatePermissionRequest.h │ │ │ ├── SPUStandardUserDriver.h │ │ │ ├── SPUUserDriverCoreComponent.h │ │ │ ├── SPUStatusCompletionResults.h │ │ │ ├── SUUpdatePermissionResponse.h │ │ │ ├── SPUStandardUserDriverDelegate.h │ │ │ ├── Sparkle.h │ │ │ ├── SPUDownloadData.h │ │ │ ├── SUStandardVersionComparator.h │ │ │ ├── SPUUpdaterSettings.h │ │ │ ├── SUErrors.h │ │ │ ├── SUAppcastItem.h │ │ │ ├── SPUStandardUpdaterController.h │ │ │ ├── SUUpdater.h │ │ │ ├── SPUUpdater.h │ │ │ └── SUUpdaterDelegate.h │ ├── Headers │ ├── Modules │ ├── Sparkle │ ├── Autoupdate │ ├── Resources │ └── Updater.app └── Sparkle │ ├── org.sparkle-project.InstallerLauncher.xpc │ └── Contents │ │ ├── MacOS │ │ ├── Updater.app │ │ │ └── Contents │ │ │ │ ├── PkgInfo │ │ │ │ ├── MacOS │ │ │ │ └── Updater │ │ │ │ ├── Resources │ │ │ │ ├── SUStatus.nib │ │ │ │ ├── ca.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── cs.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── da.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── de.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── el.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── es.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── fi.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── fr.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── he.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── hr.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── is.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── it.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── ja.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── ko.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── nb.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── nl.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── pl.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── ro.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── ru.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── sk.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── sl.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── sv.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── th.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── tr.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── uk.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── Base.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── pt_BR.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── pt_PT.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ ├── zh_CN.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ └── zh_TW.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ └── Info.plist │ │ ├── Autoupdate │ │ └── org.sparkle-project.InstallerLauncher │ │ ├── Info.plist │ │ └── _CodeSignature │ │ └── CodeResources │ ├── org.sparkle-project.InstallerStatus.xpc │ └── Contents │ │ ├── MacOS │ │ └── org.sparkle-project.InstallerStatus │ │ ├── Info.plist │ │ └── _CodeSignature │ │ └── CodeResources │ └── org.sparkle-project.InstallerConnection.xpc │ └── Contents │ ├── MacOS │ └── org.sparkle-project.InstallerConnection │ ├── Info.plist │ └── _CodeSignature │ └── CodeResources ├── MyPlayground.playground ├── Contents.swift └── contents.xcplayground ├── SwiftUISparkleTestApp ├── Assets.xcassets │ ├── Contents.json │ ├── AccentColor.colorset │ │ └── Contents.json │ └── AppIcon.appiconset │ │ └── Contents.json ├── Preview Content │ └── Preview Assets.xcassets │ │ └── Contents.json ├── My+Extensions.swift ├── SwiftUISparkleTestApp.entitlements ├── InputValidationTextFieldStyle.swift ├── SwiftUISparkleTestAppApp.swift ├── Info.plist ├── ContentView.swift └── KeychainServiceModel.swift ├── docs ├── images │ ├── xcode-new-project.png │ ├── xcode-select-mac-app.png │ ├── xcode-project-settings.png │ └── xcode-sandbox-settings.png └── step-by-step.md ├── SwiftUISparkleTestApp.xcodeproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── xcshareddata │ └── xcschemes │ └── SwiftUISparkleTestApp.xcscheme ├── exportOptions.plist ├── Build-Versioning-Scripts ├── set_version.sh ├── set_build_number.sh ├── add-prelease-label.sh ├── zip-archive.sh ├── Increment_Build_Number.sh ├── get_release_asset_url.sh ├── publish-app.sh └── release.sh ├── get-sparkle-settings.sh ├── appcast.xml ├── SwiftUISparkleTestAppUITests ├── Info.plist └── SwiftUISparkleTestAppUITests.swift ├── SparkleSwiftUIWrappers ├── UpdateCommand.swift └── SparkleAutoUpdater.swift ├── LICENSE ├── README.md ├── .gitignore └── Makefile /Frameworks/Sparkle.framework/Versions/Current: -------------------------------------------------------------------------------- 1 | A -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Headers: -------------------------------------------------------------------------------- 1 | Versions/Current/Headers -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Modules: -------------------------------------------------------------------------------- 1 | Versions/Current/Modules -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Sparkle: -------------------------------------------------------------------------------- 1 | Versions/Current/Sparkle -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Autoupdate: -------------------------------------------------------------------------------- 1 | Versions/Current/Autoupdate -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Resources: -------------------------------------------------------------------------------- 1 | Versions/Current/Resources -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Updater.app: -------------------------------------------------------------------------------- 1 | Versions/Current/Updater.app -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/PkgInfo: -------------------------------------------------------------------------------- 1 | APPL???? -------------------------------------------------------------------------------- /MyPlayground.playground/Contents.swift: -------------------------------------------------------------------------------- 1 | import Cocoa 2 | 3 | var str = "Hello, playground" 4 | 5 | -------------------------------------------------------------------------------- /Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/PkgInfo: -------------------------------------------------------------------------------- 1 | APPL???? -------------------------------------------------------------------------------- /SwiftUISparkleTestApp/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /docs/images/xcode-new-project.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/docs/images/xcode-new-project.png -------------------------------------------------------------------------------- /docs/images/xcode-select-mac-app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/docs/images/xcode-select-mac-app.png -------------------------------------------------------------------------------- /docs/images/xcode-project-settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/docs/images/xcode-project-settings.png -------------------------------------------------------------------------------- /docs/images/xcode-sandbox-settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/docs/images/xcode-sandbox-settings.png -------------------------------------------------------------------------------- /SwiftUISparkleTestApp/Preview Content/Preview Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Sparkle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Sparkle -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Autoupdate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Autoupdate -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Modules/module.modulemap: -------------------------------------------------------------------------------- 1 | framework module Sparkle { 2 | umbrella header "Sparkle.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/SUStatus.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/SUStatus.nib -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/ca.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/ca.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/cs.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/cs.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/da.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/da.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/el.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/el.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/fi.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/fi.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/he.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/he.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/hr.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/hr.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/is.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/is.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/ja.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/ja.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/ko.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/ko.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/nb.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/nb.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/nl.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/nl.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/pl.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/pl.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/ro.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/ro.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/ru.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/ru.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/sk.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/sk.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/sl.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/sl.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/sv.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/sv.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/th.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/th.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/tr.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/tr.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/uk.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/uk.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/MacOS/Updater: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/MacOS/Updater -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/Base.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/Base.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/Base.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/Base.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/ar.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/ar.lproj/SUUpdateAlert.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/cs.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/cs.lproj/SUUpdateAlert.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdateAlert.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/el.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/el.lproj/SUUpdateAlert.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/fi.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/fi.lproj/SUUpdateAlert.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/is.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/is.lproj/SUUpdateAlert.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/ja.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/ja.lproj/SUUpdateAlert.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/ko.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/ko.lproj/SUUpdateAlert.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/nb.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/nb.lproj/SUUpdateAlert.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/pl.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/pl.lproj/SUUpdateAlert.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/ro.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/ro.lproj/SUUpdateAlert.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/sk.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/sk.lproj/SUUpdateAlert.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/sl.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/sl.lproj/SUUpdateAlert.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/th.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/th.lproj/SUUpdateAlert.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/tr.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/tr.lproj/SUUpdateAlert.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/uk.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/uk.lproj/SUUpdateAlert.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUUpdateAlert.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/SUUpdateAlert.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUUpdateAlert.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUUpdateAlert.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/SUStatus.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/SUStatus.nib -------------------------------------------------------------------------------- /Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Autoupdate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Autoupdate -------------------------------------------------------------------------------- /SwiftUISparkleTestApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/ar.lproj/SUUpdatePermissionPrompt.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/ar.lproj/SUUpdatePermissionPrompt.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/cs.lproj/SUUpdatePermissionPrompt.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/cs.lproj/SUUpdatePermissionPrompt.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdatePermissionPrompt.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdatePermissionPrompt.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/el.lproj/SUUpdatePermissionPrompt.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/el.lproj/SUUpdatePermissionPrompt.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/fi.lproj/SUUpdatePermissionPrompt.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/fi.lproj/SUUpdatePermissionPrompt.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/hu.lproj/SUUpdatePermissionPrompt.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/hu.lproj/SUUpdatePermissionPrompt.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/is.lproj/SUUpdatePermissionPrompt.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/is.lproj/SUUpdatePermissionPrompt.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/ja.lproj/SUUpdatePermissionPrompt.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/ja.lproj/SUUpdatePermissionPrompt.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/ko.lproj/SUUpdatePermissionPrompt.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/ko.lproj/SUUpdatePermissionPrompt.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/nb.lproj/SUUpdatePermissionPrompt.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/nb.lproj/SUUpdatePermissionPrompt.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/pl.lproj/SUUpdatePermissionPrompt.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/pl.lproj/SUUpdatePermissionPrompt.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/ro.lproj/SUUpdatePermissionPrompt.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/ro.lproj/SUUpdatePermissionPrompt.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/sk.lproj/SUUpdatePermissionPrompt.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/sk.lproj/SUUpdatePermissionPrompt.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/sl.lproj/SUUpdatePermissionPrompt.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/sl.lproj/SUUpdatePermissionPrompt.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/th.lproj/SUUpdatePermissionPrompt.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/th.lproj/SUUpdatePermissionPrompt.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/tr.lproj/SUUpdatePermissionPrompt.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/tr.lproj/SUUpdatePermissionPrompt.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/uk.lproj/SUUpdatePermissionPrompt.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/uk.lproj/SUUpdatePermissionPrompt.strings -------------------------------------------------------------------------------- /MyPlayground.playground/contents.xcplayground: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /SwiftUISparkleTestApp/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "idiom" : "universal" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUUpdatePermissionPrompt.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUUpdatePermissionPrompt.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/SUUpdatePermissionPrompt.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/SUUpdatePermissionPrompt.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUUpdatePermissionPrompt.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUUpdatePermissionPrompt.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUUpdatePermissionPrompt.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUUpdatePermissionPrompt.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/ca.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/ca.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/cs.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/cs.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/da.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/da.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/de.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/de.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/el.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/el.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/es.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/es.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/fi.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/fi.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/fr.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/fr.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/he.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/he.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/hr.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/hr.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/is.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/is.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/it.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/it.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/ja.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/ja.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/ko.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/ko.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/nb.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/nb.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/nl.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/nl.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/pl.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/pl.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/ro.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/ro.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/ru.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/ru.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/sk.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/sk.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/sl.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/sl.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/sv.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/sv.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/th.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/th.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/tr.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/tr.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/uk.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/uk.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/Base.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/Base.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/pt_BR.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/pt_BR.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/pt_PT.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/pt_PT.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/zh_CN.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/zh_CN.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/zh_TW.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Resources/zh_TW.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/Base.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/Base.lproj/SUUpdatePermissionPrompt.nib/keyedobjects.nib -------------------------------------------------------------------------------- /Frameworks/Sparkle/org.sparkle-project.InstallerStatus.xpc/Contents/MacOS/org.sparkle-project.InstallerStatus: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle/org.sparkle-project.InstallerStatus.xpc/Contents/MacOS/org.sparkle-project.InstallerStatus -------------------------------------------------------------------------------- /Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/MacOS/Updater: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/MacOS/Updater -------------------------------------------------------------------------------- /exportOptions.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | method 6 | mac-application 7 | 8 | 9 | -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/Base.lproj/SUUpdatePermissionPrompt.nib/keyedobjects-110000.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle.framework/Versions/A/Resources/Base.lproj/SUUpdatePermissionPrompt.nib/keyedobjects-110000.nib -------------------------------------------------------------------------------- /Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/org.sparkle-project.InstallerLauncher: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/org.sparkle-project.InstallerLauncher -------------------------------------------------------------------------------- /Frameworks/Sparkle/org.sparkle-project.InstallerConnection.xpc/Contents/MacOS/org.sparkle-project.InstallerConnection: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle/org.sparkle-project.InstallerConnection.xpc/Contents/MacOS/org.sparkle-project.InstallerConnection -------------------------------------------------------------------------------- /Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/SUStatus.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/SUStatus.nib -------------------------------------------------------------------------------- /Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/ca.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/ca.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/cs.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/cs.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/da.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/da.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/de.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/de.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/el.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/el.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/es.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/es.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/fi.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/fi.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/fr.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/fr.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/he.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/he.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/hr.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/hr.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/is.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/is.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/it.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/it.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/ja.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/ja.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/ko.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/ko.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/nb.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/nb.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/nl.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/nl.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/pl.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/pl.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/ro.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/ro.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/ru.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/ru.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/sk.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/sk.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/sl.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/sl.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/sv.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/sv.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/th.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/th.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/tr.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/tr.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/uk.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/uk.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/Base.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/Base.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/pt_BR.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/pt_BR.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/pt_PT.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/pt_PT.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/zh_CN.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/zh_CN.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/zh_TW.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tillhainbach/SwiftUISparkleTestApp/HEAD/Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Resources/zh_TW.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/ReleaseNotesColorStyle.css: -------------------------------------------------------------------------------- 1 | @media (prefers-color-scheme: dark) { 2 | html { 3 | color: white; 4 | background: transparent; 5 | } 6 | :link { 7 | color: #419CFF; 8 | } 9 | :link:active { 10 | color: #FF1919; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /SwiftUISparkleTestApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /SwiftUISparkleTestApp/My+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // My+Extensions.swift 3 | // SwiftUISparkleTestApp 4 | // 5 | // Created by Till Hainbach on 18.04.21. 6 | // 7 | 8 | import Foundation 9 | 10 | // disable default focus ring 11 | extension NSTextField { 12 | 13 | open override var focusRingType: NSFocusRingType { 14 | get { .none } 15 | set { } 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Build-Versioning-Scripts/set_version.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | NEW_VERSION=$1 4 | PRODUCT_NAME=$2 5 | INFO_PLIST=$PRODUCT_NAME/Info.plist 6 | 7 | echo "----" 8 | echo "Info.plist for target: ${INFO_PLIST}" 9 | 10 | /usr/libexec/Plistbuddy -c "Set :CFBundleShortVersionString ${NEW_VERSION}" "${INFO_PLIST}" 11 | 12 | echo "Version set to $NEW_VERSION" 13 | echo "----" 14 | exit 0 15 | -------------------------------------------------------------------------------- /get-sparkle-settings.sh: -------------------------------------------------------------------------------- 1 | SETTINGS="/Users/tillhainbach/Library/Containers/de.hainbach.SwiftUISparkleTestApp/Data/Library/Preferences/de.hainbach.SwiftUISparkleTestApp.plist" 2 | 3 | echo "$SETTINGS" 4 | 5 | 6 | hasLaunched=$(/usr/libexec/PlistBuddy \ 7 | -c "Print SUHasLaunchedBefore" \ 8 | "${SETTINGS}") 9 | 10 | #open $SETTINGS 11 | echo "has launched? $hasLaunched" 12 | 13 | -------------------------------------------------------------------------------- /Build-Versioning-Scripts/set_build_number.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | NEW_BUILD_NUMBER=$1 4 | PRODUCT_NAME=$2 5 | INFO_PLIST=$PRODUCT_NAME/Info.plist 6 | 7 | echo "----" 8 | echo "Info.plist for target: ${INFO_PLIST}" 9 | 10 | /usr/libexec/Plistbuddy -c "Set :CFBundleVersion ${NEW_BUILD_NUMBER}" "${INFO_PLIST}" 11 | 12 | echo "Build number set to $NEW_BUILD_NUMBER" 13 | echo "----" 14 | exit 0 15 | -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Headers/SUExport.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUExport.h 3 | // Sparkle 4 | // 5 | // Created by Jake Petroules on 2014-08-23. 6 | // Copyright (c) 2014 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #ifndef SUEXPORT_H 10 | #define SUEXPORT_H 11 | 12 | #ifdef BUILDING_SPARKLE 13 | #define SU_EXPORT __attribute__((visibility("default"))) 14 | #else 15 | #define SU_EXPORT 16 | #endif 17 | 18 | #endif 19 | -------------------------------------------------------------------------------- /Build-Versioning-Scripts/add-prelease-label.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | PRODUCT_NAME=$1 4 | INFO_PLIST=$1/Info.plist 5 | 6 | version=$(/usr/libexec/Plistbuddy \ 7 | -c "Print CFBundleShortVersionString" "${INFO_PLIST}") 8 | 9 | build_number=$(/usr/libexec/PlistBuddy \ 10 | -c "Print CFBundleVersion" "${INFO_PLIST}") 11 | 12 | prelease_version="${version}-alpha${build_number}" 13 | 14 | zsh $(dirname $(realpath $0))/set_version.sh $prelease_version $PRODUCT_NAME 15 | -------------------------------------------------------------------------------- /SwiftUISparkleTestApp/SwiftUISparkleTestApp.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.files.user-selected.read-only 8 | 9 | com.apple.security.network.client 10 | 11 | com.apple.security.network.server 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /Build-Versioning-Scripts/zip-archive.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | set -e 3 | 4 | PROJECT_NAME=$1 5 | PROJECT_DIR=$PROJECT_NAME 6 | INFOPLIST_FILE="Info.plist" 7 | 8 | CFBundleVersion=$(/usr/libexec/PlistBuddy \ 9 | -c "Print CFBundleVersion" "${PROJECT_DIR}/${INFOPLIST_FILE}") 10 | CFBundleShortVersionString=$(/usr/libexec/PlistBuddy \ 11 | -c "Print CFBundleShortVersionString" \ 12 | "${PROJECT_DIR}/${INFOPLIST_FILE}") 13 | 14 | ARCHIVE_NAME="$PROJECT_NAME.v$CFBundleShortVersionString.b$CFBundleVersion.zip" 15 | 16 | pushd Product/ 17 | zip -r "$ARCHIVE_NAME" $PROJECT_NAME.app 18 | popd 19 | -------------------------------------------------------------------------------- /SwiftUISparkleTestApp/InputValidationTextFieldStyle.swift: -------------------------------------------------------------------------------- 1 | // 2 | // InputValidationTextFieldStyle.swift 3 | // SwiftUISparkleTestApp 4 | // 5 | // Created by Till Hainbach on 18.04.21. 6 | // 7 | 8 | import SwiftUI 9 | 10 | /// Draws red or green rectangle around textfield based on input 11 | struct InputValidationTextFieldStyle: TextFieldStyle { 12 | @Binding var isValidInput: Bool 13 | 14 | func _body(configuration: TextField) -> some View { 15 | configuration 16 | .padding(5) 17 | .background( 18 | RoundedRectangle(cornerRadius: 5) 19 | .stroke(isValidInput ? Color.green : Color.red, lineWidth: 2) 20 | ) 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /SwiftUISparkleTestApp/SwiftUISparkleTestAppApp.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SwiftUISparkleTestAppApp.swift 3 | // SwiftUISparkleTestApp 4 | // 5 | // Created by Till Hainbach on 03.03.21. 6 | // 7 | 8 | import SwiftUI 9 | 10 | @main 11 | struct SwiftUISparkleTestAppApp: App { 12 | 13 | @StateObject var updater: SparkleAutoUpdater = SparkleAutoUpdater() 14 | @StateObject var keychainServiceModel = KeychainServiceModel() 15 | 16 | var body: some Scene { 17 | WindowGroup { 18 | ContentView() 19 | .environmentObject(updater) 20 | .environmentObject(keychainServiceModel) 21 | } 22 | .commands { 23 | UpdateCommand(updater: updater) 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Build-Versioning-Scripts/Increment_Build_Number.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | # To make executable, use: chmod u+x Build-Versioning-Scripts/Increment_Build_Number.sh 4 | # to locate your target's info.plist use 5 | PRODUCT_SETTINGS_PATH=$1/Info.plist 6 | 7 | echo "----" 8 | echo "Info.plist for target: ${PRODUCT_SETTINGS_PATH}" 9 | 10 | buildNum=$(/usr/libexec/Plistbuddy -c "Print CFBundleVersion" "${PRODUCT_SETTINGS_PATH}") 11 | echo "Current build #: $buildNum" 12 | 13 | if [ -z "$buildNum" ]; then 14 | echo "No build number found in $PRODUCT_SETTINGS_PATH" 15 | exit 2 16 | fi 17 | 18 | buildNum=$(expr $buildNum + 1) 19 | echo "Build # incremented to: $buildNum" 20 | /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNum" "$PRODUCT_SETTINGS_PATH" 21 | echo "----" 22 | exit 0 23 | -------------------------------------------------------------------------------- /appcast.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | SwiftUISparkleTestApp 5 | 6 | 0.1.1 7 | So., 21 März 2021 20:55:06 +0100 8 | 11.0 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/he.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- 1 | 2 | /* Class = "NSWindow"; title = "Software Update"; ObjectID = "5"; */ 3 | "5.title" = "עדכון תכנה"; 4 | 5 | /* Class = "NSTextFieldCell"; title = "Release Notes:"; ObjectID = "170"; */ 6 | "170.title" = "פרטי גרסה:"; 7 | 8 | /* Class = "NSButtonCell"; title = "Remind Me Later"; ObjectID = "171"; */ 9 | "171.title" = "הזכר לי מאוחר יותר"; 10 | 11 | /* Class = "NSButtonCell"; title = "Skip This Version"; ObjectID = "172"; */ 12 | "172.title" = "דלג על גרסה זו"; 13 | 14 | /* Class = "NSButtonCell"; title = "Install Update"; ObjectID = "173"; */ 15 | "173.title" = "התקן עדכון"; 16 | 17 | /* Class = "NSButtonCell"; title = "Automatically download and install updates in the future"; ObjectID = "175"; */ 18 | "175.title" = "הורד והתקן עדכונים אוטומטית גם בעתיד"; 19 | -------------------------------------------------------------------------------- /SwiftUISparkleTestAppUITests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- 1 | 2 | /* Class = "NSWindow"; title = "Software Update"; ObjectID = "5"; */ 3 | "5.title" = "Software Update"; 4 | 5 | /* Class = "NSTextFieldCell"; title = "Release Notes:"; ObjectID = "170"; */ 6 | "170.title" = "Release Notes:"; 7 | 8 | /* Class = "NSButtonCell"; title = "Remind Me Later"; ObjectID = "171"; */ 9 | "171.title" = "Remind Me Later"; 10 | 11 | /* Class = "NSButtonCell"; title = "Skip This Version"; ObjectID = "172"; */ 12 | "172.title" = "Skip This Version"; 13 | 14 | /* Class = "NSButtonCell"; title = "Install Update"; ObjectID = "173"; */ 15 | "173.title" = "Install Update"; 16 | 17 | /* Class = "NSButtonCell"; title = "Automatically download and install updates in the future"; ObjectID = "175"; */ 18 | "175.title" = "Automatically download and install updates in the future"; 19 | -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/hr.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- 1 | 2 | /* Class = "NSWindow"; title = "Software Update"; ObjectID = "5"; */ 3 | "5.title" = "Software Update"; 4 | 5 | /* Class = "NSTextFieldCell"; title = "Release Notes:"; ObjectID = "170"; */ 6 | "170.title" = "Release Notes:"; 7 | 8 | /* Class = "NSButtonCell"; title = "Remind Me Later"; ObjectID = "171"; */ 9 | "171.title" = "Remind Me Later"; 10 | 11 | /* Class = "NSButtonCell"; title = "Skip This Version"; ObjectID = "172"; */ 12 | "172.title" = "Skip This Version"; 13 | 14 | /* Class = "NSButtonCell"; title = "Install Update"; ObjectID = "173"; */ 15 | "173.title" = "Install Update"; 16 | 17 | /* Class = "NSButtonCell"; title = "Automatically download and install updates in the future"; ObjectID = "175"; */ 18 | "175.title" = "Automatically download and install updates in the future"; 19 | -------------------------------------------------------------------------------- /SparkleSwiftUIWrappers/UpdateCommand.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UpdateCommand.swift 3 | // SwiftUISparkleTestApp 4 | // 5 | // Created by Till Hainbach on 09.03.21. 6 | // 7 | 8 | import SwiftUI 9 | 10 | public struct UpdateCommand: Commands { 11 | 12 | @ObservedObject var updater: SparkleAutoUpdater 13 | 14 | struct BodyView: View { 15 | 16 | @ObservedObject var updater: SparkleAutoUpdater 17 | 18 | var body: some View { 19 | Button("Check for updates") { 20 | updater.checkForUpdates() 21 | } 22 | .disabled(!updater.canCheckForUpdates) 23 | .keyboardShortcut("U", modifiers: .command) 24 | } 25 | } 26 | 27 | public var body: some Commands { 28 | CommandGroup(after: .appInfo) { 29 | BodyView(updater: updater) 30 | } 31 | 32 | } 33 | } 34 | 35 | -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/ca.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- 1 | /* Class = "NSWindow"; title = "Software Update"; ObjectID = "5"; */ 2 | "5.title" = "Actualització del programari"; 3 | 4 | /* Class = "NSTextFieldCell"; title = "Release Notes:"; ObjectID = "170"; */ 5 | "170.title" = "Notes d'aquesta versió:"; 6 | 7 | /* Class = "NSButtonCell"; title = "Remind Me Later"; ObjectID = "171"; */ 8 | "171.title" = "Recorda-m'ho més tard"; 9 | 10 | /* Class = "NSButtonCell"; title = "Skip This Version"; ObjectID = "172"; */ 11 | "172.title" = "Omet aquesta versió"; 12 | 13 | /* Class = "NSButtonCell"; title = "Install Update"; ObjectID = "173"; */ 14 | "173.title" = "Instal·la l'actualització"; 15 | 16 | /* Class = "NSButtonCell"; title = "Automatically download and install updates in the future"; ObjectID = "175"; */ 17 | "175.title" = "Descarrega i instal·la les actualitzacions automàticament en el futur"; 18 | -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Headers/SUVersionDisplayProtocol.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUVersionDisplayProtocol.h 3 | // EyeTV 4 | // 5 | // Created by Uli Kusterer on 08.12.09. 6 | // Copyright 2009 Elgato Systems GmbH. All rights reserved. 7 | // 8 | 9 | #if __has_feature(modules) 10 | #if __has_warning("-Watimport-in-framework-header") 11 | #pragma clang diagnostic ignored "-Watimport-in-framework-header" 12 | #endif 13 | @import Foundation; 14 | #else 15 | #import 16 | #endif 17 | #import "SUExport.h" 18 | 19 | /*! 20 | Applies special display formatting to version numbers. 21 | */ 22 | @protocol SUVersionDisplay 23 | 24 | /*! 25 | Formats two version strings. 26 | 27 | Both versions are provided so that important distinguishing information 28 | can be displayed while also leaving out unnecessary/confusing parts. 29 | */ 30 | - (void)formatVersion:(NSString *_Nonnull*_Nonnull)inOutVersionA andVersion:(NSString *_Nonnull*_Nonnull)inOutVersionB; 31 | 32 | @end 33 | -------------------------------------------------------------------------------- /Build-Versioning-Scripts/get_release_asset_url.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # get_release_asset_url.sh 4 | # SwiftUISparklePrivate 5 | # 6 | # Created by Till Hainbach on 11.03.21. 7 | # 8 | 9 | set -e 10 | 11 | DEBUG=false 12 | 13 | REPO_NAME=$1 14 | VERSION_TAG=$2 15 | GITHUB_API='https://api.github.com' 16 | END_POINT='repos' 17 | CREDENTIALS=$(git credential-osxkeychain get << END 18 | host=github.com 19 | END 20 | ) 21 | USER=$(echo "$CREDENTIALS" | grep username | cut -f2 -d "=") 22 | TOKEN=$(echo "$CREDENTIALS" | grep password | cut -f2 -d "=") 23 | 24 | if $DEBUG; then 25 | echo "Using $TOKEN for $USER" 26 | fi 27 | 28 | 29 | 30 | API_CALL_URL="$GITHUB_API/$END_POINT/$USER/$REPO_NAME/releases/tags/$VERSION_TAG" 31 | 32 | if $DEBUG; then 33 | echo "Calling to $API_CALL_URL" 34 | fi 35 | 36 | response=$(curl -sH "Authorization: token $TOKEN" "$API_CALL_URL") 37 | asset_url=$(echo $response \ 38 | | grep -C3 "name.:.\+$REPO_NAME" \ 39 | | grep -w url | sed -E 's/[ \t]*"url": "(.*)",/\1/g' 40 | ) 41 | 42 | echo "$asset_url" 43 | -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Headers/SUVersionComparisonProtocol.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUVersionComparisonProtocol.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 12/21/07. 6 | // Copyright 2007 Andy Matuschak. All rights reserved. 7 | // 8 | 9 | #ifndef SUVERSIONCOMPARISONPROTOCOL_H 10 | #define SUVERSIONCOMPARISONPROTOCOL_H 11 | 12 | #if __has_feature(modules) 13 | #if __has_warning("-Watimport-in-framework-header") 14 | #pragma clang diagnostic ignored "-Watimport-in-framework-header" 15 | #endif 16 | @import Foundation; 17 | #else 18 | #import 19 | #endif 20 | #import "SUExport.h" 21 | 22 | NS_ASSUME_NONNULL_BEGIN 23 | 24 | /*! 25 | Provides version comparison facilities for Sparkle. 26 | */ 27 | @protocol SUVersionComparison 28 | 29 | /*! 30 | An abstract method to compare two version strings. 31 | 32 | Should return NSOrderedAscending if b > a, NSOrderedDescending if b < a, 33 | and NSOrderedSame if they are equivalent. 34 | */ 35 | - (NSComparisonResult)compareVersion:(NSString *)versionA toVersion:(NSString *)versionB; // *** MAY BE CALLED ON NON-MAIN THREAD! 36 | 37 | @end 38 | 39 | NS_ASSUME_NONNULL_END 40 | #endif 41 | -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Headers/SUAppcast.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUAppcast.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 3/12/06. 6 | // Copyright 2006 Andy Matuschak. All rights reserved. 7 | // 8 | 9 | #ifndef SUAPPCAST_H 10 | #define SUAPPCAST_H 11 | 12 | #if __has_feature(modules) 13 | #if __has_warning("-Watimport-in-framework-header") 14 | #pragma clang diagnostic ignored "-Watimport-in-framework-header" 15 | #endif 16 | @import Foundation; 17 | #else 18 | #import 19 | #endif 20 | #import "SUExport.h" 21 | 22 | NS_ASSUME_NONNULL_BEGIN 23 | 24 | @class SUAppcastItem; 25 | SU_EXPORT @interface SUAppcast : NSObject 26 | 27 | @property (copy, nullable) NSString *userAgentString; 28 | @property (copy, nullable) NSDictionary *httpHeaders; 29 | 30 | - (void)fetchAppcastFromURL:(NSURL *)url inBackground:(BOOL)bg completionBlock:(void (^)(NSError *_Nullable))err; 31 | - (SUAppcast *)copyWithoutDeltaUpdates; 32 | - (SUAppcast *)copyByFilteringItems:(BOOL (^)(SUAppcastItem *))filterBlock; 33 | 34 | @property (readonly, copy, nullable) NSArray *items; 35 | @end 36 | 37 | NS_ASSUME_NONNULL_END 38 | 39 | #endif 40 | -------------------------------------------------------------------------------- /SwiftUISparkleTestApp/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "mac", 5 | "scale" : "1x", 6 | "size" : "16x16" 7 | }, 8 | { 9 | "idiom" : "mac", 10 | "scale" : "2x", 11 | "size" : "16x16" 12 | }, 13 | { 14 | "idiom" : "mac", 15 | "scale" : "1x", 16 | "size" : "32x32" 17 | }, 18 | { 19 | "idiom" : "mac", 20 | "scale" : "2x", 21 | "size" : "32x32" 22 | }, 23 | { 24 | "idiom" : "mac", 25 | "scale" : "1x", 26 | "size" : "128x128" 27 | }, 28 | { 29 | "idiom" : "mac", 30 | "scale" : "2x", 31 | "size" : "128x128" 32 | }, 33 | { 34 | "idiom" : "mac", 35 | "scale" : "1x", 36 | "size" : "256x256" 37 | }, 38 | { 39 | "idiom" : "mac", 40 | "scale" : "2x", 41 | "size" : "256x256" 42 | }, 43 | { 44 | "idiom" : "mac", 45 | "scale" : "1x", 46 | "size" : "512x512" 47 | }, 48 | { 49 | "idiom" : "mac", 50 | "scale" : "2x", 51 | "size" : "512x512" 52 | } 53 | ], 54 | "info" : { 55 | "author" : "xcode", 56 | "version" : 1 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /SwiftUISparkleTestApp/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 0.1.0 19 | CFBundleVersion 20 | 1 21 | LSApplicationCategoryType 22 | public.app-category.developer-tools 23 | LSMinimumSystemVersion 24 | $(MACOSX_DEPLOYMENT_TARGET) 25 | SUFeedURL 26 | https://tillhainbach.github.io/SwiftUISparkleTestApp/appcast.xml 27 | SUPublicEDKey 28 | wgwpqsNI7GNLBxsAOr9C3YHC3zO0QwdgTUYze9DcNRE= 29 | 30 | 31 | -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Headers/SPUUpdatePermissionRequest.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUUpdatePermissionRequest.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 8/14/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #if __has_feature(modules) 10 | #if __has_warning("-Watimport-in-framework-header") 11 | #pragma clang diagnostic ignored "-Watimport-in-framework-header" 12 | #endif 13 | @import Foundation; 14 | #else 15 | #import 16 | #endif 17 | #import "SUExport.h" 18 | 19 | NS_ASSUME_NONNULL_BEGIN 20 | 21 | /*! 22 | This class represents information needed to make a permission request for checking updates. 23 | */ 24 | SU_EXPORT @interface SPUUpdatePermissionRequest : NSObject 25 | 26 | /*! 27 | Initializes a new update permission request instance. 28 | 29 | @param systemProfile The system profile information. 30 | */ 31 | - (instancetype)initWithSystemProfile:(NSArray *> *)systemProfile; 32 | 33 | /*! 34 | A read-only property for the user's system profile. 35 | */ 36 | @property (nonatomic, readonly) NSArray *> *systemProfile; 37 | 38 | @end 39 | 40 | NS_ASSUME_NONNULL_END 41 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | This is free and unencumbered software released into the public domain. 2 | 3 | Anyone is free to copy, modify, publish, use, compile, sell, or 4 | distribute this software, either in source code form or as a compiled 5 | binary, for any purpose, commercial or non-commercial, and by any 6 | means. 7 | 8 | In jurisdictions that recognize copyright laws, the author or authors 9 | of this software dedicate any and all copyright interest in the 10 | software to the public domain. We make this dedication for the benefit 11 | of the public at large and to the detriment of our heirs and 12 | successors. We intend this dedication to be an overt act of 13 | relinquishment in perpetuity of all present and future rights to this 14 | software under copyright law. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 19 | IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 | OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | OTHER DEALINGS IN THE SOFTWARE. 23 | 24 | For more information, please refer to 25 | -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Headers/SPUStandardUserDriver.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUStandardUserDriver.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 2/14/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #if __has_feature(modules) 10 | #if __has_warning("-Watimport-in-framework-header") 11 | #pragma clang diagnostic ignored "-Watimport-in-framework-header" 12 | #endif 13 | @import Cocoa; 14 | #else 15 | #import 16 | #endif 17 | #import "SPUUserDriver.h" 18 | #import "SUExport.h" 19 | 20 | NS_ASSUME_NONNULL_BEGIN 21 | 22 | @protocol SPUStandardUserDriverDelegate; 23 | 24 | /*! 25 | Sparkle's standard built-in user driver for updater interactions 26 | */ 27 | SU_EXPORT @interface SPUStandardUserDriver : NSObject 28 | 29 | /*! 30 | Initializes a Sparkle's standard user driver for user update interactions 31 | 32 | @param hostBundle The target bundle of the host that is being updated. 33 | @param delegate The delegate to this user driver. Pass nil if you don't want to provide one. 34 | */ 35 | - (instancetype)initWithHostBundle:(NSBundle *)hostBundle delegate:(nullable id)delegate; 36 | 37 | /*! 38 | * Enable or disable hideOnDeactivate for standard update window. 39 | */ 40 | @property (nonatomic) BOOL hideOnDeactivate; 41 | 42 | @end 43 | 44 | NS_ASSUME_NONNULL_END 45 | -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Headers/SPUUserDriverCoreComponent.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUUserDriverCoreComponent.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 3/4/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #if __has_feature(modules) 10 | #if __has_warning("-Watimport-in-framework-header") 11 | #pragma clang diagnostic ignored "-Watimport-in-framework-header" 12 | #endif 13 | @import Foundation; 14 | #else 15 | #import 16 | #endif 17 | #import "SPUStatusCompletionResults.h" 18 | #import "SUExport.h" 19 | 20 | @protocol SPUStandardUserDriverDelegate; 21 | 22 | SU_EXPORT @interface SPUUserDriverCoreComponent : NSObject 23 | 24 | - (void)registerInstallUpdateHandler:(void (^)(SPUInstallUpdateStatus))installUpdateHandler; 25 | - (void)installUpdateWithChoice:(SPUInstallUpdateStatus)choice; 26 | 27 | - (void)registerUpdateCheckStatusHandler:(void (^)(SPUUserInitiatedCheckStatus))updateCheckStatusCompletion; 28 | - (void)cancelUpdateCheckStatus; 29 | - (void)completeUpdateCheckStatus; 30 | 31 | - (void)registerDownloadStatusHandler:(void (^)(SPUDownloadUpdateStatus))downloadUpdateStatusCompletion; 32 | - (void)cancelDownloadStatus; 33 | - (void)completeDownloadStatus; 34 | 35 | - (void)registerAcknowledgement:(void (^)(void))acknowledgement; 36 | - (void)acceptAcknowledgement; 37 | 38 | - (void)dismissUpdateInstallation; 39 | 40 | @end 41 | -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.strings: -------------------------------------------------------------------------------- 1 | 2 | /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "43"; */ 3 | "43.title" = "Text Cell"; 4 | 5 | /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "45"; */ 6 | "45.title" = "Text Cell"; 7 | 8 | /* Class = "NSButtonCell"; title = "Check Automatically"; ObjectID = "176"; */ 9 | "176.title" = "Check Automatically"; 10 | 11 | /* Class = "NSButtonCell"; title = "Don’t Check"; ObjectID = "177"; */ 12 | "177.title" = "Don’t Check"; 13 | 14 | /* Class = "NSTextFieldCell"; title = "Check for updates automatically?"; ObjectID = "178"; */ 15 | "178.title" = "Check for updates automatically?"; 16 | 17 | /* Class = "NSTextFieldCell"; title = "DO NOT LOCALIZE"; ObjectID = "179"; */ 18 | "179.title" = "DO NOT LOCALIZE"; 19 | 20 | /* Class = "NSButtonCell"; title = "Include anonymous system profile"; ObjectID = "180"; */ 21 | "180.title" = "Include anonymous system profile"; 22 | 23 | /* Class = "NSTextFieldCell"; title = "Anonymous system profile information is used to help us plan future development work. Please contact us if you have any questions about this.\n\nThis is the information that would be sent:"; ObjectID = "183"; */ 24 | "183.title" = "Anonymous system profile information is used to help us plan future development work. Please contact us if you have any questions about this.\n\nThis is the information that would be sent:"; 25 | -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/hr.lproj/SUUpdatePermissionPrompt.strings: -------------------------------------------------------------------------------- 1 | 2 | /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "43"; */ 3 | "43.title" = "Text Cell"; 4 | 5 | /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "45"; */ 6 | "45.title" = "Text Cell"; 7 | 8 | /* Class = "NSButtonCell"; title = "Check Automatically"; ObjectID = "176"; */ 9 | "176.title" = "Check Automatically"; 10 | 11 | /* Class = "NSButtonCell"; title = "Don’t Check"; ObjectID = "177"; */ 12 | "177.title" = "Don’t Check"; 13 | 14 | /* Class = "NSTextFieldCell"; title = "Check for updates automatically?"; ObjectID = "178"; */ 15 | "178.title" = "Check for updates automatically?"; 16 | 17 | /* Class = "NSTextFieldCell"; title = "DO NOT LOCALIZE"; ObjectID = "179"; */ 18 | "179.title" = "DO NOT LOCALIZE"; 19 | 20 | /* Class = "NSButtonCell"; title = "Include anonymous system profile"; ObjectID = "180"; */ 21 | "180.title" = "Include anonymous system profile"; 22 | 23 | /* Class = "NSTextFieldCell"; title = "Anonymous system profile information is used to help us plan future development work. Please contact us if you have any questions about this.\n\nThis is the information that would be sent:"; ObjectID = "183"; */ 24 | "183.title" = "Anonymous system profile information is used to help us plan future development work. Please contact us if you have any questions about this.\n\nThis is the information that would be sent:"; 25 | -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Headers/SPUStatusCompletionResults.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUStatusCompletionResults.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 2/29/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #ifndef SPUStatusCompletionResults_h 10 | #define SPUStatusCompletionResults_h 11 | 12 | #if __has_feature(modules) 13 | #if __has_warning("-Watimport-in-framework-header") 14 | #pragma clang diagnostic ignored "-Watimport-in-framework-header" 15 | #endif 16 | @import Foundation; 17 | #else 18 | #import 19 | #endif 20 | 21 | typedef NS_ENUM(NSUInteger, SPUUserInitiatedCheckStatus) { 22 | SPUUserInitiatedCheckDone, 23 | SPUUserInitiatedCheckCanceled 24 | }; 25 | 26 | typedef NS_ENUM(NSUInteger, SPUDownloadUpdateStatus) { 27 | SPUDownloadUpdateDone, 28 | SPUDownloadUpdateCanceled 29 | }; 30 | 31 | typedef NS_ENUM(NSUInteger, SPUInstallUpdateStatus) { 32 | SPUInstallUpdateNow, 33 | SPUInstallAndRelaunchUpdateNow, 34 | SPUDismissUpdateInstallation 35 | }; 36 | 37 | typedef NS_ENUM(NSInteger, SPUUpdateAlertChoice) { 38 | SPUInstallUpdateChoice, 39 | SPUInstallLaterChoice, 40 | SPUSkipThisVersionChoice 41 | }; 42 | 43 | typedef NS_ENUM(NSInteger, SPUInformationalUpdateAlertChoice) { 44 | SPUDismissInformationalNoticeChoice, 45 | SPUSkipThisInformationalVersionChoice 46 | }; 47 | 48 | #endif /* SPUStatusCompletionResults_h */ 49 | -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Headers/SUUpdatePermissionResponse.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUUpdatePermissionResponse.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 2/8/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #if __has_feature(modules) 10 | #if __has_warning("-Watimport-in-framework-header") 11 | #pragma clang diagnostic ignored "-Watimport-in-framework-header" 12 | #endif 13 | @import Foundation; 14 | #else 15 | #import 16 | #endif 17 | #import "SUExport.h" 18 | 19 | /*! 20 | This class represents a response for permission to check updates. 21 | */ 22 | SU_EXPORT @interface SUUpdatePermissionResponse : NSObject 23 | 24 | /*! 25 | Initializes a new update permission response instance. 26 | 27 | @param automaticUpdateChecks Flag for whether to allow automatic update checks. 28 | @param sendSystemProfile Flag for if system profile information should be sent to the server hosting the appcast. 29 | */ 30 | - (instancetype)initWithAutomaticUpdateChecks:(BOOL)automaticUpdateChecks sendSystemProfile:(BOOL)sendSystemProfile; 31 | 32 | /*! 33 | A read-only property indicating whether automatic update checks are allowed or not. 34 | */ 35 | @property (nonatomic, readonly) BOOL automaticUpdateChecks; 36 | 37 | /*! 38 | A read-only property indicating if system profile should be sent or not. 39 | */ 40 | @property (nonatomic, readonly) BOOL sendSystemProfile; 41 | 42 | @end 43 | -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Headers/SPUStandardUserDriverDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUStandardUserDriverDelegate.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 3/3/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #if __has_feature(modules) 10 | #if __has_warning("-Watimport-in-framework-header") 11 | #pragma clang diagnostic ignored "-Watimport-in-framework-header" 12 | #endif 13 | @import Foundation; 14 | #else 15 | #import 16 | #endif 17 | #import "SUExport.h" 18 | 19 | @protocol SUVersionDisplay; 20 | 21 | /*! 22 | A protocol for Sparkle's standard user driver's delegate 23 | 24 | This includes methods related to UI interactions 25 | */ 26 | SU_EXPORT @protocol SPUStandardUserDriverDelegate 27 | 28 | @optional 29 | 30 | /*! 31 | Called before showing a modal alert window, 32 | to give the opportunity to hide attached windows that may get in the way. 33 | */ 34 | - (void)standardUserDriverWillShowModalAlert; 35 | 36 | /*! 37 | Called after showing a modal alert window, 38 | to give the opportunity to hide attached windows that may get in the way. 39 | */ 40 | - (void)standardUserDriverDidShowModalAlert; 41 | 42 | /*! 43 | Returns an object that formats version numbers for display to the user. 44 | If you don't implement this method or return \c nil, 45 | the standard version formatter will be used. 46 | */ 47 | - (_Nullable id )standardUserDriverRequestsVersionDisplayer; 48 | 49 | @end 50 | -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Headers/Sparkle.h: -------------------------------------------------------------------------------- 1 | // 2 | // Sparkle.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 3/16/06. (Modified by CDHW on 23/12/07) 6 | // Copyright 2006 Andy Matuschak. All rights reserved. 7 | // 8 | 9 | #ifndef SPARKLE_H 10 | #define SPARKLE_H 11 | 12 | // This list should include the shared headers. It doesn't matter if some of them aren't shared (unless 13 | // there are name-space collisions) so we can list all of them to start with: 14 | 15 | #pragma clang diagnostic push 16 | // Do not use <> style includes since 2.x has two frameworks that need to work: Sparkle and SparkleCore 17 | #pragma clang diagnostic ignored "-Wquoted-include-in-framework-header" 18 | 19 | #import "SUExport.h" 20 | #import "SUAppcast.h" 21 | #import "SUAppcastItem.h" 22 | #import "SUStandardVersionComparator.h" 23 | #import "SPUUpdater.h" 24 | #import "SPUUpdaterDelegate.h" 25 | #import "SPUUpdaterSettings.h" 26 | #import "SPUStandardUpdaterController.h" 27 | #import "SUVersionComparisonProtocol.h" 28 | #import "SUVersionDisplayProtocol.h" 29 | #import "SUErrors.h" 30 | #import "SPUUpdatePermissionRequest.h" 31 | #import "SUUpdatePermissionResponse.h" 32 | #import "SPUUserDriver.h" 33 | #import "SPUStandardUserDriver.h" 34 | #import "SPUStandardUserDriverDelegate.h" 35 | #import "SPUUserDriverCoreComponent.h" 36 | #import "SPUDownloadData.h" 37 | 38 | #import "SUUpdater.h" // deprecated 39 | #import "SUUpdaterDelegate.h" // deprecated 40 | 41 | #pragma clang diagnostic pop 42 | 43 | #endif 44 | -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Headers/SPUDownloadData.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUDownloadData.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 8/10/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #if __has_feature(modules) 10 | #if __has_warning("-Watimport-in-framework-header") 11 | #pragma clang diagnostic ignored "-Watimport-in-framework-header" 12 | #endif 13 | @import Foundation; 14 | #else 15 | #import 16 | #endif 17 | #import "SUExport.h" 18 | 19 | NS_ASSUME_NONNULL_BEGIN 20 | 21 | /*! 22 | * A class for containing downloaded data along with some information about it. 23 | */ 24 | SU_EXPORT @interface SPUDownloadData : NSObject 25 | 26 | - (instancetype)initWithData:(NSData *)data URL:(NSURL *)URL textEncodingName:(NSString * _Nullable)textEncodingName MIMEType:(NSString * _Nullable)MIMEType; 27 | 28 | /*! 29 | * The raw data that was downloaded. 30 | */ 31 | @property (nonatomic, readonly) NSData *data; 32 | 33 | /*! 34 | * The URL that was fetched from. 35 | * 36 | * This may be different from the URL in the request if there were redirects involved. 37 | */ 38 | @property (nonatomic, readonly, copy) NSURL *URL; 39 | 40 | /*! 41 | * The IANA charset encoding name if available. Eg: "utf-8" 42 | */ 43 | @property (nonatomic, readonly, nullable, copy) NSString *textEncodingName; 44 | 45 | /*! 46 | * The MIME type if available. Eg: "text/plain" 47 | */ 48 | @property (nonatomic, readonly, nullable, copy) NSString *MIMEType; 49 | 50 | @end 51 | 52 | NS_ASSUME_NONNULL_END 53 | -------------------------------------------------------------------------------- /Build-Versioning-Scripts/publish-app.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # publish-app.sh 4 | # SwiftUISparkleTestApp 5 | # 6 | # Created by Till Hainbach on 10.03.21. 7 | # 8 | 9 | function header { 10 | echo "\n$(tput bold)*** $1 ***$(tput sgr0)\n" 11 | } 12 | set -e 13 | #set -x 14 | header "Uploading Release to Github" 15 | 16 | PROJECT_NAME=$1 17 | 18 | BUILD_NUMBER=$(/usr/libexec/PlistBuddy \ 19 | -c "Print CFBundleVersion" "${PROJECT_NAME}/Info.plist") 20 | VERSION=$(/usr/libexec/PlistBuddy \ 21 | -c "Print CFBundleShortVersionString" \ 22 | "${PROJECT_NAME}/Info.plist") 23 | 24 | gh release create \ 25 | "v$VERSION" Product/$PROJECT_NAME.v$VERSION.b$BUILD_NUMBER.zip \ 26 | -t "v$VERSION" -n "" 27 | 28 | 29 | header "Retrieving Release Asset Id" 30 | URL=$(zsh $(dirname $(realpath $0))/get_release_asset_url.sh $PROJECT_NAME "v$VERSION") 31 | THE_URL="${URL//\//\\/}" 32 | 33 | header "Generating Appcast for Release" 34 | generate_appcast Product 35 | #echo "${THE_URL}" 36 | perl -pi -e "s/url=.+? /url=\"${THE_URL}\" /g" Product/appcast.xml 37 | 38 | set +e 39 | header "Publishing Appcast to gh-pages" 40 | # close xcode because gh-pages has no project file 41 | osascript -e 'quit app "Xcode"' 42 | CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD) 43 | 44 | git stash 45 | git checkout gh-pages 46 | cp Product/appcast.xml ./appcast.xml 47 | git add appcast.xml 48 | 49 | git commit -m "Update appcast for new release" 50 | 51 | git push --force origin gh-pages 52 | git checkout $CURRENT_BRANCH 53 | git stash pop 54 | 55 | # reopen xcode again 56 | open -a xcode.app *.xcode* 57 | 58 | -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | BuildMachineOSBuild 6 | 20D80 7 | CFBundleDevelopmentRegion 8 | en 9 | CFBundleExecutable 10 | Sparkle 11 | CFBundleIdentifier 12 | org.sparkle-project.Sparkle 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | Sparkle 17 | CFBundlePackageType 18 | FMWK 19 | CFBundleShortVersionString 20 | 2.0.0 1152-g2dd324d3 21 | CFBundleSignature 22 | ???? 23 | CFBundleSupportedPlatforms 24 | 25 | MacOSX 26 | 27 | CFBundleVersion 28 | 2.0.0 29 | DTCompiler 30 | com.apple.compilers.llvm.clang.1_0 31 | DTPlatformBuild 32 | 12D4e 33 | DTPlatformName 34 | macosx 35 | DTPlatformVersion 36 | 11.1 37 | DTSDKBuild 38 | 20C63 39 | DTSDKName 40 | macosx11.1 41 | DTXcode 42 | 1240 43 | DTXcodeBuild 44 | 12D4e 45 | LSMinimumSystemVersion 46 | 10.9 47 | 48 | 49 | -------------------------------------------------------------------------------- /Build-Versioning-Scripts/release.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | PROJECT_NAME=$1 4 | PROJECT_DIR=$PROJECT_NAME 5 | INFOPLIST_FILE="Info.plist" 6 | 7 | CFBundleVersion=$(/usr/libexec/PlistBuddy \ 8 | -c "Print CFBundleVersion" "${PROJECT_DIR}/${INFOPLIST_FILE}") 9 | CFBundleShortVersionString=$(/usr/libexec/PlistBuddy \ 10 | -c "Print CFBundleShortVersionString" \ 11 | "${PROJECT_DIR}/${INFOPLIST_FILE}") 12 | 13 | echo "----------" 14 | echo "Creating release $CFBundleShortVersionString.$CFBundleVersion for $PROJECT_NAME\n" 15 | rm -rf Archive/* 16 | rm -rf Product/* 17 | 18 | xcodebuild clean \ 19 | -project $PROJECT_NAME.xcodeproj \ 20 | -configuration Release \ 21 | -alltargets 22 | 23 | echo "\n\nArchiving $PROJECT_NAME.app\n" 24 | xcodebuild archive \ 25 | -project $PROJECT_NAME.xcodeproj \ 26 | -scheme $PROJECT_NAME \ 27 | -archivePath Archive/$PROJECT_NAME.xcarchive 28 | 29 | xcodebuild \ 30 | -exportArchive \ 31 | -archivePath Archive/$PROJECT_NAME.xcarchive \ 32 | -exportPath Product/ \ 33 | -exportOptionsPlist exportOptions.plist 34 | 35 | ARCHIVE_NAME="$PROJECT_NAME.v${CFBundleShortVersionString}.b${CFBundleVersion}.zip" 36 | 37 | 38 | echo "\n\nCreating release zip-Archive...\n" 39 | pushd Product/ 40 | zip -r "$ARCHIVE_NAME" $PROJECT_NAME.app 41 | popd 42 | 43 | echo "\n\nGenerating appcast...\n" 44 | generate_appcast Product 45 | 46 | URL="${GITHUB_URL}/${PROJECT_NAME}/releases/download/v${CFBundleShortVersionString}/${ARCHIVE_NAME}" 47 | THE_URL="${URL//\//\\/}" 48 | echo "${THE_URL}" 49 | perl -pi -e "s/url=.+? /url=\"${THE_URL}\" /g" Product/appcast.xml 50 | echo "----------" 51 | -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Headers/SUStandardVersionComparator.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUStandardVersionComparator.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 12/21/07. 6 | // Copyright 2007 Andy Matuschak. All rights reserved. 7 | // 8 | 9 | #ifndef SUSTANDARDVERSIONCOMPARATOR_H 10 | #define SUSTANDARDVERSIONCOMPARATOR_H 11 | 12 | #if __has_feature(modules) 13 | #if __has_warning("-Watimport-in-framework-header") 14 | #pragma clang diagnostic ignored "-Watimport-in-framework-header" 15 | #endif 16 | @import Foundation; 17 | #else 18 | #import 19 | #endif 20 | #import "SUExport.h" 21 | #import "SUVersionComparisonProtocol.h" 22 | 23 | NS_ASSUME_NONNULL_BEGIN 24 | 25 | /*! 26 | Sparkle's default version comparator. 27 | 28 | This comparator is adapted from MacPAD, by Kevin Ballard. 29 | It's "dumb" in that it does essentially string comparison, 30 | in components split by character type. 31 | */ 32 | SU_EXPORT @interface SUStandardVersionComparator : NSObject 33 | 34 | /*! 35 | Initializes a new instance of the standard version comparator. 36 | */ 37 | - (instancetype)init; 38 | 39 | /*! 40 | Returns a singleton instance of the comparator. 41 | 42 | It is usually preferred to alloc/init new a comparator instead. 43 | */ 44 | + (SUStandardVersionComparator *)defaultComparator; 45 | 46 | /*! 47 | Compares version strings through textual analysis. 48 | 49 | See the implementation for more details. 50 | */ 51 | - (NSComparisonResult)compareVersion:(NSString *)versionA toVersion:(NSString *)versionB; 52 | @end 53 | 54 | NS_ASSUME_NONNULL_END 55 | #endif 56 | -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Updater.app/Contents/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | BuildMachineOSBuild 6 | 20D80 7 | CFBundleDevelopmentRegion 8 | en 9 | CFBundleExecutable 10 | Updater 11 | CFBundleIdentifier 12 | org.sparkle-project.Sparkle.Updater 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | Updater 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 2.0.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleSupportedPlatforms 24 | 25 | MacOSX 26 | 27 | CFBundleVersion 28 | 2.0.0 29 | DTCompiler 30 | com.apple.compilers.llvm.clang.1_0 31 | DTPlatformBuild 32 | 12D4e 33 | DTPlatformName 34 | macosx 35 | DTPlatformVersion 36 | 11.1 37 | DTSDKBuild 38 | 20C63 39 | DTSDKName 40 | macosx11.1 41 | DTXcode 42 | 1240 43 | DTXcodeBuild 44 | 12D4e 45 | LSMinimumSystemVersion 46 | 10.9 47 | LSUIElement 48 | 1 49 | NSPrincipalClass 50 | NSApplication 51 | 52 | 53 | -------------------------------------------------------------------------------- /Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/MacOS/Updater.app/Contents/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | BuildMachineOSBuild 6 | 20D80 7 | CFBundleDevelopmentRegion 8 | en 9 | CFBundleExecutable 10 | Updater 11 | CFBundleIdentifier 12 | org.sparkle-project.Sparkle.Updater 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | Updater 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 2.0.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleSupportedPlatforms 24 | 25 | MacOSX 26 | 27 | CFBundleVersion 28 | 2.0.0 29 | DTCompiler 30 | com.apple.compilers.llvm.clang.1_0 31 | DTPlatformBuild 32 | 12D4e 33 | DTPlatformName 34 | macosx 35 | DTPlatformVersion 36 | 11.1 37 | DTSDKBuild 38 | 20C63 39 | DTSDKName 40 | macosx11.1 41 | DTXcode 42 | 1240 43 | DTXcodeBuild 44 | 12D4e 45 | LSMinimumSystemVersion 46 | 10.9 47 | LSUIElement 48 | 1 49 | NSPrincipalClass 50 | NSApplication 51 | 52 | 53 | -------------------------------------------------------------------------------- /Frameworks/Sparkle/org.sparkle-project.InstallerStatus.xpc/Contents/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | BuildMachineOSBuild 6 | 20D80 7 | CFBundleDevelopmentRegion 8 | en 9 | CFBundleExecutable 10 | org.sparkle-project.InstallerStatus 11 | CFBundleIdentifier 12 | org.sparkle-project.InstallerStatus 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | org.sparkle-project.InstallerStatus 17 | CFBundlePackageType 18 | XPC! 19 | CFBundleShortVersionString 20 | 2.0.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleSupportedPlatforms 24 | 25 | MacOSX 26 | 27 | CFBundleVersion 28 | 2.0.0 29 | DTCompiler 30 | com.apple.compilers.llvm.clang.1_0 31 | DTPlatformBuild 32 | 12D4e 33 | DTPlatformName 34 | macosx 35 | DTPlatformVersion 36 | 11.1 37 | DTSDKBuild 38 | 20C63 39 | DTSDKName 40 | macosx11.1 41 | DTXcode 42 | 1240 43 | DTXcodeBuild 44 | 12D4e 45 | LSMinimumSystemVersion 46 | 10.9 47 | NSHumanReadableCopyright 48 | Copyright © 2016 Sparkle Project. All rights reserved. 49 | XPCService 50 | 51 | ServiceType 52 | Application 53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /Frameworks/Sparkle/org.sparkle-project.InstallerConnection.xpc/Contents/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | BuildMachineOSBuild 6 | 20D80 7 | CFBundleDevelopmentRegion 8 | en 9 | CFBundleExecutable 10 | org.sparkle-project.InstallerConnection 11 | CFBundleIdentifier 12 | org.sparkle-project.InstallerConnection 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | org.sparkle-project.InstallerConnection 17 | CFBundlePackageType 18 | XPC! 19 | CFBundleShortVersionString 20 | 2.0.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleSupportedPlatforms 24 | 25 | MacOSX 26 | 27 | CFBundleVersion 28 | 2.0.0 29 | DTCompiler 30 | com.apple.compilers.llvm.clang.1_0 31 | DTPlatformBuild 32 | 12D4e 33 | DTPlatformName 34 | macosx 35 | DTPlatformVersion 36 | 11.1 37 | DTSDKBuild 38 | 20C63 39 | DTSDKName 40 | macosx11.1 41 | DTXcode 42 | 1240 43 | DTXcodeBuild 44 | 12D4e 45 | LSMinimumSystemVersion 46 | 10.9 47 | NSHumanReadableCopyright 48 | Copyright © 2016 Sparkle Project. All rights reserved. 49 | XPCService 50 | 51 | ServiceType 52 | Application 53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # NEW SwiftUI-Sparkle-Wrapper => [Sparkly](https://www.github.com/tillhainbach/Sparkly) 2 | 3 | This repo was more of a playground. I've since improved my understanding of Sparkle's Architecture and SwiftUI and am currently 4 | developing [Sparkly](https://www.github.com/tillhainbach/Sparkly) a light, combine-based wrapper for Sparkle. Feel free to check it how. 5 | 6 | This repo is archived... 7 | 8 | # SwiftUISparkleTestApp 9 | 10 | Sample Project for using Sparkle in a SwiftUI-lifecycle app. It includes a 11 | wrapper class around SPUUpdater which can be interacted from within SwiftUI. 12 | 13 | ## How it works 14 | 15 | Since the Sparkle framework originates from the `delegate`-era, we need to create a bridge between Sparkles-delegates+callbacks and SwiftUI's `Binding`-toSomething 16 | philosophy. This is where the wrapper class `SparkleAutoUpdater` comes into play. 17 | It essentially provides a publisher for `SPUUpdater.canCheckForUpdates` to which any SwiftUI View can subscribe. In this sample repo, that's the case for the `UpdateCommand`-View. The wrapper class also subscribes to the `.applicationDidFinishLaunching`-Notification and will start the `SPUUpdater` after application launch. 18 | 19 | There is also a simple helpers class that you can use, if you are planning to update from releases within a private repo. The class will handle token validation and stores the token into the macOS keychain. 20 | 21 | ## Setup 22 | 23 | You can find a detailed step-by-step guide [here](./docs/step-by-step.md). 24 | 25 | ## Questions? 26 | 27 | You can open an [issue](https://github.com/tillhainbach/SwiftUISparkleTestApp/issues) and I'll try to help. 28 | 29 | ## References 30 | 31 | [Sparkle](https://sparkle-project.org) 32 | 33 | ## Licencse 34 | 35 | For Sparkle stuff (in Framework) see their [license](https://github.com/sparkle-project/Sparkle/blob/master/LICENSE) 36 | 37 | My stuff is licensed under [The Unlicense](./LICENSE). 38 | -------------------------------------------------------------------------------- /Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | BuildMachineOSBuild 6 | 20D80 7 | CFBundleDevelopmentRegion 8 | en 9 | CFBundleExecutable 10 | org.sparkle-project.InstallerLauncher 11 | CFBundleIdentifier 12 | org.sparkle-project.InstallerLauncher 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | org.sparkle-project.InstallerLauncher 17 | CFBundlePackageType 18 | XPC! 19 | CFBundleShortVersionString 20 | 2.0.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleSupportedPlatforms 24 | 25 | MacOSX 26 | 27 | CFBundleVersion 28 | 2.0.0 29 | DTCompiler 30 | com.apple.compilers.llvm.clang.1_0 31 | DTPlatformBuild 32 | 12D4e 33 | DTPlatformName 34 | macosx 35 | DTPlatformVersion 36 | 11.1 37 | DTSDKBuild 38 | 20C63 39 | DTSDKName 40 | macosx11.1 41 | DTXcode 42 | 1240 43 | DTXcodeBuild 44 | 12D4e 45 | LSMinimumSystemVersion 46 | 10.9 47 | NSHumanReadableCopyright 48 | Copyright © 2016 Sparkle Project. All rights reserved. 49 | XPCService 50 | 51 | JoinExistingSession 52 | 53 | ServiceType 54 | Application 55 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Headers/SPUUpdaterSettings.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUUpdaterSettings.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 3/27/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #if __has_feature(modules) 10 | #if __has_warning("-Watimport-in-framework-header") 11 | #pragma clang diagnostic ignored "-Watimport-in-framework-header" 12 | #endif 13 | @import Foundation; 14 | #else 15 | #import 16 | #endif 17 | #import "SUExport.h" 18 | 19 | NS_ASSUME_NONNULL_BEGIN 20 | 21 | /*! 22 | This class can be used for reading certain updater settings. 23 | 24 | It retrieves the settings by first looking into the host's user defaults. 25 | If the setting is not found in there, then the host's Info.plist file is looked at. 26 | */ 27 | SU_EXPORT @interface SPUUpdaterSettings : NSObject 28 | 29 | - (instancetype)initWithHostBundle:(NSBundle *)hostBundle; 30 | 31 | /*! 32 | * Indicates whether or not automatic update checks are enabled. 33 | */ 34 | @property (readonly, nonatomic) BOOL automaticallyChecksForUpdates; 35 | 36 | /*! 37 | * The regular update check interval. 38 | */ 39 | @property (readonly, nonatomic) NSTimeInterval updateCheckInterval; 40 | 41 | /*! 42 | * Indicates whether or not automatically downloading updates is allowed to be turned on by the user. 43 | */ 44 | @property (readonly, nonatomic) BOOL allowsAutomaticUpdates; 45 | 46 | /*! 47 | * Indicates whether or not automatically downloading updates is enabled by the user or developer. 48 | * 49 | * Note this does not indicate whether or not automatic downloading of updates is allowable. 50 | * See `-allowsAutomaticUpdates` property for that. 51 | */ 52 | @property (readonly, nonatomic) BOOL automaticallyDownloadsUpdates; 53 | 54 | /*! 55 | * Indicates whether or not anonymous system profile information is sent when checking for updates. 56 | */ 57 | @property (readonly, nonatomic) BOOL sendsSystemProfile; 58 | 59 | @end 60 | 61 | NS_ASSUME_NONNULL_END 62 | -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Headers/SUErrors.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUErrors.h 3 | // Sparkle 4 | // 5 | // Created by C.W. Betts on 10/13/14. 6 | // Copyright (c) 2014 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #ifndef SUERRORS_H 10 | #define SUERRORS_H 11 | 12 | #if __has_feature(modules) 13 | #if __has_warning("-Watimport-in-framework-header") 14 | #pragma clang diagnostic ignored "-Watimport-in-framework-header" 15 | #endif 16 | @import Foundation; 17 | #else 18 | #import 19 | #endif 20 | #import "SUExport.h" 21 | 22 | /** 23 | * Error domain used by Sparkle 24 | */ 25 | SU_EXPORT extern NSString *const SUSparkleErrorDomain; 26 | 27 | typedef NS_ENUM(OSStatus, SUError) { 28 | // Configuration phase errors 29 | SUNoPublicDSAFoundError = 0001, 30 | SUInsufficientSigningError = 0002, 31 | SUInsecureFeedURLError = 0003, 32 | SUInvalidFeedURLError = 0004, 33 | SUInvalidUpdaterError = 0005, 34 | SUInvalidHostBundleIdentifierError = 0006, 35 | SUInvalidHostVersionError = 0007, 36 | 37 | // Appcast phase errors. 38 | SUAppcastParseError = 1000, 39 | SUNoUpdateError = 1001, 40 | SUAppcastError = 1002, 41 | SURunningFromDiskImageError = 1003, 42 | SUResumeAppcastError = 1004, 43 | SURunningTranslocated = 1005, 44 | SUWebKitTerminationError = 1006, 45 | 46 | // Download phase errors. 47 | SUTemporaryDirectoryError = 2000, 48 | SUDownloadError = 2001, 49 | 50 | // Extraction phase errors. 51 | SUUnarchivingError = 3000, 52 | SUSignatureError = 3001, 53 | SUValidationError = 3002, 54 | 55 | // Installation phase errors. 56 | SUFileCopyFailure = 4000, 57 | SUAuthenticationFailure = 4001, 58 | SUMissingUpdateError = 4002, 59 | SUMissingInstallerToolError = 4003, 60 | SURelaunchError = 4004, 61 | SUInstallationError = 4005, 62 | SUDowngradeError = 4006, 63 | SUInstallationCanceledError = 4007, 64 | SUInstallationAuthorizeLaterError = 4008, 65 | SUNotAllowedInteractionError = 4009, 66 | SUAgentInvalidationError = 4010, 67 | 68 | // API misuse errors. 69 | SUIncorrectAPIUsageError = 5000 70 | }; 71 | 72 | #endif 73 | -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Headers/SUAppcastItem.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUAppcastItem.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 3/12/06. 6 | // Copyright 2006 Andy Matuschak. All rights reserved. 7 | // 8 | 9 | #ifndef SUAPPCASTITEM_H 10 | #define SUAPPCASTITEM_H 11 | 12 | #if __has_feature(modules) 13 | #if __has_warning("-Watimport-in-framework-header") 14 | #pragma clang diagnostic ignored "-Watimport-in-framework-header" 15 | #endif 16 | @import Foundation; 17 | #else 18 | #import 19 | #endif 20 | #import "SUExport.h" 21 | @class SUSignatures; 22 | 23 | SU_EXPORT @interface SUAppcastItem : NSObject 24 | @property (copy, readonly) NSString *title; 25 | @property (copy, readonly) NSString *dateString; 26 | @property (copy, readonly) NSDate *date; 27 | @property (copy, readonly) NSString *itemDescription; 28 | @property (strong, readonly) NSURL *releaseNotesURL; 29 | @property (strong, readonly) SUSignatures *signatures; 30 | @property (copy, readonly) NSString *minimumSystemVersion; 31 | @property (copy, readonly) NSString *maximumSystemVersion; 32 | @property (strong, readonly) NSURL *fileURL; 33 | @property (nonatomic, readonly) uint64_t contentLength; 34 | @property (copy, readonly) NSString *versionString; 35 | @property (copy, readonly) NSString *osString; 36 | @property (copy, readonly) NSString *displayVersionString; 37 | @property (copy, readonly) NSDictionary *deltaUpdates; 38 | @property (strong, readonly) NSURL *infoURL; 39 | @property (copy, readonly) NSNumber* phasedRolloutInterval; 40 | @property (nonatomic, copy, readonly) NSString *installationType; 41 | @property (copy, readonly) NSString *minimumAutoupdateVersion; 42 | 43 | // Initializes with data from a dictionary provided by the RSS class. 44 | - (instancetype)initWithDictionary:(NSDictionary *)dict; 45 | - (instancetype)initWithDictionary:(NSDictionary *)dict failureReason:(NSString **)error; 46 | - (instancetype)initWithDictionary:(NSDictionary *)dict relativeToURL:(NSURL *)appcastURL failureReason:(NSString **)error; 47 | 48 | @property (getter=isDeltaUpdate, readonly) BOOL deltaUpdate; 49 | @property (getter=isCriticalUpdate, readonly) BOOL criticalUpdate; 50 | @property (getter=isMacOsUpdate, readonly) BOOL macOsUpdate; 51 | @property (getter=isInformationOnlyUpdate, readonly) BOOL informationOnlyUpdate; 52 | 53 | // Returns the dictionary provided in initWithDictionary; this might be useful later for extensions. 54 | @property (readonly, copy) NSDictionary *propertiesDictionary; 55 | 56 | - (NSURL *)infoURL; 57 | 58 | @end 59 | 60 | #endif 61 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | ## User settings 6 | xcuserdata/ 7 | 8 | ## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) 9 | *.xcscmblueprint 10 | *.xccheckout 11 | 12 | ## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) 13 | build/ 14 | DerivedData/ 15 | *.moved-aside 16 | *.pbxuser 17 | !default.pbxuser 18 | *.mode1v3 19 | !default.mode1v3 20 | *.mode2v3 21 | !default.mode2v3 22 | *.perspectivev3 23 | !default.perspectivev3 24 | 25 | ## Obj-C/Swift specific 26 | *.hmap 27 | 28 | ## App packaging 29 | *.ipa 30 | *.dSYM.zip 31 | *.dSYM 32 | 33 | ## Playgrounds 34 | timeline.xctimeline 35 | playground.xcworkspace 36 | 37 | # Swift Package Manager 38 | # 39 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. 40 | # Packages/ 41 | # Package.pins 42 | # Package.resolved 43 | # *.xcodeproj 44 | # 45 | # Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata 46 | # hence it is not needed unless you have added a package configuration file to your project 47 | # .swiftpm 48 | 49 | .build/ 50 | 51 | # CocoaPods 52 | # 53 | # We recommend against adding the Pods directory to your .gitignore. However 54 | # you should judge for yourself, the pros and cons are mentioned at: 55 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 56 | # 57 | # Pods/ 58 | # 59 | # Add this line if you want to avoid checking in source code from the Xcode workspace 60 | # *.xcworkspace 61 | 62 | # Carthage 63 | # 64 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 65 | # Carthage/Checkouts 66 | 67 | Carthage/Build/ 68 | 69 | # Accio dependency management 70 | Dependencies/ 71 | .accio/ 72 | 73 | # fastlane 74 | # 75 | # It is recommended to not store the screenshots in the git repo. 76 | # Instead, use fastlane to re-generate the screenshots whenever they are needed. 77 | # For more information about the recommended setup visit: 78 | # https://docs.fastlane.tools/best-practices/source-control/#source-control 79 | 80 | fastlane/report.xml 81 | fastlane/Preview.html 82 | fastlane/screenshots/**/*.png 83 | fastlane/test_output 84 | 85 | # Code Injection 86 | # 87 | # After new code Injection tools there's a generated folder /iOSInjectionProject 88 | # https://github.com/johnno1962/injectionforxcode 89 | 90 | iOSInjectionProject/ 91 | 92 | # Build dirs 93 | Archive/* 94 | Product/* 95 | -------------------------------------------------------------------------------- /SwiftUISparkleTestApp/ContentView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentView.swift 3 | // SwiftUISparkleTestApp 4 | // 5 | // Created by Till Hainbach on 03.03.21. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct ContentView: View { 11 | @EnvironmentObject var updater: SparkleAutoUpdater 12 | @EnvironmentObject var keychainServiceModel: KeychainServiceModel 13 | 14 | @State private var keychainService = "" 15 | 16 | var body: some View { 17 | HStack { 18 | authorizeWithToken 19 | .padding() 20 | 21 | Divider() 22 | 23 | authorizeFromKeychain 24 | .padding() 25 | } 26 | .frame(minWidth: 500, minHeight: 400) 27 | 28 | } 29 | 30 | //MARK: - Sub Views 31 | private var authorizeWithToken: some View { 32 | VStack(alignment: .leading) { 33 | Text("Please Enter your GitHub Personal Token") 34 | TextField("Enter GitHub Personal Token", text: $keychainServiceModel.token) 35 | .textFieldStyle(InputValidationTextFieldStyle(isValidInput: $keychainServiceModel.isValidToken)) 36 | 37 | Button("Authorize Updater") { 38 | storeToken() 39 | updater.connectToGithub(with: keychainServiceModel.token) 40 | } 41 | .disabled(!keychainServiceModel.isValidToken) 42 | } 43 | } 44 | 45 | private var authorizeFromKeychain: some View { 46 | VStack(alignment: .leading) { 47 | Text("Enter Keychain Service for Github Token") 48 | TextField("Enter Keychain Service", text: $keychainService) 49 | .textFieldStyle(InputValidationTextFieldStyle(isValidInput: $keychainServiceModel.isValidToken)) 50 | Button("Get Token") { 51 | retrieveCredentialsAndAuthorize() 52 | } 53 | } 54 | } 55 | 56 | //MARK: - Private Methods 57 | private func storeToken() { 58 | let token = keychainServiceModel.token 59 | let credentials = KeychainServiceModel.Credentials(username: "My-Test-App", password: token) 60 | 61 | do { 62 | try keychainServiceModel.add(credentials) 63 | } catch { 64 | print("Could not store token: \(error.localizedDescription)") 65 | } 66 | 67 | } 68 | 69 | private func retrieveCredentialsAndAuthorize() { 70 | do { 71 | let credentials = try keychainServiceModel.retrieveCredentials(for: keychainService) 72 | keychainServiceModel.isValidToken = true 73 | updater.connectToGithub(with: credentials.password) 74 | } catch { 75 | print("\(error)") 76 | } 77 | } 78 | 79 | } 80 | 81 | //MARK: - Preview 82 | struct ContentView_Previews: PreviewProvider { 83 | static var previews: some View { 84 | ContentView() 85 | .environmentObject(SparkleAutoUpdater()) 86 | .environmentObject(KeychainServiceModel()) 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /Frameworks/Sparkle/org.sparkle-project.InstallerStatus.xpc/Contents/_CodeSignature/CodeResources: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | files 6 | 7 | files2 8 | 9 | rules 10 | 11 | ^Resources/ 12 | 13 | ^Resources/.*\.lproj/ 14 | 15 | optional 16 | 17 | weight 18 | 1000 19 | 20 | ^Resources/.*\.lproj/locversion.plist$ 21 | 22 | omit 23 | 24 | weight 25 | 1100 26 | 27 | ^Resources/Base\.lproj/ 28 | 29 | weight 30 | 1010 31 | 32 | ^version.plist$ 33 | 34 | 35 | rules2 36 | 37 | .*\.dSYM($|/) 38 | 39 | weight 40 | 11 41 | 42 | ^(.*/)?\.DS_Store$ 43 | 44 | omit 45 | 46 | weight 47 | 2000 48 | 49 | ^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/ 50 | 51 | nested 52 | 53 | weight 54 | 10 55 | 56 | ^.* 57 | 58 | ^Info\.plist$ 59 | 60 | omit 61 | 62 | weight 63 | 20 64 | 65 | ^PkgInfo$ 66 | 67 | omit 68 | 69 | weight 70 | 20 71 | 72 | ^Resources/ 73 | 74 | weight 75 | 20 76 | 77 | ^Resources/.*\.lproj/ 78 | 79 | optional 80 | 81 | weight 82 | 1000 83 | 84 | ^Resources/.*\.lproj/locversion.plist$ 85 | 86 | omit 87 | 88 | weight 89 | 1100 90 | 91 | ^Resources/Base\.lproj/ 92 | 93 | weight 94 | 1010 95 | 96 | ^[^/]+$ 97 | 98 | nested 99 | 100 | weight 101 | 10 102 | 103 | ^embedded\.provisionprofile$ 104 | 105 | weight 106 | 20 107 | 108 | ^version\.plist$ 109 | 110 | weight 111 | 20 112 | 113 | 114 | 115 | 116 | -------------------------------------------------------------------------------- /Frameworks/Sparkle/org.sparkle-project.InstallerConnection.xpc/Contents/_CodeSignature/CodeResources: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | files 6 | 7 | files2 8 | 9 | rules 10 | 11 | ^Resources/ 12 | 13 | ^Resources/.*\.lproj/ 14 | 15 | optional 16 | 17 | weight 18 | 1000 19 | 20 | ^Resources/.*\.lproj/locversion.plist$ 21 | 22 | omit 23 | 24 | weight 25 | 1100 26 | 27 | ^Resources/Base\.lproj/ 28 | 29 | weight 30 | 1010 31 | 32 | ^version.plist$ 33 | 34 | 35 | rules2 36 | 37 | .*\.dSYM($|/) 38 | 39 | weight 40 | 11 41 | 42 | ^(.*/)?\.DS_Store$ 43 | 44 | omit 45 | 46 | weight 47 | 2000 48 | 49 | ^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/ 50 | 51 | nested 52 | 53 | weight 54 | 10 55 | 56 | ^.* 57 | 58 | ^Info\.plist$ 59 | 60 | omit 61 | 62 | weight 63 | 20 64 | 65 | ^PkgInfo$ 66 | 67 | omit 68 | 69 | weight 70 | 20 71 | 72 | ^Resources/ 73 | 74 | weight 75 | 20 76 | 77 | ^Resources/.*\.lproj/ 78 | 79 | optional 80 | 81 | weight 82 | 1000 83 | 84 | ^Resources/.*\.lproj/locversion.plist$ 85 | 86 | omit 87 | 88 | weight 89 | 1100 90 | 91 | ^Resources/Base\.lproj/ 92 | 93 | weight 94 | 1010 95 | 96 | ^[^/]+$ 97 | 98 | nested 99 | 100 | weight 101 | 10 102 | 103 | ^embedded\.provisionprofile$ 104 | 105 | weight 106 | 20 107 | 108 | ^version\.plist$ 109 | 110 | weight 111 | 20 112 | 113 | 114 | 115 | 116 | -------------------------------------------------------------------------------- /SwiftUISparkleTestAppUITests/SwiftUISparkleTestAppUITests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SwiftUISparkleTestAppUITests.swift 3 | // SwiftUISparkleTestAppUITests 4 | // 5 | // Created by Till Hainbach on 16.03.21. 6 | // 7 | 8 | import XCTest 9 | 10 | class SwiftUISparkleTestAppUITests: XCTestCase { 11 | 12 | let keychainService = "GitHub - https://api.github.com" 13 | 14 | override func setUpWithError() throws { 15 | // Put setup code here. This method is called before the invocation of each test method in the class. 16 | 17 | // In UI tests it is usually best to stop immediately when a failure occurs. 18 | continueAfterFailure = false 19 | 20 | // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. 21 | } 22 | 23 | override func tearDownWithError() throws { 24 | // Put teardown code here. This method is called after the invocation of each test method in the class. 25 | } 26 | 27 | func testPromptsForPermission() { 28 | let app = XCUIApplication() 29 | app.launch() 30 | 31 | sleep(5) 32 | app.terminate() 33 | 34 | let newapp = XCUIApplication() 35 | newapp.launch() 36 | 37 | let prompt = app.staticTexts["Check for updates automatically?"] 38 | let exists = NSPredicate(format: "exists == 1") 39 | 40 | expectation(for: exists, evaluatedWith: prompt, handler: nil) 41 | waitForExpectations(timeout: 5, handler: nil) 42 | } 43 | 44 | func testDidDownloadUpdateSuccess() throws { 45 | // UI tests must launch the application that they test. 46 | let app = XCUIApplication() 47 | app.launch() 48 | 49 | let enterGithubKeychainNameTextField = app.textFields["Enter Keychain Service"] 50 | enterGithubKeychainNameTextField.click() 51 | enterGithubKeychainNameTextField.typeText(keychainService) 52 | 53 | let authorizeUpdaterButton = app.buttons["Get Token"] 54 | authorizeUpdaterButton.click() 55 | 56 | let menuBarsQuery = app.menuBars 57 | menuBarsQuery.menuBarItems["SwiftUISparkleTestApp"].click() 58 | menuBarsQuery.menuItems["Check for updates"].click() 59 | let sudialogWindow = app.dialogs["SUUpdateAlert"] 60 | sudialogWindow.buttons["Install Update"].click() 61 | 62 | let sustatusWindow = app.windows["SUStatus"] 63 | 64 | let label = sustatusWindow.staticTexts["Ready to Install"] 65 | let button = sustatusWindow.buttons["Install and Relaunch"] 66 | let exists = NSPredicate(format: "exists == 1") 67 | 68 | expectation(for: exists, evaluatedWith: label, handler: nil) 69 | expectation(for: exists, evaluatedWith: button, handler: nil) 70 | waitForExpectations(timeout: 5, handler: nil) 71 | 72 | } 73 | 74 | } 75 | -------------------------------------------------------------------------------- /Frameworks/Sparkle/org.sparkle-project.InstallerLauncher.xpc/Contents/_CodeSignature/CodeResources: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | files 6 | 7 | files2 8 | 9 | MacOS/Autoupdate 10 | 11 | cdhash 12 | 13 | dUvxmhjqfmQVNCVYUwnFqo6OrkM= 14 | 15 | requirement 16 | cdhash H"3dfad3ecd465062f59563b08d7468b73e882c1ee" or cdhash H"754bf19a18ea7e64153425585309c5aa8e8eae43" or cdhash H"310bf3f085536ff9b436a51951ccf762c7abb92d" or cdhash H"c6a1c9a83523858ed3300cd7694fdb2dbb6d9591" 17 | 18 | MacOS/Updater.app 19 | 20 | cdhash 21 | 22 | F+q8A9weKeUuGO3j+Xu0v8zkA3s= 23 | 24 | requirement 25 | cdhash H"7d3b8ae675f5891874f5c32313a1be49b021ff83" or cdhash H"17eabc03dc1e29e52e18ede3f97bb4bfcce4037b" or cdhash H"46ea3a2f3727867372ab9c0f5af694d1023fd80d" or cdhash H"dcb9701d215d0e5eb26deb5bab10fc50be5351ed" 26 | 27 | 28 | rules 29 | 30 | ^Resources/ 31 | 32 | ^Resources/.*\.lproj/ 33 | 34 | optional 35 | 36 | weight 37 | 1000 38 | 39 | ^Resources/.*\.lproj/locversion.plist$ 40 | 41 | omit 42 | 43 | weight 44 | 1100 45 | 46 | ^Resources/Base\.lproj/ 47 | 48 | weight 49 | 1010 50 | 51 | ^version.plist$ 52 | 53 | 54 | rules2 55 | 56 | .*\.dSYM($|/) 57 | 58 | weight 59 | 11 60 | 61 | ^(.*/)?\.DS_Store$ 62 | 63 | omit 64 | 65 | weight 66 | 2000 67 | 68 | ^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/ 69 | 70 | nested 71 | 72 | weight 73 | 10 74 | 75 | ^.* 76 | 77 | ^Info\.plist$ 78 | 79 | omit 80 | 81 | weight 82 | 20 83 | 84 | ^PkgInfo$ 85 | 86 | omit 87 | 88 | weight 89 | 20 90 | 91 | ^Resources/ 92 | 93 | weight 94 | 20 95 | 96 | ^Resources/.*\.lproj/ 97 | 98 | optional 99 | 100 | weight 101 | 1000 102 | 103 | ^Resources/.*\.lproj/locversion.plist$ 104 | 105 | omit 106 | 107 | weight 108 | 1100 109 | 110 | ^Resources/Base\.lproj/ 111 | 112 | weight 113 | 1010 114 | 115 | ^[^/]+$ 116 | 117 | nested 118 | 119 | weight 120 | 10 121 | 122 | ^embedded\.provisionprofile$ 123 | 124 | weight 125 | 20 126 | 127 | ^version\.plist$ 128 | 129 | weight 130 | 20 131 | 132 | 133 | 134 | 135 | -------------------------------------------------------------------------------- /SwiftUISparkleTestApp.xcodeproj/xcshareddata/xcschemes/SwiftUISparkleTestApp.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 36 | 37 | 38 | 39 | 40 | 42 | 48 | 49 | 50 | 51 | 52 | 62 | 64 | 70 | 71 | 72 | 73 | 79 | 81 | 87 | 88 | 89 | 90 | 92 | 93 | 96 | 97 | 98 | -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Headers/SPUStandardUpdaterController.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUStandardUpdaterController.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 2/28/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #if __has_feature(modules) 10 | #if __has_warning("-Watimport-in-framework-header") 11 | #pragma clang diagnostic ignored "-Watimport-in-framework-header" 12 | #endif 13 | @import Cocoa; 14 | #else 15 | #import 16 | #endif 17 | #import "SUExport.h" 18 | 19 | NS_ASSUME_NONNULL_BEGIN 20 | 21 | @class SPUUpdater; 22 | @class SPUStandardUserDriver; 23 | @protocol SPUUserDriver, SPUUpdaterDelegate, SPUStandardUserDriverDelegate; 24 | 25 | /*! 26 | A controller class that instantiates a SPUUpdater and allows binding UI to it. 27 | 28 | This class can be instantiated in a nib or created using initWithUpdaterDelegate:userDriverDelegate:. The controller's updater targets the application's main bundle 29 | and uses Sparkle's standard user interface. Typically, this class is used by sticking it as a custom NSObject subclass in an Interface Builder nib (probably in MainMenu). 30 | 31 | The controller creates an SPUUpdater instance and allows hooking up the check for updates action and menu item validation. It also allows hooking 32 | up the updater's and user driver's delegates. 33 | 34 | This controller class may not be valuable to you if: 35 | * You want to control or defer the instantiation of an SPUUpdater, or don't want to be tied into a nib's instantiation, or don't want to use a nib 36 | * You want to target a bundle that's not the main bundle 37 | * You want to provide a custom user interface, or perhaps one that provides little-to-none 38 | * You don't want to use a convenience class that provides very little glue ;) 39 | 40 | */ 41 | SU_EXPORT @interface SPUStandardUpdaterController : NSObject 42 | 43 | /*! 44 | Interface builder outlet for the updater's delegate. 45 | 46 | This property should only be set using Interface Builder by creating a connection using the outlet 47 | */ 48 | @property (nonatomic, weak, nullable) IBOutlet id updaterDelegate; 49 | 50 | /*! 51 | Interface builder outlet for the user driver's delegate. 52 | 53 | This property should only be set using Interface Builder by creating a connection using the outlet 54 | */ 55 | @property (nonatomic, weak, nullable) IBOutlet id userDriverDelegate; 56 | 57 | /*! 58 | Accessible property for the updater. Some properties on the updater can be binded via KVO 59 | 60 | This is nil before being loaded from the nib. 61 | You may access this property after your application has finished launching, or after your window controller has finished loading. 62 | */ 63 | @property (nonatomic, readonly, nullable) SPUUpdater *updater; 64 | 65 | /*! 66 | Accessible property for the updater's user driver. 67 | 68 | This is nil before being loaded from the nib. 69 | You may access this property after your application has finished launching, or after your window controller has finished loading. 70 | */ 71 | @property (nonatomic, readonly, nullable) SPUStandardUserDriver *userDriver; 72 | 73 | /*! 74 | Use initWithUpdaterDelegate:userDriverDelegate: instead. 75 | */ 76 | - (instancetype)init NS_UNAVAILABLE; 77 | 78 | /*! 79 | Create a new SPUStandardUpdaterController programmatically. 80 | */ 81 | - (instancetype)initWithUpdaterDelegate:(nullable id)updaterDelegate userDriverDelegate:(nullable id)userDriverDelegate; 82 | 83 | /*! 84 | Explicitly checks for updates and displays a progress dialog while doing so. 85 | 86 | This method is meant for a main menu item. 87 | Connect any menu item to this action in Interface Builder, 88 | and Sparkle will check for updates and report back its findings verbosely 89 | when it is invoked. 90 | 91 | This action checks updates by invoking -[SPUUpdater checkForUpdates] 92 | */ 93 | - (IBAction)checkForUpdates:(id)sender; 94 | 95 | /*! 96 | Validates if the menu item for checkForUpdates: can be invoked or not 97 | 98 | This validates the menu item by checking -SPUUpdater.canCheckForUpdates 99 | */ 100 | - (BOOL)validateMenuItem:(NSMenuItem *)item; 101 | 102 | @end 103 | 104 | NS_ASSUME_NONNULL_END 105 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | .PHONY: check-version \ 2 | build \ 3 | archive \ 4 | check_build_number \ 5 | clean \ 6 | clean_build \ 7 | prerelease \ 8 | release \ 9 | install \ 10 | set_version \ 11 | set_build_number \ 12 | delete_release \ 13 | run \ 14 | gh-pages \ 15 | deploy \ 16 | zip-archive \ 17 | header \ 18 | uninstall \ 19 | publish \ 20 | uitest \ 21 | test-prompt 22 | 23 | PROJECT_NAME=SwiftUISparkleTestApp 24 | SCRIPT_DIR=Build-Versioning-Scripts 25 | INFO_PLIST=$(PROJECT_NAME)/Info.plist 26 | VERSION = 27 | 28 | gh-pages: 29 | -git stash 30 | git checkout --orphan gh-pages 31 | git rm -rf . 32 | @echo "#Hello to $(PROJECT_NAME)" >> index.md 33 | git checkout main .gitignore 34 | -git checkout main README.md index.md 35 | git add . 36 | git commit -m "init gh-pages" 37 | git push --set-upstream origin gh-pages 38 | git checkout main 39 | -git stash pop 40 | 41 | run: 42 | open /Applications/$(PROJECT_NAME).app 43 | 44 | build: 45 | make header HEADER="Building $(PROJECT_NAME) " 46 | xcodebuild clean \ 47 | -project $(PROJECT_NAME).xcodeproj \ 48 | -configuration Release \ 49 | -alltargets 50 | 51 | archive: build 52 | @make header HEADER="Archiving $(PROJECT_NAME)" 53 | xcodebuild archive \ 54 | -project $(PROJECT_NAME).xcodeproj \ 55 | -scheme $(PROJECT_NAME) \ 56 | -archivePath Archive/$(PROJECT_NAME).xcarchive 57 | 58 | xcodebuild \ 59 | -exportArchive \ 60 | -archivePath Archive/$(PROJECT_NAME).xcarchive \ 61 | -exportPath Product/ \ 62 | -exportOptionsPlist exportOptions.plist 63 | 64 | install: 65 | @make header HEADER="Installing $(PROJECT_NAME)" 66 | -make uninstall 67 | cp -rf Product/$(PROJECT_NAME).app /Applications/ 68 | 69 | uninstall: 70 | $(eval CFBundleIdentifier := $(shell /usr/libexec/PlistBuddy \ 71 | -c "Print CFBundleIdentifier" \ 72 | /Applications/$(PROJECT_NAME).app/Contents/Info.plist)) 73 | rm -rf /Applications/$(PROJECT_NAME).app 74 | rm -rf $(HOME)/Library/Containers/$(CFBundleIdentifier) 75 | rm -rf $(HOME)/Library/Containers/$(CFBundleIdentifier).* 76 | rm -rf $(HOME)/Library/Containers/$(CFBundleIdentifier)* 77 | 78 | clean: 79 | rm -rf Archive/* 80 | rm -rf Product/* 81 | 82 | clean_build: 83 | make clean 84 | make set_version VERSION=0.1.0 85 | make set_build_number BUILD_NUMBER=1 86 | make build 87 | make archive 88 | 89 | header: 90 | @echo "\n`tput bold`*** $(HEADER) ***`tput sgr0`\n" 91 | 92 | check-version: 93 | ifndef VERSION 94 | $(error VERSION is not set) 95 | endif 96 | 97 | check_build_number: 98 | ifndef BUILD_NUMBER 99 | $(error BUILD_NUMBER is not set) 100 | endif 101 | 102 | release: check-version 103 | make set_version VERSION=$(VERSION) 104 | $(SCRIPT_DIR)/Increment_Build_Number.sh $(PROJECT_NAME) 105 | zsh $(SCRIPT_DIR)/release.sh $(PROJECT_NAME) 106 | zsh $(SCRIPT_DIR)/publish-app.sh 107 | 108 | publish: check-version 109 | @make header HEADER="Publishing $(PROJECT_NAME)" 110 | zsh $(SCRIPT_DIR)/publish-app.sh $(PROJECT_NAME) 111 | 112 | deploy: check-version clean 113 | @make header HEADER="Deploying $(PROJECT_NAME)" 114 | make set_version VERSION=$(VERSION) 115 | $(SCRIPT_DIR)/Increment_Build_Number.sh $(PROJECT_NAME) 116 | make archive 117 | make zip-archive 118 | make publish 119 | @make header HEADER="DEPLOY SUCCEEDED" 120 | 121 | zip-archive: 122 | @make header HEADER="Creating Zip-Archive for $(PROJECT_NAME)" 123 | zsh $(SCRIPT_DIR)/zip-archive.sh $(PROJECT_NAME) 124 | @make header HEADER="ZIP SUCCEEDED" 125 | 126 | set_version: check-version 127 | zsh $(SCRIPT_DIR)/set_version.sh $(VERSION) $(PROJECT_NAME) 128 | 129 | set_build_number: check_build_number 130 | zsh $(SCRIPT_DIR)/set_build_number.sh $(BUILD_NUMBER) $(PROJECT_NAME) 131 | 132 | delete_release: 133 | -gh release delete "v$(VERSION)" -y 134 | -git push --delete origin "v$(VERSION)" 135 | -git tag -d "v$(VERSION)" 136 | 137 | uitest: 138 | make clean 139 | make set_version VERSION=0.1.0 140 | make set_build_number BUILD_NUMBER=1 141 | xcodebuild clean \ 142 | -project $(PROJECT_NAME).xcodeproj \ 143 | -scheme SwiftUISparkleTestApp \ 144 | test 145 | 146 | test-prompt: 147 | make clean 148 | rm -rf ~/Library/Containers/de.hainbach.$(PROJECT_NAME) 149 | xcodebuild clean \ 150 | -project $(PROJECT_NAME).xcodeproj \ 151 | -scheme $(PROJECT_NAME) \ 152 | test 153 | 154 | 155 | wipe-all: 156 | -make clean 157 | -make uninstall 158 | -rm -rf ~/Library/Containers/org.sparkle-project.* 159 | -------------------------------------------------------------------------------- /SwiftUISparkleTestApp/KeychainServiceModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // KeychainServiceModel.swift 3 | // SwiftUISparkleTestApp 4 | // 5 | // Created by Till Hainbach on 25.03.21. 6 | // 7 | 8 | import SwiftUI 9 | import Combine 10 | 11 | //MARK: - KeychainServiceModel 12 | public final class KeychainServiceModel: NSObject, ObservableObject { 13 | @Published var token: String = "" 14 | @Published var isValidToken: Bool = false 15 | 16 | static let GithubAPI = URL(string: "https://api.github.com/")! 17 | // There should always be a Bundle Identifier, if not, something is very fishy. 18 | static let service = Bundle.main.object(forInfoDictionaryKey: "CFBundleIdentifier") as! String 19 | 20 | public struct Credentials { 21 | var username: String 22 | var password: String 23 | } 24 | 25 | enum KeychainError: Error { 26 | case noPassword 27 | case unexpectedPasswordData 28 | case unhandledError(status: OSStatus) 29 | } 30 | 31 | 32 | //MARK: - Init 33 | public override init() { 34 | super.init() 35 | self.setUpValidationPipeline() 36 | 37 | } 38 | 39 | //MARK: - Public Methods 40 | /// Retrieve Credentials from keychain 41 | public func retrieveCredentials(for service: String? = nil) throws -> Credentials { 42 | let service = service ?? KeychainServiceModel.service 43 | 44 | let query: [String: Any] = [kSecClass as String: kSecClassGenericPassword, 45 | kSecAttrService as String: service, 46 | kSecMatchLimit as String: kSecMatchLimitOne, 47 | kSecReturnAttributes as String: true, 48 | kSecReturnData as String: true] 49 | 50 | var item: CFTypeRef? 51 | let status = SecItemCopyMatching(query as CFDictionary, &item) 52 | guard status != errSecItemNotFound else { throw KeychainError.noPassword } 53 | guard status == errSecSuccess else { throw KeychainError.unhandledError(status: status)} 54 | 55 | guard let existingItem = item as? [String : Any], 56 | let passwordData = existingItem[kSecValueData as String] as? Data, 57 | let password = String(data: passwordData, encoding: .utf8), 58 | let account = existingItem[kSecAttrAccount as String] as? String 59 | else { 60 | throw KeychainError.unexpectedPasswordData 61 | } 62 | let credentials = Credentials(username: account, password: password) 63 | 64 | return credentials 65 | } 66 | 67 | /// Add Credentials to keychain 68 | public func add(_ credentials: Credentials) throws { 69 | let account = credentials.username 70 | let password = credentials.password.data(using: .utf8)! 71 | 72 | let query: [String: Any] = [kSecClass as String: kSecClassGenericPassword, 73 | kSecAttrAccount as String: account, 74 | kSecAttrService as String: KeychainServiceModel.service, 75 | kSecValueData as String: password] 76 | 77 | let status = SecItemAdd(query as CFDictionary, nil) 78 | guard status == errSecSuccess else { throw KeychainError.unhandledError(status: status)} 79 | 80 | } 81 | 82 | //MARK: - Private Methods 83 | private func setUpValidationPipeline() { 84 | $token 85 | .debounce(for: 0.5, scheduler: RunLoop.main) 86 | .removeDuplicates() 87 | .flatMap { token in 88 | return self.validateToken(token) 89 | } 90 | .receive(on: DispatchQueue.main) 91 | .assign(to: &$isValidToken) 92 | } 93 | 94 | /// Validates response by cheking status code == 200 and token scope 95 | private func validateHTTPResponse(_ httpResponse: HTTPURLResponse) -> Bool { 96 | guard httpResponse.statusCode == 200, 97 | let scopes = httpResponse.value(forHTTPHeaderField: "x-oauth-scopes") else { 98 | return false 99 | } 100 | 101 | return scopes.contains("repo") 102 | } 103 | 104 | /// Validate Token by calling the Github API and checking the HTTPresponse 105 | private func validateToken(_ token: String) -> AnyPublisher { 106 | guard token.count == 40 else { 107 | return Just(false).eraseToAnyPublisher() 108 | } 109 | 110 | var request = URLRequest(url: Self.GithubAPI) 111 | request.httpMethod = "GET" 112 | request.addValue("Token \(token)", forHTTPHeaderField: "Authorization") 113 | 114 | return URLSession.shared.dataTaskPublisher(for: request) 115 | .tryMap() { element -> Bool in 116 | guard let httpResponse = element.response as? HTTPURLResponse else { 117 | return false 118 | } 119 | return self.validateHTTPResponse(httpResponse) 120 | } 121 | .replaceError(with: false) 122 | .eraseToAnyPublisher() 123 | } 124 | 125 | 126 | } 127 | 128 | -------------------------------------------------------------------------------- /SparkleSwiftUIWrappers/SparkleAutoUpdater.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SparkleAutoUpdater.swift 3 | // SwiftUISparkleTestApp 4 | // 5 | // Created by Till Hainbach on 07.03.21. 6 | // 7 | import Foundation 8 | import Sparkle 9 | import os 10 | import Combine 11 | 12 | @available(macOS 10.15, *) 13 | public final class SparkleAutoUpdater: NSObject, ObservableObject { 14 | @Published var canCheckForUpdates: Bool = false 15 | 16 | /// store SPUUPdater and SPUStandardUserDriver 17 | private var updater: SPUUpdater? 18 | private let standardUserDriver: SPUStandardUserDriver = SPUStandardUserDriver(hostBundle: Bundle.main, delegate: nil) 19 | 20 | private var cancellable: AnyCancellable? 21 | 22 | public init(userDriver: SPUUserDriver? = nil, delegate: SPUUpdaterDelegate? = nil) { 23 | super.init() 24 | setUpdater(userDriver: userDriver, delegate: delegate) 25 | } 26 | 27 | /// Check for updates 28 | public func checkForUpdates() { 29 | updater?.checkForUpdates() 30 | } 31 | 32 | private func setUpdater(userDriver: SPUUserDriver?, delegate: SPUUpdaterDelegate?) { 33 | let userDriver = userDriver ?? self 34 | updater = SPUUpdater(hostBundle: Bundle.main, applicationBundle: Bundle.main, userDriver: userDriver, delegate: delegate) 35 | // Subscribe to didFinishLaunchingNotification and start updater 36 | // when application finished launching 37 | cancellable = NotificationCenter.default.publisher(for: NSApplication.didFinishLaunchingNotification) 38 | .receive(on: DispatchQueue.main) 39 | .sink { [weak self] _ in self?.start() } 40 | } 41 | 42 | private func start() { 43 | do { 44 | try updater?.start() 45 | } catch { 46 | // Post Failure notification, present as an alert to the user or log error 47 | NotificationCenter.default.post(name: Self.didFailStartingUpdater, object: error) 48 | return 49 | } 50 | } 51 | 52 | } 53 | 54 | //MARK: - Extension: Notification.Name 55 | extension SparkleAutoUpdater { 56 | static let didFailStartingUpdater = Notification.Name("SPUUpdater-start-failed") 57 | } 58 | 59 | //MARK: - Extension HTTPHeaders 60 | extension SparkleAutoUpdater { 61 | public func setHTTPHeaders(_ value: String, for key: String) { 62 | if updater?.httpHeaders == nil { 63 | // init httpHeaders dict 64 | updater?.httpHeaders = [key: value] 65 | return 66 | } 67 | updater?.httpHeaders?[key] = value 68 | } 69 | } 70 | 71 | //MARK: - Extention: Authorization 72 | extension SparkleAutoUpdater { 73 | public func authorize(with token: String) { 74 | setHTTPHeaders("Token \(token)", for: "Authorization") 75 | } 76 | 77 | } 78 | 79 | //MARK: - Extension: GitHub Convenience 80 | extension SparkleAutoUpdater { 81 | public func connectToGithub(with token: String) { 82 | authorize(with: token) 83 | setHTTPHeaders("application/octet-stream", for: "Accept") 84 | } 85 | } 86 | 87 | //MARK: - Extension: Implemention of SPUUserDriver 88 | extension SparkleAutoUpdater: SPUUserDriver { 89 | 90 | public func showCanCheck(forUpdates canCheckForUpdates: Bool) { 91 | standardUserDriver.showCanCheck(forUpdates: canCheckForUpdates) 92 | self.canCheckForUpdates = canCheckForUpdates 93 | } 94 | 95 | public func show(_ request: SPUUpdatePermissionRequest, reply: @escaping (SUUpdatePermissionResponse) -> Void) { 96 | standardUserDriver.show(request, reply: reply) 97 | } 98 | 99 | public func showUserInitiatedUpdateCheck(completion updateCheckStatusCompletion: @escaping (SPUUserInitiatedCheckStatus) -> Void) { 100 | standardUserDriver.showUserInitiatedUpdateCheck(completion: updateCheckStatusCompletion) 101 | } 102 | 103 | public func dismissUserInitiatedUpdateCheck() { 104 | standardUserDriver.dismissUserInitiatedUpdateCheck() 105 | } 106 | 107 | public func showUpdateFound(with appcastItem: SUAppcastItem, userInitiated: Bool, reply: @escaping (SPUUpdateAlertChoice) -> Void) { 108 | standardUserDriver.showUpdateFound(with: appcastItem, userInitiated: userInitiated, reply: reply) 109 | } 110 | 111 | public func showDownloadedUpdateFound(with appcastItem: SUAppcastItem, userInitiated: Bool, reply: @escaping (SPUUpdateAlertChoice) -> Void) { 112 | standardUserDriver.showDownloadedUpdateFound(with: appcastItem, userInitiated: userInitiated, reply: reply) 113 | } 114 | 115 | public func showResumableUpdateFound(with appcastItem: SUAppcastItem, userInitiated: Bool, reply: @escaping (SPUInstallUpdateStatus) -> Void) { 116 | standardUserDriver.showResumableUpdateFound(with: appcastItem, userInitiated: userInitiated, reply: reply) 117 | } 118 | 119 | public func showInformationalUpdateFound(with appcastItem: SUAppcastItem, userInitiated: Bool, reply: @escaping (SPUInformationalUpdateAlertChoice) -> Void) { 120 | standardUserDriver.showInformationalUpdateFound(with: appcastItem, userInitiated: userInitiated, reply: reply) 121 | } 122 | 123 | public func showUpdateReleaseNotes(with downloadData: SPUDownloadData) { 124 | standardUserDriver.showUpdateReleaseNotes(with: downloadData) 125 | } 126 | 127 | public func showUpdateReleaseNotesFailedToDownloadWithError(_ error: Error) { 128 | standardUserDriver.showUpdateReleaseNotesFailedToDownloadWithError(error) 129 | } 130 | 131 | public func showUpdateNotFoundWithError(_ error: Error, acknowledgement: @escaping () -> Void) { 132 | standardUserDriver.showUpdateNotFoundWithError(error, acknowledgement: acknowledgement) 133 | } 134 | 135 | public func showUpdaterError(_ error: Error, acknowledgement: @escaping () -> Void) { 136 | standardUserDriver.showUpdaterError(error, acknowledgement: acknowledgement) 137 | } 138 | 139 | public func showDownloadInitiated(completion downloadUpdateStatusCompletion: @escaping (SPUDownloadUpdateStatus) -> Void) { 140 | standardUserDriver.showDownloadInitiated(completion: downloadUpdateStatusCompletion) 141 | } 142 | 143 | public func showDownloadDidReceiveExpectedContentLength(_ expectedContentLength: UInt64) { 144 | standardUserDriver.showDownloadDidReceiveExpectedContentLength(expectedContentLength) 145 | } 146 | 147 | public func showDownloadDidReceiveData(ofLength length: UInt64) { 148 | standardUserDriver.showDownloadDidReceiveData(ofLength: length) 149 | } 150 | 151 | public func showDownloadDidStartExtractingUpdate() { 152 | standardUserDriver.showDownloadDidStartExtractingUpdate() 153 | } 154 | 155 | public func showExtractionReceivedProgress(_ progress: Double) { 156 | standardUserDriver.showExtractionReceivedProgress(progress) 157 | } 158 | 159 | public func showReady(toInstallAndRelaunch installUpdateHandler: @escaping (SPUInstallUpdateStatus) -> Void) { 160 | standardUserDriver.showReady(toInstallAndRelaunch: installUpdateHandler) 161 | } 162 | 163 | public func showInstallingUpdate() { 164 | standardUserDriver.showInstallingUpdate() 165 | } 166 | 167 | public func showSendingTerminationSignal() { 168 | standardUserDriver.showSendingTerminationSignal() 169 | } 170 | 171 | public func showUpdateInstallationDidFinish(acknowledgement: @escaping () -> Void) { 172 | standardUserDriver.showUpdateInstallationDidFinish(acknowledgement: acknowledgement) 173 | } 174 | 175 | public func dismissUpdateInstallation() { 176 | standardUserDriver.dismissUpdateInstallation() 177 | } 178 | 179 | } 180 | -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Headers/SUUpdater.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUUpdater.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 1/4/06. 6 | // Copyright 2006 Andy Matuschak. All rights reserved. 7 | // 8 | 9 | #ifndef SUUPDATER_H 10 | #define SUUPDATER_H 11 | 12 | #if __has_feature(modules) 13 | #if __has_warning("-Watimport-in-framework-header") 14 | #pragma clang diagnostic ignored "-Watimport-in-framework-header" 15 | #endif 16 | @import Cocoa; 17 | #else 18 | #import 19 | #endif 20 | #import "SUExport.h" 21 | #import "SUVersionComparisonProtocol.h" 22 | #import "SUVersionDisplayProtocol.h" 23 | #import "SUUpdaterDelegate.h" 24 | 25 | @class SUAppcastItem, SUAppcast, NSMenuItem; 26 | 27 | @protocol SUUpdaterDelegate; 28 | 29 | /*! 30 | The main API in Sparkle for controlling the update mechanism. 31 | 32 | This class is used to configure the update paramters as well as manually 33 | and automatically schedule and control checks for updates. 34 | 35 | Note: This class is now deprecated and acts as a thin wrapper around SPUUpdater and SPUStandardUserDriver 36 | */ 37 | __deprecated_msg("Deprecated in Sparkle 2. Use SPUStandardUpdaterController or SPUUpdater instead") 38 | SU_EXPORT @interface SUUpdater : NSObject 39 | 40 | @property (unsafe_unretained, nonatomic) IBOutlet id delegate; 41 | 42 | /*! 43 | The shared updater for the main bundle. 44 | 45 | This is equivalent to passing [NSBundle mainBundle] to SUUpdater::updaterForBundle: 46 | */ 47 | + (SUUpdater *)sharedUpdater; 48 | 49 | /*! 50 | The shared updater for a specified bundle. 51 | If an updater has already been initialized for the provided bundle, that shared instance will be returned. 52 | */ 53 | + (SUUpdater *)updaterForBundle:(NSBundle *)bundle; 54 | 55 | /*! 56 | Designated initializer for SUUpdater. 57 | 58 | If an updater has already been initialized for the provided bundle, that shared instance will be returned. 59 | */ 60 | - (instancetype)initForBundle:(NSBundle *)bundle; 61 | 62 | /*! 63 | Explicitly checks for updates and displays a progress dialog while doing so. 64 | 65 | This method is meant for a main menu item. 66 | Connect any menu item to this action in Interface Builder, 67 | and Sparkle will check for updates and report back its findings verbosely 68 | when it is invoked. 69 | 70 | This will find updates that the user has opted into skipping. 71 | */ 72 | - (IBAction)checkForUpdates:(id)sender; 73 | 74 | /*! 75 | The menu item validation used for the -checkForUpdates: action 76 | */ 77 | - (BOOL)validateMenuItem:(NSMenuItem *)menuItem; 78 | 79 | /*! 80 | Checks for updates, but does not display any UI unless an update is found. 81 | 82 | This is meant for programmatically initating a check for updates. That is, 83 | it will display no UI unless it actually finds an update, in which case it 84 | proceeds as usual. 85 | 86 | If automatic downloading of updates it turned on and allowed, however, 87 | this will invoke that behavior, and if an update is found, it will be downloaded 88 | in the background silently and will be prepped for installation. 89 | 90 | This will not find updates that the user has opted into skipping. 91 | */ 92 | - (void)checkForUpdatesInBackground; 93 | 94 | /*! 95 | A property indicating whether or not to check for updates automatically. 96 | 97 | Setting this property will persist in the host bundle's user defaults. 98 | The update schedule cycle will be reset in a short delay after the property's new value is set. 99 | This is to allow reverting this property without kicking off a schedule change immediately 100 | */ 101 | @property (nonatomic) BOOL automaticallyChecksForUpdates; 102 | 103 | /*! 104 | A property indicating whether or not updates can be automatically downloaded in the background. 105 | 106 | Note that automatic downloading of updates can be disallowed by the developer. 107 | In this case, -automaticallyDownloadsUpdates will return NO regardless of how this property is set. 108 | 109 | Setting this property will persist in the host bundle's user defaults. 110 | */ 111 | @property (nonatomic) BOOL automaticallyDownloadsUpdates; 112 | 113 | /*! 114 | A property indicating the current automatic update check interval. 115 | 116 | Setting this property will persist in the host bundle's user defaults. 117 | The update schedule cycle will be reset in a short delay after the property's new value is set. 118 | This is to allow reverting this property without kicking off a schedule change immediately 119 | */ 120 | @property (nonatomic) NSTimeInterval updateCheckInterval; 121 | 122 | /*! 123 | Begins a "probing" check for updates which will not actually offer to 124 | update to that version. 125 | 126 | However, the delegate methods 127 | SUUpdaterDelegate::updater:didFindValidUpdate: and 128 | SUUpdaterDelegate::updaterDidNotFindUpdate: will be called, 129 | so you can use that information in your UI. 130 | 131 | Updates that have been skipped by the user will not be found. 132 | */ 133 | - (void)checkForUpdateInformation; 134 | 135 | /*! 136 | The URL of the appcast used to download update information. 137 | 138 | Setting this property will persist in the host bundle's user defaults. 139 | If you don't want persistence, you may want to consider instead implementing 140 | SUUpdaterDelegate::feedURLStringForUpdater: or SUUpdaterDelegate::feedParametersForUpdater:sendingSystemProfile: 141 | 142 | This property must be called on the main thread. 143 | */ 144 | @property (nonatomic, copy) NSURL *feedURL; 145 | 146 | /*! 147 | The host bundle that is being updated. 148 | */ 149 | @property (readonly, nonatomic) NSBundle *hostBundle; 150 | 151 | /*! 152 | The bundle this class (SUUpdater) is loaded into. 153 | */ 154 | @property (nonatomic, readonly) NSBundle *sparkleBundle; 155 | 156 | /*! 157 | The user agent used when checking for and downloading updates. 158 | 159 | The default implementation can be overrided. 160 | */ 161 | @property (nonatomic, copy) NSString *userAgentString; 162 | 163 | /*! 164 | The HTTP headers used when checking for and downloading updates. 165 | 166 | The keys of this dictionary are HTTP header fields (NSString) and values are corresponding values (NSString) 167 | */ 168 | @property (copy) NSDictionary *httpHeaders; 169 | 170 | /*! 171 | A property indicating whether or not the user's system profile information is sent when checking for updates. 172 | 173 | Setting this property will persist in the host bundle's user defaults. 174 | */ 175 | @property (nonatomic) BOOL sendsSystemProfile; 176 | 177 | /*! 178 | A property indicating the decryption password used for extracting updates shipped as Apple Disk Images (dmg) 179 | */ 180 | @property (nonatomic, copy) NSString *decryptionPassword; 181 | 182 | /*! 183 | Returns the date of last update check. 184 | 185 | \returns \c nil if no check has been performed. 186 | */ 187 | @property (nonatomic, readonly, copy) NSDate *lastUpdateCheckDate; 188 | 189 | /*! 190 | Appropriately schedules or cancels the update checking timer according to 191 | the preferences for time interval and automatic checks. 192 | 193 | This call does not change the date of the next check, 194 | but only the internal NSTimer. 195 | */ 196 | - (void)resetUpdateCycle; 197 | 198 | /*! 199 | A property indicating whether or not an update is in progress. 200 | 201 | Note this property is not indicative of whether or not user initiated updates can be performed. 202 | Use SUUpdater::validateMenuItem: for that instead. 203 | */ 204 | @property (nonatomic, readonly) BOOL updateInProgress; 205 | 206 | @end 207 | 208 | #endif 209 | -------------------------------------------------------------------------------- /docs/step-by-step.md: -------------------------------------------------------------------------------- 1 | # How to setup Sparkle with an SwiftUI-App 2 | 3 | ## Setting up the Xcode project 4 | 5 | Open Xcode and select a "Create new Xcode-Project". 6 | 7 | 8 | 9 | Select "macOS -> App -> Next". 10 | 11 | 12 | 13 | Enter your product name, team and bundle identifier and click next 14 | 15 | 16 | 17 | Choose a location where you want to store your project. Select "Create git repo..." and click "next". 18 | 19 | Go to the project settings: 20 | 21 | - "Signing & Capabilities" -> App Sandbox allow: 22 | - Incoming Connections 23 | - Outgoing Connections 24 | 25 | > Note: You can also use Sparkle's [XPC-Services](https://sparkle-project.org/documentation/sandboxing/) 26 | 27 | ## Sparkle 2.x Setup 28 | 29 | For a sandboxed app you need Sparkle 2.x (currently in beta). Unfortunately, there are no prebuilt binaries available 30 | so you have to build them yourself. 31 | 32 | ### Build Sparkle 2.x 33 | 34 | From Sparkle's [readme](https://github.com/sparkle-project/Sparkle/tree/2.x) and [docs](https://sparkle-project.org/documentation/): 35 | 36 | ```sh 37 | git clone https://github.com/sparkle-project/Sparkle 38 | 39 | cd Sparkle 40 | 41 | git checkout 2.x 42 | git submodule update --init --recursive 43 | 44 | make release 45 | ``` 46 | 47 | ### Add Sparkle Framework to XCode project 48 | 49 | Unpack the resulting `Sparkle-2.0.0.tar.xz` archive and drag'n'drop 50 | `Sparkle.framework` into your XCode project. 51 | Make sure you have "Copy items if needed" selected. 52 | 53 | Citing from [Sparkle-docs](https://sparkle-project.org/documentation/): 54 | 55 | > - Link the Sparkle framework to your app target: 56 | > - Drag Sparkle.framework into the Frameworks folder of your Xcode project. 57 | > - Be sure to check the “Copy items into the destination group’s folder” box in the sheet that appears. 58 | > - Make sure the box is checked for your app’s target in the sheet’s Add to targets list. 59 | > - Make sure the framework is copied into your app bundle: 60 | > - Click on your project in the Project Navigator. 61 | > - Click your target in the project editor. 62 | > - Click on the General tab. 63 | > - In Frameworks, Libraries, and Embedded Content section, change Sparkle.framework to Embed & Sign. 64 | 65 | ### Additional XPC-Services 66 | 67 | Sandboxed apps need some [additional setup](https://sparkle-project.org/documentation/sandboxing/): 68 | 69 | > In an extracted Sparkle-2.0.0.tar.xz distribution in the XPCServices/ directory you will notice: 70 | > -org.sparkle-project.InstallerConnection.xpc 71 | > 72 | > - org.sparkle-project.InstallerLauncher.xpc 73 | > - org.sparkle-project.InstallerStatus.xpc 74 | 75 | Add them to your project: 76 | 77 | > - Add the XPC Services to your app target: 78 | > - Drag the XPC Services you need into your Xcode project. 79 | > - Be sure to check the “Copy items into the destination group’s folder” box in the sheet that appears. 80 | > - Make sure the box is checked for your app’s target in the sheet’s Add to targets list 81 | > - Make sure the XPC Services are properly copied in your app bundle: 82 | > - Click on your project in the Project Navigator. 83 | > - Click your target in the project editor. 84 | > - Click on the Build Phases tab. 85 | > - Remove the XPC Services in the Copy Bundle Resources phase if Xcode auto-added them there. 86 | > - Click + to add a new Copy Files Phase. 87 | > - Choose XPC Services as the Destination. 88 | > - Drag the XPC Services you added from Xcode’s project navigator to the new Copy Files Phase. 89 | 90 | See additional note on [testing](https://sparkle-project.org/documentation/sandboxing/) 91 | 92 | ## Configure your App with Sparkle 93 | 94 | You need to create EdDSA (ed25519) signatures. 95 | 96 | > To prepare signing with EdDSA signatures: 97 | > 98 | > 1. First, run ./bin/generate_keys tool (from the Sparkle distribution root). This needs to be done only once. This tool will do two things: 99 | > - It will generate a private key and save it in your login Keychain on your Mac. You don’t need to do anything with it, but don’t lose access to your Mac’s Keychain. If you lose it, you may not be able to issue any new updates! 100 | > - It will print your public key to embed into applications. Copy that key (it’s a base64-encoded string). You can run ./bin/generate_keys again to see your public key at any time. 101 | > 2. Add your public key to your app’s `Info.plist` as a `SUPublicEDKey property. 102 | 103 | Additionally, add `SUFeedURL` to `Info.plist` and enter the url to your app's 104 | `appcast.xml`. If you want to use github pages with github releases, enter 105 | something like: 106 | 107 | ```xml 108 | SUFeedURL 109 | https://GithubUserName.github.io/YourRepoName/appcast.xml 110 | 111 | ``` 112 | 113 | ## Add SPUUpdater to SwiftUI 114 | 115 | You can use the [`SparkleAutoUpdater`](../SparkleSwiftUIWrappers/SparkleAutoUpdater.swift) or use it as guide on how to implement your own wrapper. 116 | 117 | ```Swift 118 | // App.swift 119 | 120 | ... 121 | 122 | @main 123 | struct SwiftUISparkleTestAppApp: App { 124 | 125 | @StateObject var updater = SparkleAutoUpdater() 126 | 127 | var body: some Scene { 128 | WindowGroup { 129 | ContentView() 130 | // you can pass the updater into the environment if you wish 131 | // to interact with it from your UI. 132 | .environmentObject(updater) 133 | } 134 | .commands { 135 | // register updater command in menu bar 136 | UpdateCommand(updater: updater) 137 | } 138 | } 139 | 140 | } 141 | 142 | 143 | ``` 144 | 145 | In `ContentView.swift` add a frame to make the app more visible on screen 146 | 147 | ```Swift 148 | //ContentView.swift 149 | 150 | struct ContentView: View { 151 | // 152 | @EnvironmentObject var updater: SparkleAutoUpdater 153 | ... 154 | var body: some View { 155 | Text("Hello, App with Sparkle! Press ⇧ + ⌘ + U to check for updates.") 156 | .padding() 157 | .frame(minWidth: 500, minHeight: 400) 158 | } 159 | 160 | } 161 | 162 | ``` 163 | 164 | You can now deploy the app: 165 | 166 | - `Product -> Archive -> Distribute App -> Copy App -> Next` 167 | 168 | Choose a location and launch the test app 169 | (or drag it into Applications and then launch it from there). 170 | Close the app and relaunch. 171 | Your should be prompt by Sparkle whether Sparkle should check for updates 172 | automatically. Agree by clicking the button or pressing `return`. 173 | 174 | ## Deploy with Github Releases and Sparkle 175 | 176 | Now let's deploy an update for the app. 177 | 178 | In `ContentView.swift` change the Text to: 179 | 180 | ```Swift 181 | //ContentView.swift 182 | 183 | ... 184 | 185 | Text("Hello, App Version 2.0 Updated using Sparkle") 186 | 187 | ... 188 | 189 | ``` 190 | 191 | In Target Settings under the `General`-Tab: 192 | 193 | - set `Version` to `2.0` 194 | - set `Build` to 2 195 | 196 | Deploy the app using the XCode Archive and then navigate to the directory. 197 | Archive the app-bundle into a Zip-file and then generate the appcast.xml: 198 | 199 | > Run generate_appcast tool from Sparkle’s distribution archive specifying the path to the folder with update archives. Allow it to access the Keychain if it asks for it (it’s needed to generate signatueres in the appcast). 200 | > 201 | > `$ ./bin/generate_appcast /path/to/your/updates_folder/` 202 | 203 | Upload the Archive to Github releases and set the tag to `2.0`. 204 | Modify the generated `appcast.xml` to point to your github release. 205 | 206 | ```xml 207 | 208 | ... 209 | 210 | 211 | 212 | ... 213 | ``` 214 | 215 | Copy/move the `appcast.xml` to your `gh-pages` branch or into the `docs` 216 | directory (or in more general where you deploy your github page from...) 217 | 218 | ### Check if all works! 219 | 220 | Launch your applications again. If not done automatically, you may check for 221 | updates by clicking on "Check for Updates" in the MenuBar (under your app's 222 | name). Fingers crossed, the Sparkle should detect that a need version is 223 | available and ask whether you want to proceed updating. Agree to the update and, 224 | hopefully, sparkle will ask you to `install and relaunch`. After the update, 225 | the app should restart and you will see the updated text view. 226 | 227 | ## CI/CD 228 | 229 | Check the build-scripts directory. There you'll find some helpers scripts that 230 | automate the build and deploy steps. 231 | 232 | In the `UITest` directory, you'll find a very basic uitest, which basically just 233 | checks if the user is prompted by Sparkle for their update preferences on the 234 | second start and if an update is downloaded successfully. 235 | 236 | ## References 237 | 238 | [Sparkle] (https://sparkle-project.org) 239 | -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Headers/SPUUpdater.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUUpdater.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 1/4/06. 6 | // Copyright 2006 Andy Matuschak. All rights reserved. 7 | // 8 | 9 | #if __has_feature(modules) 10 | #if __has_warning("-Watimport-in-framework-header") 11 | #pragma clang diagnostic ignored "-Watimport-in-framework-header" 12 | #endif 13 | @import Foundation; 14 | #else 15 | #import 16 | #endif 17 | #import "SUExport.h" 18 | #import "SPUUserDriver.h" 19 | 20 | NS_ASSUME_NONNULL_BEGIN 21 | 22 | @class SUAppcastItem, SUAppcast; 23 | 24 | @protocol SPUUpdaterDelegate; 25 | 26 | /*! 27 | The main API in Sparkle for controlling the update mechanism. 28 | 29 | This class is used to configure the update parameters as well as manually 30 | and automatically schedule and control checks for updates. 31 | */ 32 | SU_EXPORT @interface SPUUpdater : NSObject 33 | 34 | /*! 35 | Initializes a new SPUUpdater instance 36 | 37 | This does not start the updater. To start it, see -[SPUUpdater startUpdater:] 38 | 39 | Note that this is a normal initializer and doesn't implement the singleton pattern (i.e, instances aren't cached, so no surprises) 40 | This also means that updater instances can be deallocated, and that they will be torn down properly. 41 | 42 | Related: See SPUStandardUpdaterController which wraps a SPUUpdater instance and is suitable for instantiating in nib files 43 | 44 | @param hostBundle The bundle that should be targetted for updating. This must not be nil. 45 | @param applicationBundle The application bundle that should be relaunched and waited for termination. Usually this can be the same as hostBundle. This may differ when updating a plug-in or other non-application bundle. 46 | @param userDriver The user driver that Sparkle uses for user update interaction 47 | @param delegate The delegate for SPUUpdater. This may be nil. 48 | */ 49 | - (instancetype)initWithHostBundle:(NSBundle *)hostBundle applicationBundle:(NSBundle *)applicationBundle userDriver:(id )userDriver delegate:(id _Nullable)delegate; 50 | 51 | /*! 52 | Starts the updater. 53 | 54 | This method checks if Sparkle is configured properly. A valid feed URL should be set before this method is invoked. 55 | Other properties of this SPUUpdater instance can be set before this method is invoked as well, such as automatic update checks. 56 | 57 | If the configuration is valid, this method may bring up a permission prompt (if needed) for checking if the user wants automatic update checking. 58 | This method then starts the regular update cycle if automatic update checks are enabled. 59 | 60 | One of -checkForUpdates, -checkForUpdatesInBackground, or -checkForUpdateInformation can be invoked before starting the updater. 61 | This preschedules an update action before starting the updater. When the updater is started, the prescheduled action is immediately invoked. 62 | This may be useful for example if you want to check for updates right away without a permission prompt potentially showing. 63 | 64 | This must be called on the main thread. 65 | 66 | @param error The error that is populated if this method fails. Pass NULL if not interested in the error information. 67 | @return YES if the updater started otherwise NO with a populated error 68 | */ 69 | - (BOOL)startUpdater:(NSError * __autoreleasing *)error; 70 | 71 | /*! 72 | Checks for updates, and displays progress while doing so. 73 | 74 | This is meant for users initiating an update check. 75 | This may find a resumable update that has already been downloaded or has begun installing, or 76 | this may find a new update that can start to be downloaded if the user requests it. 77 | This will find updates that the user has opted into skipping. 78 | */ 79 | - (void)checkForUpdates; 80 | 81 | /*! 82 | Checks for updates, but does not display any UI unless an update is found. 83 | 84 | This is meant for programmatically initating a check for updates. 85 | That is, it will display no UI unless it finds an update, in which case it proceeds as usual. 86 | This will not find updates that the user has opted into skipping. 87 | 88 | Note if there is no resumable update found, and automated updating is turned on, 89 | the update will be downloaded in the background without disrupting the user. 90 | */ 91 | - (void)checkForUpdatesInBackground; 92 | 93 | /*! 94 | Begins a "probing" check for updates which will not actually offer to 95 | update to that version. 96 | 97 | However, the delegate methods 98 | SPUUpdaterDelegate::updater:didFindValidUpdate: and 99 | SPUUpdaterDelegate::updaterDidNotFindUpdate: will be called, 100 | so you can use that information in your UI. 101 | 102 | Updates that have been skipped by the user will not be found. 103 | */ 104 | - (void)checkForUpdateInformation; 105 | 106 | /*! 107 | A property indicating whether or not updates can be checked. 108 | 109 | This property is useful for determining whether update checks can be made programatically or by the user. 110 | An update check cannot be made when an on-going update check is in progress. 111 | 112 | Note this property does not reflect whether or not an update itself is in progress. For example, 113 | an update check can be done to check if there's an already started update that can be resumed. 114 | */ 115 | @property (nonatomic, readonly) BOOL canCheckForUpdates; 116 | 117 | /*! 118 | A property indicating whether or not to check for updates automatically. 119 | 120 | Setting this property will persist in the host bundle's user defaults. 121 | The update schedule cycle will be reset in a short delay after the property's new value is set. 122 | This is to allow reverting this property without kicking off a schedule change immediately 123 | */ 124 | @property (nonatomic) BOOL automaticallyChecksForUpdates; 125 | 126 | /*! 127 | A property indicating the current automatic update check interval. 128 | 129 | Setting this property will persist in the host bundle's user defaults. 130 | The update schedule cycle will be reset in a short delay after the property's new value is set. 131 | This is to allow reverting this property without kicking off a schedule change immediately 132 | */ 133 | @property (nonatomic) NSTimeInterval updateCheckInterval; 134 | 135 | /*! 136 | A property indicating whether or not updates can be automatically downloaded in the background. 137 | 138 | Note that the developer can disallow automatic downloading of updates from being enabled. 139 | In this case, -automaticallyDownloadsUpdates will return NO regardless of how this property is set. 140 | 141 | Setting this property will persist in the host bundle's user defaults. 142 | */ 143 | @property (nonatomic) BOOL automaticallyDownloadsUpdates; 144 | 145 | /*! 146 | The URL of the appcast used to download update information. 147 | 148 | If the updater's delegate implements -[SPUUpdaterDelegate feedURLStringForUpdater:], this will return that feed URL. 149 | Otherwise if the feed URL has been set before, the feed URL returned will be retrieved from the host bundle's user defaults. 150 | Otherwise the feed URL in the host bundle's Info.plist will be returned. 151 | If no feed URL can be retrieved, returns nil. 152 | 153 | This property must be called on the main thread; calls from background threads will return nil. 154 | */ 155 | @property (nonatomic, readonly) NSURL *feedURL; 156 | 157 | /*! 158 | Set the URL of the appcast used to download update information. Using this method is discouraged. 159 | 160 | Setting this property will persist in the host bundle's user defaults. 161 | To avoid this, you should consider instead implementing 162 | -[SPUUpdaterDelegate feedURLStringForUpdater:] or -[SPUUpdaterDelegate feedParametersForUpdater:sendingSystemProfile:] 163 | 164 | Passing nil will remove any feed URL that has been set in the host bundle's user defaults. 165 | 166 | This method must be called on the main thread; calls from background threads will have no effect. 167 | */ 168 | - (void)setFeedURL:(NSURL * _Nullable)feedURL; 169 | 170 | /*! 171 | The host bundle that is being updated. 172 | */ 173 | @property (nonatomic, readonly) NSBundle *hostBundle; 174 | 175 | /*! 176 | The bundle this class (SPUUpdater) is loaded into 177 | */ 178 | @property (nonatomic, readonly) NSBundle *sparkleBundle; 179 | 180 | /*! 181 | * The user agent used when checking for updates. 182 | * 183 | * The default implementation can be overrided. 184 | */ 185 | @property (nonatomic, copy) NSString *userAgentString; 186 | 187 | /*! 188 | The HTTP headers used when checking for updates. 189 | 190 | The keys of this dictionary are HTTP header fields (NSString) and values are corresponding values (NSString) 191 | */ 192 | #if __has_feature(objc_generics) 193 | @property (nonatomic, copy, nullable) NSDictionary *httpHeaders; 194 | #else 195 | @property (nonatomic, copy, nullable) NSDictionary *httpHeaders; 196 | #endif 197 | 198 | /*! 199 | A property indicating whether or not the user's system profile information is sent when checking for updates. 200 | 201 | Setting this property will persist in the host bundle's user defaults. 202 | */ 203 | @property (nonatomic) BOOL sendsSystemProfile; 204 | 205 | /*! 206 | Returns the date of last update check. 207 | 208 | \returns \c nil if no check has been performed. 209 | */ 210 | @property (nonatomic, readonly, copy, nullable) NSDate *lastUpdateCheckDate; 211 | 212 | /*! 213 | Appropriately schedules or cancels the update checking timer according to 214 | the preferences for time interval and automatic checks. 215 | 216 | This call does not change the date of the next check, 217 | but only the internal timer. 218 | */ 219 | - (void)resetUpdateCycle; 220 | 221 | 222 | /*! 223 | The system profile information that is sent when checking for updates 224 | */ 225 | @property (nonatomic, readonly, copy) NSArray *> *systemProfileArray; 226 | 227 | @end 228 | 229 | NS_ASSUME_NONNULL_END 230 | -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Resources/SUModelTranslation.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ADP2,1 6 | Developer Transition Kit 7 | iMac1,1 8 | iMac G3 (Rev A-D) 9 | iMac4,1 10 | iMac (Core Duo) 11 | iMac4,2 12 | iMac for Education (17 inch, Core Duo) 13 | iMac5,1 14 | iMac (Core 2 Duo, 17 or 20 inch, SuperDrive) 15 | iMac5,2 16 | iMac (Core 2 Duo, 17 inch, Combo Drive) 17 | iMac6,1 18 | iMac (Core 2 Duo, 24 inch, SuperDrive) 19 | iMac7,1 20 | iMac Intel Core 2 Duo (aluminum enclosure) 21 | iMac8,1 22 | iMac (Core 2 Duo, 20 or 24 inch, Early 2008 ) 23 | iMac9,1 24 | iMac (Core 2 Duo, 20 or 24 inch, Early or Mid 2009 ) 25 | iMac10,1 26 | iMac (Core 2 Duo, 21.5 or 27 inch, Late 2009 ) 27 | iMac11,1 28 | iMac (Core i5 or i7, 27 inch Late 2009) 29 | iMac11,2 30 | 21.5" iMac (mid 2010) 31 | iMac11,3 32 | iMac (Core i5 or i7, 27 inch Mid 2010) 33 | iMac12,1 34 | iMac (Core i3 or i5 or i7, 21.5 inch Mid 2010 or Late 2011) 35 | iMac12,2 36 | iMac (Core i5 or i7, 27 inch Mid 2011) 37 | iMac13,1 38 | iMac (Core i3 or i5 or i7, 21.5 inch Late 2012 or Early 2013) 39 | iMac13,2 40 | iMac (Core i5 or i7, 27 inch Late 2012) 41 | iMac14,1 42 | iMac (Core i5, 21.5 inch Late 2013) 43 | iMac14,2 44 | iMac (Core i5 or i7, 27 inch Late 2013) 45 | iMac14,3 46 | iMac (Core i5 or i7, 21.5 inch Late 2013) 47 | iMac14,4 48 | iMac (Core i5, 21.5 inch Mid 2014) 49 | iMac15,1 50 | iMac (Retina 5K Core i5 or i7, 27 inch Late 2014 or Mid 2015) 51 | iMac16,1 52 | iMac (Core i5, 21,5 inch Late 2015) 53 | iMac16,2 54 | iMac (Retina 4K Core i5 or i7, 21.5 inch Late 2015) 55 | iMac17,1 56 | iMac (Retina 5K Core i5 or i7, 27 inch Late 2015) 57 | MacBook1,1 58 | MacBook (Core Duo) 59 | MacBook2,1 60 | MacBook (Core 2 Duo) 61 | MacBook4,1 62 | MacBook (Core 2 Duo Feb 2008) 63 | MacBook5,1 64 | MacBook (Core 2 Duo, Late 2008, Unibody) 65 | MacBook5,2 66 | MacBook (Core 2 Duo, Early 2009, White) 67 | MacBook6,1 68 | MacBook (Core 2 Duo, Late 2009, Unibody) 69 | MacBook7,1 70 | MacBook (Core 2 Duo, Mid 2010, White) 71 | MacBook8,1 72 | MacBook (Core M, 12 inch, Early 2015) 73 | MacBookAir1,1 74 | MacBook Air (Core 2 Duo, 13 inch, Early 2008) 75 | MacBookAir2,1 76 | MacBook Air (Core 2 Duo, 13 inch, Mid 2009) 77 | MacBookAir3,1 78 | MacBook Air (Core 2 Duo, 11 inch, Late 2010) 79 | MacBookAir3,2 80 | MacBook Air (Core 2 Duo, 13 inch, Late 2010) 81 | MacBookAir4,1 82 | MacBook Air (Core i5 or i7, 11 inch, Mid 2011) 83 | MacBookAir4,2 84 | MacBook Air (Core i5 or i7, 13 inch, Mid 2011) 85 | MacBookAir5,1 86 | MacBook Air (Core i5 or i7, 11 inch, Mid 2012) 87 | MacBookAir5,2 88 | MacBook Air (Core i5 or i7, 13 inch, Mid 2012) 89 | MacBookAir6,1 90 | MacBook Air (Core i5 or i7, 11 inch, Mid 2013 or Early 2014) 91 | MacBookAir6,2 92 | MacBook Air (Core i5 or i7, 13 inch, Mid 2013 or Early 2014) 93 | MacBookAir7,1 94 | MacBook Air (Core i5 or i7, 11 inch, Early 2015) 95 | MacBookAir7,2 96 | MacBook Air (Core i5 or i7, 13 inch, Early 2015) 97 | MacBookPro1,1 98 | MacBook Pro Core Duo (15-inch) 99 | MacBookPro1,2 100 | MacBook Pro Core Duo (17-inch) 101 | MacBookPro2,1 102 | MacBook Pro Core 2 Duo (17-inch) 103 | MacBookPro2,2 104 | MacBook Pro Core 2 Duo (15-inch) 105 | MacBookPro3,1 106 | MacBook Pro Core 2 Duo (15-inch LED, Core 2 Duo) 107 | MacBookPro3,2 108 | MacBook Pro Core 2 Duo (17-inch HD, Core 2 Duo) 109 | MacBookPro4,1 110 | MacBook Pro (Core 2 Duo Feb 2008) 111 | MacBookPro5,1 112 | MacBook Pro Intel Core 2 Duo (aluminum unibody) 113 | MacBookPro5,2 114 | MacBook Pro Intel Core 2 Duo (aluminum unibody) 115 | MacBookPro5,3 116 | MacBook Pro Intel Core 2 Duo (aluminum unibody) 117 | MacBookPro5,4 118 | MacBook Pro Intel Core 2 Duo (aluminum unibody) 119 | MacBookPro5,5 120 | MacBook Pro Intel Core 2 Duo (aluminum unibody) 121 | MacBookPro6,1 122 | MacBook Pro Intel Core i5, Intel Core i7 (mid 2010) 123 | MacBookPro6,2 124 | MacBook Pro Intel Core i5, Intel Core i7 (mid 2010) 125 | MacBookPro7,1 126 | MacBook Pro Intel Core 2 Duo (mid 2010) 127 | MacBookPro8,1 128 | MacBook Pro Intel Core i5, Intel Core i7, 13" (early 2011) 129 | MacBookPro8,2 130 | MacBook Pro Intel Core i7, 15" (early 2011) 131 | MacBookPro8,3 132 | MacBook Pro Intel Core i7, 17" (early 2011) 133 | MacBookPro9,1 134 | MacBook Pro (15-inch, Mid 2012) 135 | MacBookPro9,2 136 | MacBook Pro (13-inch, Mid 2012) 137 | MacBookPro10,1 138 | MacBook Pro (Retina, Mid 2012) 139 | MacBookPro10,2 140 | MacBook Pro (Retina, 13-inch, Late 2012) 141 | MacBookPro11,1 142 | MacBook Pro (Retina, 13-inch, Late 2013) 143 | MacBookPro11,2 144 | MacBook Pro (Retina, 15-inch, Late 2013) 145 | MacBookPro11,3 146 | MacBook Pro (Retina, 15-inch, Late 2013) 147 | MacbookPro11,4 148 | MacBook Pro (Retina, 15-inch, Mid 2015) 149 | MacbookPro11,5 150 | MacBook Pro (Retina, 15-inch, Mid 2015) 151 | MacbookPro12,1  152 | MacBook Pro (Retina, 13-inch, Early 2015) 153 | Macmini1,1 154 | Mac Mini (Core Solo/Duo) 155 | Macmini2,1 156 | Mac mini Intel Core 157 | Macmini3,1 158 | Mac mini Intel Core 159 | Macmini4,1 160 | Mac mini Intel Core (Mid 2010) 161 | Macmini5,1 162 | Mac mini (Core i5, Mid 2011) 163 | Macmini5,2 164 | Mac mini (Core i5 or Core i7, Mid 2011) 165 | Macmini5,3 166 | Mac mini (Core i7, Server, Mid 2011) 167 | Macmini6,1 168 | Mac mini (Core i5, Late 2012) 169 | Macmini6,2 170 | Mac mini (Core i7, Normal or Server, Late 2012) 171 | Macmini7,1 172 | Mac mini (Core i5 or Core i7, Late 2014) 173 | MacPro1,1,Quad 174 | Mac Pro 175 | MacPro1,1 176 | Mac Pro (four-core) 177 | MacPro2,1 178 | Mac Pro (eight-core) 179 | MacPro3,1 180 | Mac Pro (January 2008 4- or 8- core "Harpertown") 181 | MacPro4,1 182 | Mac Pro (March 2009) 183 | MacPro5,1 184 | Mac Pro (2010 or 2012) 185 | MacPro6,1 186 | Mac Pro (Late 2013) 187 | PowerBook1,1 188 | PowerBook G3 189 | PowerBook2,1 190 | iBook G3 191 | PowerBook2,2 192 | iBook G3 (FireWire) 193 | PowerBook2,3 194 | iBook G3 195 | PowerBook2,4 196 | iBook G3 197 | PowerBook3,1 198 | PowerBook G3 (FireWire) 199 | PowerBook3,2 200 | PowerBook G4 201 | PowerBook3,3 202 | PowerBook G4 (Gigabit Ethernet) 203 | PowerBook3,4 204 | PowerBook G4 (DVI) 205 | PowerBook3,5 206 | PowerBook G4 (1GHz / 867MHz) 207 | PowerBook4,1 208 | iBook G3 (Dual USB, Late 2001) 209 | PowerBook4,2 210 | iBook G3 (16MB VRAM) 211 | PowerBook4,3 212 | iBook G3 Opaque 16MB VRAM, 32MB VRAM, Early 2003) 213 | PowerBook5,1 214 | PowerBook G4 (17 inch) 215 | PowerBook5,2 216 | PowerBook G4 (15 inch FW 800) 217 | PowerBook5,3 218 | PowerBook G4 (17-inch 1.33GHz) 219 | PowerBook5,4 220 | PowerBook G4 (15 inch 1.5/1.33GHz) 221 | PowerBook5,5 222 | PowerBook G4 (17-inch 1.5GHz) 223 | PowerBook5,6 224 | PowerBook G4 (15 inch 1.67GHz/1.5GHz) 225 | PowerBook5,7 226 | PowerBook G4 (17-inch 1.67GHz) 227 | PowerBook5,8 228 | PowerBook G4 (Double layer SD, 15 inch) 229 | PowerBook5,9 230 | PowerBook G4 (Double layer SD, 17 inch) 231 | PowerBook6,1 232 | PowerBook G4 (12 inch) 233 | PowerBook6,2 234 | PowerBook G4 (12 inch, DVI) 235 | PowerBook6,3 236 | iBook G4 237 | PowerBook6,4 238 | PowerBook G4 (12 inch 1.33GHz) 239 | PowerBook6,5 240 | iBook G4 (Early-Late 2004) 241 | PowerBook6,7 242 | iBook G4 (Mid 2005) 243 | PowerBook6,8 244 | PowerBook G4 (12 inch 1.5GHz) 245 | PowerMac1,1 246 | Power Macintosh G3 (Blue & White) 247 | PowerMac1,2 248 | Power Macintosh G4 (PCI Graphics) 249 | PowerMac2,1 250 | iMac G3 (Slot-loading CD-ROM) 251 | PowerMac2,2 252 | iMac G3 (Summer 2000) 253 | PowerMac3,1 254 | Power Macintosh G4 (AGP Graphics) 255 | PowerMac3,2 256 | Power Macintosh G4 (AGP Graphics) 257 | PowerMac3,3 258 | Power Macintosh G4 (Gigabit Ethernet) 259 | PowerMac3,4 260 | Power Macintosh G4 (Digital Audio) 261 | PowerMac3,5 262 | Power Macintosh G4 (Quick Silver) 263 | PowerMac3,6 264 | Power Macintosh G4 (Mirrored Drive Door) 265 | PowerMac4,1 266 | iMac G3 (Early/Summer 2001) 267 | PowerMac4,2 268 | iMac G4 (Flat Panel) 269 | PowerMac4,4 270 | eMac 271 | PowerMac4,5 272 | iMac G4 (17-inch Flat Panel) 273 | PowerMac5,1 274 | Power Macintosh G4 Cube 275 | PowerMac5,2 276 | Power Mac G4 Cube 277 | PowerMac6,1 278 | iMac G4 (USB 2.0) 279 | PowerMac6,3 280 | iMac G4 (20-inch Flat Panel) 281 | PowerMac6,4 282 | eMac (USB 2.0, 2005) 283 | PowerMac7,2 284 | Power Macintosh G5 285 | PowerMac7,3 286 | Power Macintosh G5 287 | PowerMac8,1 288 | iMac G5 289 | PowerMac8,2 290 | iMac G5 (Ambient Light Sensor) 291 | PowerMac9,1 292 | Power Macintosh G5 (Late 2005) 293 | PowerMac10,1 294 | Mac Mini G4 295 | PowerMac10,2 296 | Mac Mini (Late 2005) 297 | PowerMac11,2 298 | Power Macintosh G5 (Late 2005) 299 | PowerMac12,1 300 | iMac G5 (iSight) 301 | RackMac1,1 302 | Xserve G4 303 | RackMac1,2 304 | Xserve G4 (slot-loading, cluster node) 305 | RackMac3,1 306 | Xserve G5 307 | Xserve1,1 308 | Xserve (Intel Xeon) 309 | Xserve2,1 310 | Xserve (January 2008 quad-core) 311 | Xserve3,1 312 | Xserve (early 2009) 313 | 314 | 315 | -------------------------------------------------------------------------------- /Frameworks/Sparkle.framework/Versions/A/Headers/SUUpdaterDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUUpdaterDelegate.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 3/12/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #if __has_feature(modules) 10 | #if __has_warning("-Watimport-in-framework-header") 11 | #pragma clang diagnostic ignored "-Watimport-in-framework-header" 12 | #endif 13 | @import Foundation; 14 | #else 15 | #import 16 | #endif 17 | #import "SUExport.h" 18 | 19 | @protocol SUVersionComparison, SUVersionDisplay; 20 | @class SUUpdater, SUAppcast, SUAppcastItem; 21 | 22 | NS_ASSUME_NONNULL_BEGIN 23 | 24 | // ----------------------------------------------------------------------------- 25 | // SUUpdater Notifications for events that might be interesting to more than just the delegate 26 | // The updater will be the notification object 27 | // ----------------------------------------------------------------------------- 28 | SU_EXPORT extern NSString *const SUUpdaterDidFinishLoadingAppCastNotification; 29 | SU_EXPORT extern NSString *const SUUpdaterDidFindValidUpdateNotification; 30 | SU_EXPORT extern NSString *const SUUpdaterDidNotFindUpdateNotification; 31 | SU_EXPORT extern NSString *const SUUpdaterWillRestartNotification; 32 | #define SUUpdaterWillRelaunchApplicationNotification SUUpdaterWillRestartNotification; 33 | #define SUUpdaterWillInstallUpdateNotification SUUpdaterWillRestartNotification; 34 | 35 | // Key for the SUAppcastItem object in the SUUpdaterDidFindValidUpdateNotification userInfo 36 | SU_EXPORT extern NSString *const SUUpdaterAppcastItemNotificationKey; 37 | // Key for the SUAppcast object in the SUUpdaterDidFinishLoadingAppCastNotification userInfo 38 | SU_EXPORT extern NSString *const SUUpdaterAppcastNotificationKey; 39 | 40 | // ----------------------------------------------------------------------------- 41 | // SUUpdater Delegate: 42 | // ----------------------------------------------------------------------------- 43 | 44 | /*! 45 | Provides methods to control the behavior of an SUUpdater object. 46 | */ 47 | __deprecated_msg("Deprecated in Sparkle 2. See SPUUpdaterDelegate instead") 48 | @protocol SUUpdaterDelegate 49 | @optional 50 | 51 | /*! 52 | Returns whether to allow Sparkle to pop up. 53 | 54 | For example, this may be used to prevent Sparkle from interrupting a setup assistant. 55 | 56 | \param updater The SUUpdater instance. 57 | */ 58 | - (BOOL)updaterMayCheckForUpdates:(SUUpdater *)updater; 59 | 60 | /*! 61 | Returns additional parameters to append to the appcast URL's query string. 62 | 63 | This is potentially based on whether or not Sparkle will also be sending along the system profile. 64 | 65 | \param updater The SUUpdater instance. 66 | \param sendingProfile Whether the system profile will also be sent. 67 | 68 | \return An array of dictionaries with keys: "key", "value", "displayKey", "displayValue", the latter two being specifically for display to the user. 69 | */ 70 | - (NSArray *> *)feedParametersForUpdater:(SUUpdater *)updater sendingSystemProfile:(BOOL)sendingProfile; 71 | 72 | /*! 73 | Returns a custom appcast URL. 74 | 75 | Override this to dynamically specify the entire URL. 76 | 77 | An alternative may be to use SUUpdaterDelegate::feedParametersForUpdater:sendingSystemProfile: 78 | and let the server handle what kind of feed to provide. 79 | 80 | \param updater The SUUpdater instance. 81 | */ 82 | - (nullable NSString *)feedURLStringForUpdater:(SUUpdater *)updater; 83 | 84 | /*! 85 | Returns whether Sparkle should prompt the user about automatic update checks. 86 | 87 | Use this to override the default behavior. 88 | 89 | \param updater The SUUpdater instance. 90 | */ 91 | - (BOOL)updaterShouldPromptForPermissionToCheckForUpdates:(SUUpdater *)updater; 92 | 93 | /*! 94 | Called after Sparkle has downloaded the appcast from the remote server. 95 | 96 | Implement this if you want to do some special handling with the appcast once it finishes loading. 97 | 98 | \param updater The SUUpdater instance. 99 | \param appcast The appcast that was downloaded from the remote server. 100 | */ 101 | - (void)updater:(SUUpdater *)updater didFinishLoadingAppcast:(SUAppcast *)appcast; 102 | 103 | /*! 104 | Returns the item in the appcast corresponding to the update that should be installed. 105 | 106 | If you're using special logic or extensions in your appcast, 107 | implement this to use your own logic for finding a valid update, if any, 108 | in the given appcast. 109 | 110 | \param appcast The appcast that was downloaded from the remote server. 111 | \param updater The SUUpdater instance. 112 | */ 113 | - (nullable SUAppcastItem *)bestValidUpdateInAppcast:(SUAppcast *)appcast forUpdater:(SUUpdater *)updater; 114 | 115 | /*! 116 | Called when a valid update is found by the update driver. 117 | 118 | \param updater The SUUpdater instance. 119 | \param item The appcast item corresponding to the update that is proposed to be installed. 120 | */ 121 | - (void)updater:(SUUpdater *)updater didFindValidUpdate:(SUAppcastItem *)item; 122 | 123 | /*! 124 | Called when a valid update is not found. 125 | 126 | \param updater The SUUpdater instance. 127 | */ 128 | - (void)updaterDidNotFindUpdate:(SUUpdater *)updater; 129 | 130 | /*! 131 | Called immediately before downloading the specified update. 132 | 133 | \param updater The SUUpdater instance. 134 | \param item The appcast item corresponding to the update that is proposed to be downloaded. 135 | \param request The mutable URL request that will be used to download the update. 136 | */ 137 | - (void)updater:(SUUpdater *)updater willDownloadUpdate:(SUAppcastItem *)item withRequest:(NSMutableURLRequest *)request; 138 | 139 | /*! 140 | Called immediately after succesfull download of the specified update. 141 | 142 | \param updater The SUUpdater instance. 143 | \param item The appcast item corresponding to the update that has been downloaded. 144 | */ 145 | - (void)updater:(SUUpdater *)updater didDownloadUpdate:(SUAppcastItem *)item; 146 | 147 | /*! 148 | Called after the specified update failed to download. 149 | 150 | \param updater The SUUpdater instance. 151 | \param item The appcast item corresponding to the update that failed to download. 152 | \param error The error generated by the failed download. 153 | */ 154 | - (void)updater:(SUUpdater *)updater failedToDownloadUpdate:(SUAppcastItem *)item error:(NSError *)error; 155 | 156 | /*! 157 | Called when the user clicks the cancel button while and update is being downloaded. 158 | 159 | \param updater The SUUpdater instance. 160 | */ 161 | - (void)userDidCancelDownload:(SUUpdater *)updater; 162 | 163 | /*! 164 | Called immediately before extracting the specified downloaded update. 165 | 166 | \param updater The SUUpdater instance. 167 | \param item The appcast item corresponding to the update that is proposed to be extracted. 168 | */ 169 | - (void)updater:(SUUpdater *)updater willExtractUpdate:(SUAppcastItem *)item; 170 | 171 | /*! 172 | Called immediately after extracting the specified downloaded update. 173 | 174 | \param updater The SUUpdater instance. 175 | \param item The appcast item corresponding to the update that has been extracted. 176 | */ 177 | - (void)updater:(SUUpdater *)updater didExtractUpdate:(SUAppcastItem *)item; 178 | 179 | /*! 180 | Called immediately before installing the specified update. 181 | 182 | \param updater The SUUpdater instance. 183 | \param item The appcast item corresponding to the update that is proposed to be installed. 184 | */ 185 | - (void)updater:(SUUpdater *)updater willInstallUpdate:(SUAppcastItem *)item; 186 | 187 | /*! 188 | Called when an update is skipped by the user. 189 | 190 | \param updater The updater instance. 191 | \param item The appcast item corresponding to the update that the user skipped. 192 | */ 193 | - (void)updater:(SUUpdater *)updater userDidSkipThisVersion:(SUAppcastItem *)item; 194 | 195 | /*! 196 | Returns whether the relaunch should be delayed in order to perform other tasks. 197 | 198 | This is not called if the user didn't relaunch on the previous update, 199 | in that case it will immediately restart. 200 | 201 | This may also not be called if the application is not going to relaunch after it terminates. 202 | 203 | \param updater The SUUpdater instance. 204 | \param item The appcast item corresponding to the update that is proposed to be installed. 205 | \param invocation The invocation that must be completed with `[invocation invoke]` before continuing with the relaunch. 206 | 207 | \return \c YES to delay the relaunch until \p invocation is invoked. 208 | */ 209 | - (BOOL)updater:(SUUpdater *)updater shouldPostponeRelaunchForUpdate:(SUAppcastItem *)item untilInvoking:(NSInvocation *)invocation; 210 | 211 | /*! 212 | Returns whether the relaunch should be delayed in order to perform other tasks. 213 | 214 | This is not called if the user didn't relaunch on the previous update, 215 | in that case it will immediately restart. 216 | 217 | This method acts as a simpler alternative to SUUpdaterDelegate::updater:shouldPostponeRelaunchForUpdate:untilInvoking: avoiding usage of NSInvocation, which is not available in Swift environments. 218 | 219 | \param updater The SUUpdater instance. 220 | \param item The appcast item corresponding to the update that is proposed to be installed. 221 | 222 | \return \c YES to delay the relaunch. 223 | */ 224 | - (BOOL)updater:(SUUpdater *)updater shouldPostponeRelaunchForUpdate:(SUAppcastItem *)item; 225 | 226 | /*! 227 | Returns whether the application should be relaunched at all. 228 | 229 | Some apps \b cannot be relaunched under certain circumstances. 230 | This method can be used to explicitly prevent a relaunch. 231 | 232 | \param updater The SUUpdater instance. 233 | */ 234 | - (BOOL)updaterShouldRelaunchApplication:(SUUpdater *)updater; 235 | 236 | /*! 237 | Called immediately before relaunching. 238 | 239 | \param updater The SUUpdater instance. 240 | */ 241 | - (void)updaterWillRelaunchApplication:(SUUpdater *)updater; 242 | 243 | /*! 244 | Called immediately after relaunching. SUUpdater delegate must be set before applicationDidFinishLaunching: to catch this event. 245 | 246 | \param updater The SUUpdater instance. 247 | */ 248 | - (void)updaterDidRelaunchApplication:(SUUpdater *)updater; 249 | 250 | /*! 251 | Returns an object that compares version numbers to determine their arithmetic relation to each other. 252 | 253 | This method allows you to provide a custom version comparator. 254 | If you don't implement this method or return \c nil, 255 | the standard version comparator will be used. Note that the 256 | standard version comparator may be used during installation for preventing 257 | a downgrade, even if you provide a custom comparator here. 258 | 259 | \sa SUStandardVersionComparator 260 | 261 | \param updater The SUUpdater instance. 262 | */ 263 | - (nullable id)versionComparatorForUpdater:(SUUpdater *)updater; 264 | 265 | /*! 266 | Returns an object that formats version numbers for display to the user. 267 | If you don't implement this method or return \c nil, the standard version formatter will be used. 268 | 269 | \sa SUUpdateAlert 270 | \param updater The SUUpdater instance. 271 | */ 272 | - (nullable id )versionDisplayerForUpdater:(SUUpdater *)updater; 273 | 274 | /*! 275 | Returns the path to the application which is used to relaunch after the update is installed. 276 | 277 | The installer also waits for the termination of the application at this path. 278 | 279 | The default is the path of the host bundle. 280 | 281 | \param updater The SUUpdater instance. 282 | */ 283 | - (nullable NSString *)pathToRelaunchForUpdater:(SUUpdater *)updater; 284 | 285 | /*! 286 | Called before an updater shows a modal alert window, 287 | to give the host the opportunity to hide attached windows that may get in the way. 288 | 289 | \param updater The SUUpdater instance. 290 | */ 291 | - (void)updaterWillShowModalAlert:(SUUpdater *)updater; 292 | 293 | /*! 294 | Called after an updater shows a modal alert window, 295 | to give the host the opportunity to hide attached windows that may get in the way. 296 | 297 | \param updater The SUUpdater instance. 298 | */ 299 | - (void)updaterDidShowModalAlert:(SUUpdater *)updater; 300 | 301 | /*! 302 | Called when an update is scheduled to be silently installed on quit. 303 | 304 | This is after an update has been automatically downloaded in the background. 305 | (i.e. SUUpdater::automaticallyDownloadsUpdates is YES) 306 | 307 | \param updater The SUUpdater instance. 308 | \param item The appcast item corresponding to the update that is proposed to be installed. 309 | \param invocation Can be used to trigger an immediate silent install and relaunch. 310 | */ 311 | - (void)updater:(SUUpdater *)updater willInstallUpdateOnQuit:(SUAppcastItem *)item immediateInstallationInvocation:(NSInvocation *)invocation; 312 | 313 | /*! 314 | Called when an update is scheduled to be silently installed on quit. 315 | This is after an update has been automatically downloaded in the background. 316 | (i.e. SUUpdater::automaticallyDownloadsUpdates is YES) 317 | This method acts as a more modern alternative to SUUpdaterDelegate::updater:willInstallUpdateOnQuit:immediateInstallationInvocation: using a block instead of NSInvocation, which is not available in Swift environments. 318 | \param updater The SUUpdater instance. 319 | \param item The appcast item corresponding to the update that is proposed to be installed. 320 | \param installationBlock Can be used to trigger an immediate silent install and relaunch. 321 | */ 322 | - (void)updater:(SUUpdater *)updater willInstallUpdateOnQuit:(SUAppcastItem *)item immediateInstallationBlock:(void (^)(void))installationBlock; 323 | 324 | /*! 325 | Calls after an update that was scheduled to be silently installed on quit has been canceled. 326 | 327 | \param updater The SUUpdater instance. 328 | \param item The appcast item corresponding to the update that was proposed to be installed. 329 | 330 | \deprecated This method is no longer invoked. The installer will try to its best ability to install the update. 331 | */ 332 | - (void)updater:(SUUpdater *)updater didCancelInstallUpdateOnQuit:(SUAppcastItem *)item __deprecated; 333 | 334 | /*! 335 | Called after an update is aborted due to an error. 336 | 337 | \param updater The SUUpdater instance. 338 | \param error The error that caused the abort 339 | */ 340 | - (void)updater:(SUUpdater *)updater didAbortWithError:(NSError *)error; 341 | 342 | @end 343 | 344 | NS_ASSUME_NONNULL_END 345 | --------------------------------------------------------------------------------