Selaa lähdekoodia

Added build expiry info to settings view and logs

Added a function to grab the embedded profile expiry date and display it in the settings view & exported logs
Jamie Keene 2 vuotta sitten
vanhempi
commit
6b3af768e8

+ 2 - 1
FreeAPS/Sources/Application/FreeAPSApp.swift

@@ -1,4 +1,5 @@
 import CoreData
+import Foundation
 import SwiftUI
 import Swinject
 
@@ -49,7 +50,7 @@ import Swinject
     init() {
         debug(
             .default,
-            "iAPS Started: v\(Bundle.main.releaseVersionNumber ?? "")(\(Bundle.main.buildVersionNumber ?? "")) [buildDate: \(Bundle.main.buildDate)]"
+            "iAPS Started: v\(Bundle.main.releaseVersionNumber ?? "")(\(Bundle.main.buildVersionNumber ?? "")) [buildDate: \(Bundle.main.buildDate)] [buildExpires: \(Bundle.main.profileExpiration)]"
         )
         loadServices()
     }

+ 38 - 0
FreeAPS/Sources/Helpers/Bundle+Extensions.swift

@@ -18,4 +18,42 @@ extension Bundle {
         }
         return Date()
     }
+
+    var profileExpiration: String {
+        guard
+            let profilePath = Bundle.main.path(forResource: "embedded", ofType: "mobileprovision"),
+            let profileData = try? Data(contentsOf: URL(fileURLWithPath: profilePath)),
+            // Note: We use `NSString` instead of `String`, because it makes it easier working with regex, ranges, substring etc.
+            let profileNSString = NSString(data: profileData, encoding: String.Encoding.ascii.rawValue)
+        else {
+            print(
+                "WARNING: Could not find or read `embedded.mobileprovision`. If running on Simulator, there are no provisioning profiles."
+            )
+            return "N/A"
+        }
+
+        // NOTE: We have the `[\\W]*?` check to make sure that variations in number of tabs or new lines in the future does not influence the result.
+        guard let regex = try? NSRegularExpression(pattern: "<key>ExpirationDate</key>[\\W]*?<date>(.*?)</date>", options: [])
+        else {
+            print("Warning: Could not create regex.")
+            return "N/A"
+        }
+
+        let regExMatches = regex.matches(
+            in: profileNSString as String,
+            options: [],
+            range: NSRange(location: 0, length: profileNSString.length)
+        )
+
+        // NOTE: range `0` corresponds to the full regex match, so to get the first capture group, we use range `1`
+        guard let rangeOfCapturedGroupForDate = regExMatches.first?.range(at: 1) else {
+            print("Warning: Could not find regex match or capture group.")
+            return "N/A"
+        }
+
+        let dateWithTimeAsString = profileNSString.substring(with: rangeOfCapturedGroupForDate)
+        let dateAsStringIndex = dateWithTimeAsString.firstIndex(of: "T")!
+        let dateAsString = dateWithTimeAsString.substring(to: dateAsStringIndex)
+        return dateAsString
+    }
 }

+ 1 - 1
FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift

@@ -12,7 +12,7 @@ extension Settings {
             Form {
                 Section(
                     header: Text(
-                        "iAPS v\(state.versionNumber) (\(state.buildNumber))\nBranch: \(state.branch) \(state.copyrightNotice) "
+                        "iAPS v\(state.versionNumber) (\(state.buildNumber))\nBranch: \(state.branch) \(state.copyrightNotice)\nBuildg Expires: \(Bundle.main.profileExpiration)"
                     ).textCase(nil)
                 ) {
                     Toggle("Closed loop", isOn: $state.closedLoop)