Просмотр исходного кода

Request new watchState data onAppear and when session activates WIP

Deniz Cengiz 1 год назад
Родитель
Сommit
066d540f1c

+ 3 - 0
Trio Watch App Extension/Views/TrioMainWatchView.swift

@@ -60,6 +60,9 @@ struct TrioMainWatchView: View {
                 }
             }
             .onAppear {
+                // request fresh data from watch
+                state.requestWatchStateUpdate()
+
                 // reset input amounts
                 state.bolusAmount = 0
                 state.carbsAmount = 0

+ 22 - 0
Trio Watch App Extension/WatchState.swift

@@ -269,6 +269,21 @@ import WatchConnectivity
         }
     }
 
+    func requestWatchStateUpdate() {
+        guard let session = session, session.activationState == .activated else {
+            session?.activate()
+            return
+        }
+
+        if session.isReachable {
+            print("⌚️ Request an update for watch state from Trio iPhone app...")
+
+            session.sendMessage(["requestForWatchUpdate": "watchState"], replyHandler: nil) { error in
+                print("⌚️ Update request for fresh watch state data: \(error.localizedDescription)")
+            }
+        }
+    }
+
     private func processRawDataForWatchState(_ message: [String: Any]) {
         if let acknowledged = message["acknowledged"] as? Bool,
            let ackMessage = message["message"] as? String
@@ -428,9 +443,16 @@ import WatchConnectivity
                 print("⌚️ Watch session activation failed: \(error.localizedDescription)")
                 return
             }
+            
+            // the order here is probably not perfect and needsto be re-arranged
+            if activationState == .activated {
+                self.requestWatchStateUpdate()
+            }
 
             print("⌚️ Watch session activated with state: \(activationState.rawValue)")
+            
             self.isReachable = session.isReachable
+            
             print("⌚️ Watch isReachable after activation: \(session.isReachable)")
         }
     }

+ 14 - 0
Trio/Sources/Services/WatchManager/AppleWatchManager.swift

@@ -428,6 +428,20 @@ final class BaseWatchManager: NSObject, WCSessionDelegate, Injectable, WatchMana
 
     func session(_: WCSession, didReceiveMessage message: [String: Any]) {
         DispatchQueue.main.async { [weak self] in
+
+            // watch requested for FRESH watchState data!
+            if let requestWatchUpdate = message["requestWatchUpdate"] as? String,
+               requestWatchUpdate == "watchState"
+            {
+                debug(.watchManager, "📱 Watch requested watch state data update.")
+                if let self = self {
+                    Task {
+                        let state = await self.setupWatchState()
+                        await self.sendDataToWatch(state)
+                    }
+                }
+            }
+
             if let bolusAmount = message["bolus"] as? Double,
                message["carbs"] == nil,
                message["date"] == nil