71 lines
2.2 KiB
Swift
71 lines
2.2 KiB
Swift
import Foundation
|
|
import WatchConnectivity
|
|
|
|
class PhoneConnector: NSObject, ObservableObject, WCSessionDelegate {
|
|
static let shared = PhoneConnector()
|
|
private var workoutManager: WorkoutManager?
|
|
|
|
private override init() {
|
|
super.init()
|
|
}
|
|
|
|
func setup(workoutManager: WorkoutManager) {
|
|
self.workoutManager = workoutManager
|
|
if WCSession.isSupported() {
|
|
let session = WCSession.default
|
|
session.delegate = self
|
|
session.activate()
|
|
}
|
|
}
|
|
|
|
// Send completed workout data to phone
|
|
static func sendCompletedWorkout(_ laps: [[String: Any]], duration: TimeInterval, workoutId: String) {
|
|
let message: [String: Any] = [
|
|
"type": "workoutCompleted",
|
|
"workoutId": workoutId,
|
|
"laps": laps,
|
|
"duration": duration,
|
|
]
|
|
|
|
if WCSession.default.isReachable {
|
|
WCSession.default.sendMessage(message, replyHandler: nil) { error in
|
|
print("Failed to send: \(error)")
|
|
}
|
|
} else {
|
|
WCSession.default.transferUserInfo(message)
|
|
}
|
|
}
|
|
|
|
// MARK: - WCSessionDelegate
|
|
|
|
func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {
|
|
print("WatchConnectivity activated: \(activationState.rawValue)")
|
|
}
|
|
|
|
func session(_ session: WCSession, didReceiveMessage message: [String: Any]) {
|
|
DispatchQueue.main.async { [weak self] in
|
|
self?.handleMessage(message)
|
|
}
|
|
}
|
|
|
|
func session(_ session: WCSession, didReceiveUserInfo userInfo: [String: Any] = [:]) {
|
|
DispatchQueue.main.async { [weak self] in
|
|
self?.handleMessage(userInfo)
|
|
}
|
|
}
|
|
|
|
private func handleMessage(_ message: [String: Any]) {
|
|
guard let type = message["type"] as? String else { return }
|
|
|
|
switch type {
|
|
case "workoutPlan":
|
|
if let data = try? JSONSerialization.data(withJSONObject: message),
|
|
let workout = try? JSONDecoder().decode(StoredWorkout.self, from: data) {
|
|
workoutManager?.addWorkoutFromPhone(workout)
|
|
}
|
|
default:
|
|
break
|
|
}
|
|
}
|
|
}
|