@@ -2,42 +2,63 @@ import Sparkle
22import SwiftUI
33
44final class UpdaterService : NSObject , ObservableObject {
5- private lazyvar inner : SPUStandardUpdaterController = . init(
6- startingUpdater: true ,
7- updaterDelegate: self ,
8- userDriverDelegate: self
9- )
10- private var updater : SPUUpdater !
5+ // The auto-updater can be entirely disabled by setting the
6+ // `disableUpdater` UserDefaults key to `true`. This is designed for use in
7+ // MDM configurations, where the value can be set to `true` permanently.
8+ @Published var disabled : Bool = UserDefaults . standard. bool ( forKey: Keys . disableUpdater) {
9+ didSet{
10+ UserDefaults . standard. set ( disabled, forKey: Keys . disableUpdater)
11+ }
12+ }
13+
1114@Published var canCheckForUpdates = true
1215
1316@Published var autoCheckForUpdates : Bool ! {
1417 didSet{
1518if let autoCheckForUpdates, autoCheckForUpdates!= oldValue{
16- updater. automaticallyChecksForUpdates= autoCheckForUpdates
19+ inner ? . updater. automaticallyChecksForUpdates= autoCheckForUpdates
1720}
1821}
1922}
2023
2124@Published var updateChannel : UpdateChannel {
2225 didSet{
23- UserDefaults . standard. set ( updateChannel. rawValue, forKey: Self . updateChannelKey )
26+ UserDefaults . standard. set ( updateChannel. rawValue, forKey: Keys . updateChannel )
2427}
2528}
2629
27- static let updateChannelKey = " updateChannel "
30+ private var inner : ( controller : SPUStandardUpdaterController , updater : SPUUpdater ) ?
2831
2932override init ( ) {
30- updateChannel= UserDefaults . standard. string ( forKey: Self . updateChannelKey )
33+ updateChannel= UserDefaults . standard. string ( forKey: Keys . updateChannel )
3134. flatMap { UpdateChannel ( rawValue: $0) } ?? . stable
3235 super. init ( )
33- updater= inner. updater
36+
37+ guard !disabledelse {
38+ return
39+ }
40+
41+ let inner = SPUStandardUpdaterController (
42+ startingUpdater: true ,
43+ updaterDelegate: self ,
44+ userDriverDelegate: self
45+ )
46+
47+ let updater = inner. updater
48+ self . inner= ( inner, updater)
49+
3450 autoCheckForUpdates= updater. automaticallyChecksForUpdates
3551 updater. publisher ( for: \. canCheckForUpdates) . assign ( to: & $canCheckForUpdates)
3652}
3753
3854func checkForUpdates( ) {
39- guard canCheckForUpdateselse { return }
40- updater. checkForUpdates ( )
55+ guard let inner, canCheckForUpdateselse { return }
56+ inner. updater. checkForUpdates ( )
57+ }
58+
59+ enum Keys {
60+ static let disableUpdater = " disableUpdater "
61+ static let updateChannel = " updateChannel "
4162}
4263}
4364