├── 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 |
--------------------------------------------------------------------------------