Przeglądaj źródła

Remove the ability of delete glucose from Apple Health because it is buggy

Ivan Valkou 4 lat temu
rodzic
commit
542bdcaed9

+ 1 - 1
FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings

@@ -905,7 +905,7 @@ Enact a temp Basal or a temp target */
 "For write data to Apple Health you must give permissions in Settings > Health > Data Access" = "For write data to Apple Health you must give permissions in Settings > Health > Data Access";
 
 /* */
-"After you create or delete glucose records in the Health app, please open FreeAPS X to help us guaranteed transfer changed data" = "After you create or delete glucose records in the Health app, please open FreeAPS X to help us guaranteed transfer changed data";
+"After you create glucose records in the Health app, please open FreeAPS X to help us guaranteed transfer changed data" = "After you create glucose records in the Health app, please open FreeAPS X to help us guaranteed transfer changed data";
 /* --------------------------------------------
 */
 /*

+ 1 - 1
FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings

@@ -905,7 +905,7 @@ Enact a temp Basal or a temp target */
 "For write data to Apple Health you must give permissions in Settings > Health > Data Access" = "Чтобы записывать данные в Apple Health вам необходимо дать соответствующие разрешения, перейдя к меню Настройки > Здоровье > Доступ к данным";
 
 /* */
-"After you create or delete glucose records in the Health app, please open FreeAPS X to help us guaranteed transfer changed data" = "После ручного создания или удаления записей о глюкозы в программе Здоровье пожалуйста откройте FreeAPS X, чтобы помочь нам гарантированно загрузить измененные данные";
+"After you create glucose records in the Health app, please open FreeAPS X to help us guaranteed transfer changed data" = "После ручного создания записей о глюкозы в программе Здоровье пожалуйста откройте FreeAPS X, чтобы помочь нам гарантированно загрузить измененные данные";
 /* --------------------------------------------
 
 

+ 1 - 1
FreeAPS/Sources/Modules/HealthKit/View/AppleHealthKitRootView.swift

@@ -13,7 +13,7 @@ extension AppleHealthKit {
                     HStack {
                         Image(systemName: "pencil.circle.fill")
                         Text(
-                            "After you create or delete glucose records in the Health app, please open FreeAPS X to help us guaranteed transfer changed data"
+                            "After you create glucose records in the Health app, please open FreeAPS X to help us guaranteed transfer changed data"
                         )
                         .font(.caption)
                     }

+ 7 - 44
FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift

@@ -4,13 +4,10 @@ import HealthKit
 import Swinject
 
 protocol HealthKitManager: GlucoseSource {
-    /// Check availability HealthKit on current device and user's permissions
-    var isAvailableOnCurrentDevice: Bool { get }
     /// Check all needed permissions
     /// Return false if one or more permissions are deny or not choosen
     var areAllowAllPermissions: Bool { get }
-    /// Check availability to save data of concrete type to Health store
-    func checkAvailabilitySave(objectTypeToHealthStore: HKObjectType) -> Bool
+    /// Check availability to save data of BG type to Health store
     func checkAvailabilitySaveBG() -> Bool
     /// Requests user to give permissions on using HealthKit
     func requestPermission(completion: ((Bool, Error?) -> Void)?)
@@ -45,19 +42,17 @@ final class BaseHealthKitManager: HealthKitManager, Injectable {
     @SyncAccess @Persisted(key: "BaseHealthKitManager.newGlucose") private var newGlucose: [BloodGlucose] = []
 
     // last anchor for HKAnchoredQuery
-    private var lastBloodGlucoseQueryAnchor: HKQueryAnchor! {
+    private var lastBloodGlucoseQueryAnchor: HKQueryAnchor? {
         set {
-            persistedAnchor = (
-                try? NSKeyedArchiver.archivedData(withRootObject: newValue as Any, requiringSecureCoding: false)
-            ) ?? Data()
+            persistedAnchor = try? NSKeyedArchiver.archivedData(withRootObject: newValue as Any, requiringSecureCoding: false)
         }
         get {
-            (try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(persistedAnchor) as? HKQueryAnchor) ??
-                HKQueryAnchor(fromValue: 0)
+            guard let data = persistedAnchor else { return nil }
+            return try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data) as? HKQueryAnchor
         }
     }
 
-    @SyncAccess @Persisted(key: "HealthKitManagerAnchor") private var persistedAnchor = Data()
+    @Persisted(key: "HealthKitManagerAnchor") private var persistedAnchor: Data? = nil
 
     var isAvailableOnCurrentDevice: Bool {
         HKHealthStore.isHealthDataAvailable()
@@ -234,7 +229,7 @@ final class BaseHealthKitManager: HealthKitManager, Injectable {
             predicate: predicate,
             anchor: lastBloodGlucoseQueryAnchor,
             limit: HKObjectQueryNoLimit
-        ) { [weak self] _, addedObjects, deletedObjects, anchor, _ in
+        ) { [weak self] _, addedObjects, _, anchor, _ in
             guard let self = self else { return }
             self.processQueue.async {
                 debug(.service, "AnchoredQuery did execute")
@@ -247,13 +242,6 @@ final class BaseHealthKitManager: HealthKitManager, Injectable {
                 {
                     self.prepareSamplesToPublisherFetch(bgSamples)
                 }
-
-                // Deleted objects
-                if let deletedSamples = deletedObjects,
-                   deletedSamples.isNotEmpty
-                {
-                    self.deleteSamplesFromLocalStorage(deletedSamples)
-                }
             }
         }
         return query
@@ -297,31 +285,6 @@ final class BaseHealthKitManager: HealthKitManager, Injectable {
         )
     }
 
-    private func deleteSamplesFromLocalStorage(_ deletedSamples: [HKDeletedObject]) {
-        guard settingsManager.settings.useAppleHealth,
-              let sampleType = Config.healthBGObject,
-              checkAvailabilitySave(objectTypeToHealthStore: sampleType),
-              deletedSamples.isNotEmpty
-        else { return }
-
-        let removingBGID = deletedSamples.map {
-            $0.metadata?[HKMetadataKeySyncIdentifier] as? String ?? $0.uuid.uuidString
-        }
-
-        func delete(samples: [HKSample]) {
-            let sampleIDs = samples.map(\.syncIdentifier)
-            let idsToRemove = removingBGID.filter { !sampleIDs.contains($0) }
-            debug(.service, "Delete HealthKit objects: \(idsToRemove)")
-            glucoseStorage.removeGlucose(ids: idsToRemove)
-            newGlucose = newGlucose.filter { !idsToRemove.contains($0.id) }
-        }
-
-        loadSamplesFromHealth(sampleType: sampleType, withIDs: removingBGID)
-            .receive(on: processQueue)
-            .sink(receiveValue: delete)
-            .store(in: &lifetime)
-    }
-
     func fetch() -> AnyPublisher<[BloodGlucose], Never> {
         Future { [weak self] promise in
             guard let self = self else {