@@ -13,6 +13,7 @@ import UIKit
1313fileprivate extension UserDefaults {
1414 private enum Key : String {
1515 case lastSignificantTimeChangeAlert = " com.loopkit.Loop.LastSignificantTimeChangeAlert "
16+ case detectedSystemTimeOffset = " com.loopkit.Loop.DetectedSystemTimeOffset "
1617 }
1718
1819 var lastSignificantTimeChangeAlert : Date ? {
@@ -23,6 +24,15 @@ fileprivate extension UserDefaults {
2324 set ( newValue, forKey: Key . lastSignificantTimeChangeAlert. rawValue)
2425 }
2526 }
27+
28+ var detectedSystemTimeOffset : TimeInterval ? {
29+ get {
30+ return object ( forKey: Key . detectedSystemTimeOffset. rawValue) as? TimeInterval
31+ }
32+ set {
33+ set ( newValue, forKey: Key . detectedSystemTimeOffset. rawValue)
34+ }
35+ }
2636}
2737
2838class TrustedTimeChecker {
@@ -34,6 +44,12 @@ class TrustedTimeChecker {
3444 private weak var alertManager : AlertManager ?
3545 private lazy var log = DiagnosticLog ( category: " TrustedTimeChecker " )
3646
47+ var detectedSystemTimeOffset : TimeInterval {
48+ didSet {
49+ UserDefaults . standard. detectedSystemTimeOffset = detectedSystemTimeOffset
50+ }
51+ }
52+
3753 init ( alertManager: AlertManager ) {
3854 ntpClient = TrueTimeClient . sharedInstance
3955 #if DEBUG
@@ -43,6 +59,7 @@ class TrustedTimeChecker {
4359 #endif
4460 ntpClient. start ( )
4561 self . alertManager = alertManager
62+ self . detectedSystemTimeOffset = UserDefaults . standard. detectedSystemTimeOffset ?? 0
4663 NotificationCenter . default. addObserver ( forName: UIApplication . significantTimeChangeNotification,
4764 object: nil , queue: nil ) { [ weak self] _ in self ? . checkTrustedTime ( ) }
4865 NotificationCenter . default. addObserver ( forName: . LoopRunning,
@@ -56,12 +73,16 @@ class TrustedTimeChecker {
5673 case let . success( referenceTime) :
5774 let deviceNow = Date ( )
5875 let ntpNow = referenceTime. now ( )
59- let timeDelta = abs ( ntpNow. timeIntervalSince ( deviceNow) )
76+ let timeDelta = ntpNow. timeIntervalSince ( deviceNow)
6077 let timeSinceLastAlert = abs ( ntpNow. timeIntervalSince ( UserDefaults . standard. lastSignificantTimeChangeAlert ?? Date . distantPast) )
61- if timeDelta > self . acceptableTimeDelta, timeSinceLastAlert > self . minimumAlertFrequency {
78+
79+ if abs ( timeDelta) > self . acceptableTimeDelta, timeSinceLastAlert > self . minimumAlertFrequency {
6280 self . log. info ( " applicationSignificantTimeChange: ntpNow = %@, deviceNow = %@ " , ntpNow. debugDescription, deviceNow. debugDescription)
6381 self . issueTimeChangedAlert ( )
82+ self . detectedSystemTimeOffset = timeDelta
6483 UserDefaults . standard. lastSignificantTimeChangeAlert = ntpNow
84+ } else {
85+ self . detectedSystemTimeOffset = 0
6586 }
6687 case let . failure( error) :
6788 self . log. error ( " applicationSignificantTimeChange: Error getting NTP time: %@ " , error. localizedDescription)
0 commit comments