@@ -11,23 +11,38 @@ import Foundation
1111class AppVersionManager {
1212 private let githubService = GitHubService ( )
1313
14+ /// Checks for the availability of a new app version and if the current version is blacklisted.
15+ /// - Parameter completion: Returns latest version, a boolean for newer version existence, and blacklist status.
16+ /// Usage: `versionManager.checkForNewVersion { latestVersion, isNewer, isBlacklisted in ... }`
1417 func checkForNewVersion( completion: @escaping ( String ? , Bool , Bool ) -> Void ) {
1518 let currentVersion = version ( )
1619 let now = Date ( )
17-
18- // Retrieve cache
19- let lastChecked = UserDefaults . standard. object ( forKey: " latestVersionChecked " ) as? Date ?? Date . distantPast
20- let cachedLatestVersion = UserDefaults . standard. string ( forKey: " latestVersion " )
21- let isBlacklistedCached = UserDefaults . standard. bool ( forKey: " isCurrentVersionBlacklisted " )
2220
21+ // Retrieve cache
22+ let latestVersionChecked = UserDefaultsRepository . latestVersionChecked. value ?? Date . distantPast
23+ let latestVersion = UserDefaultsRepository . latestVersion. value
24+ let currentVersionBlackListed = UserDefaultsRepository . currentVersionBlackListed. value
25+ let cachedForVersion = UserDefaultsRepository . cachedForVersion. value
26+
27+ // Reset notifications if version has changed
28+ if let cachedVersion = cachedForVersion, cachedVersion != currentVersion {
29+ UserDefaultsRepository . lastBlacklistNotificationShown. value = Date . distantPast
30+ UserDefaultsRepository . lastVersionUpdateNotificationShown. value = Date . distantPast
31+ }
32+
2333 // Check if the cache is still valid
24- if now. timeIntervalSince ( lastChecked) < 24 * 3600 , let latestVersion = cachedLatestVersion {
34+ if let cachedVersion = cachedForVersion, cachedVersion == currentVersion,
35+ now. timeIntervalSince ( latestVersionChecked) < 24 * 3600 , let latestVersion = latestVersion {
2536 let isNewer = isVersion ( latestVersion, newerThan: currentVersion)
26- completion ( latestVersion, isNewer, isBlacklistedCached )
37+ completion ( latestVersion, isNewer, currentVersionBlackListed )
2738 return
2839 }
29-
30- // Fetch new data if cache is outdated
40+
41+ // Fetch new data if cache is outdated or not for current version
42+ fetchDataAndUpdateCache ( currentVersion: currentVersion, completion: completion)
43+ }
44+
45+ private func fetchDataAndUpdateCache( currentVersion: String , completion: @escaping ( String ? , Bool , Bool ) -> Void ) {
3146 githubService. fetchData ( for: . versionConfig) { versionData in
3247 self . githubService. fetchData ( for: . blacklistedVersions) { blacklistData in
3348 DispatchQueue . main. async {
@@ -39,9 +54,10 @@ class AppVersionManager {
3954 . map { $0. blacklistedVersions. map { $0. version } . contains ( currentVersion) } ?? false
4055
4156 // Update cache with new data
42- UserDefaults . standard. set ( fetchedVersion, forKey: " latestVersion " )
43- UserDefaults . standard. set ( Date ( ) , forKey: " latestVersionChecked " )
44- UserDefaults . standard. set ( isBlacklisted, forKey: " isCurrentVersionBlacklisted " )
57+ UserDefaultsRepository . latestVersion. value = fetchedVersion
58+ UserDefaultsRepository . latestVersionChecked. value = Date ( )
59+ UserDefaultsRepository . currentVersionBlackListed. value = isBlacklisted
60+ UserDefaultsRepository . cachedForVersion. value = currentVersion
4561
4662 // Call completion with new data
4763 completion ( fetchedVersion, isNewer, isBlacklisted)
@@ -62,7 +78,7 @@ class AppVersionManager {
6278 }
6379 return nil
6480 }
65-
81+
6682 private func isVersion( _ fetchedVersion: String , newerThan currentVersion: String ) -> Bool {
6783 let fetchedVersionComponents = fetchedVersion. split ( separator: " . " ) . map { Int ( $0) ?? 0 }
6884 let currentVersionComponents = currentVersion. split ( separator: " . " ) . map { Int ( $0) ?? 0 }
@@ -79,18 +95,18 @@ class AppVersionManager {
7995 }
8096 return false
8197 }
82-
98+
8399 func version( ) -> String {
84100 if let version = Bundle . main. infoDictionary ? [ " CFBundleShortVersionString " ] as? String {
85101 return version
86102 }
87103 return " Unknown "
88104 }
89-
105+
90106 struct Blacklist : Decodable {
91107 let blacklistedVersions : [ VersionEntry ]
92108 }
93-
109+
94110 struct VersionEntry : Decodable {
95111 let version : String
96112 }
0 commit comments