Search code examples
swiftwatchkithealthkit

Pass saved Workout from Watch to iPhone


On Watch, I'm able to pass a saved workout from the WorkoutInterfaceController to the SummaryInterfaceController. But I was wondering how to pass the saved workout from the Watch to the iPhone (so I can display it in a Summary View Controller too).

Do you know? Or is there a better way I'm supposed to do this?

Here's what I use to pass the saved workout from WorkoutInterfaceController to the SummaryInterfaceController:

private func saveWorkout() {
    // Create and save a workout sample
    let configuration = workoutSession!.workoutConfiguration
    let isIndoor = (configuration.locationType == .indoor) as NSNumber
    print("locationType: \(configuration)")

    let workout = HKWorkout(activityType: configuration.activityType,
                            start: workoutStartDate!,
                            end: workoutEndDate!,
                            workoutEvents: workoutEvents,
                            totalEnergyBurned: totalEnergyBurned,
                            totalDistance: totalDistance,
                            metadata: [HKMetadataKeyIndoorWorkout:isIndoor]);

    healthStore.save(workout) { success, _ in
        if success {
            self.addSamples(toWorkout: workout)
        }
    }

    WKInterfaceController.reloadRootControllers(withNames: ["SummaryInterfaceController"], contexts: [workout])
}

private func addSamples(toWorkout workout: HKWorkout) {
    // Create energy and distance samples
    let totalEnergyBurnedSample = HKQuantitySample(type: HKQuantityType.activeEnergyBurned(),
                                                   quantity: totalEnergyBurned,
                                                   start: workoutStartDate!,
                                                   end: workoutEndDate!)

    // Add samples to workout
    healthStore.add([totalEnergyBurnedSample], to: workout) { (success: Bool, error: Error?) in
        if success {
            // Samples have been added
        }
    }
}

Let me know if any questions or information needed, thanks!


Solution

  • As a part of my research and development,I discovered how the pairing of the iPhone and the Apple Watch has the potential to be useful. In this case, tapping on a button on the Watch app will send text on the iPhone.

    To make a simple demo of this functionality, place a button on the WatchKit interface and a label on the iOS app’s storyboard.

    Now, hook up the button to the WatchKit Interface Controller as an IBAction in order to respond to button tap events. Also hook up the Label to the UI View Controller as an IBOutlet.

    In the Interface Controller, we make up a string variable to send to the label and in the button’s IBAction method, make a dictionary that includes the string variable you made. This dictionary is what is passed to the iPhone app.

    class InterfaceController: WKInterfaceController {
        Var str: String = "Hello Phone"
        @IBAction func button() {
            let dict: Dictionary = ["message": str]
        }
    

    Use the following method to send the dictionary to the iPhone.

    WKInterfaceController.openParentApplication(dict, reply: {(reply, error) -> void in
         print("Reply receive from iPhone app")
    })
    

    In the AppDelegate of the iOS app, add the following application method. This is what will handle the previous methods communication from the Watch. Also we can use a notification to notify a view controller that data has been received and to pass it along.

    func application(application: UIApplication, handleWatchkitExtensionRequest userInfo: [NSObject : AnyObject]?, reply:(([NSObject : AnyObject]!) {
        NSNotificationCenter.defaultCenter().postNotificationName("WatchKitReq", object: userInfo)
    }
    

    Finally in the view controller, make a listener for the notification that will update the label’s text to the string that was sent with the data.

    class ViewController: UIViewController {
            @IBOutlet weak var label: UILabel!
            override func viewDidLoad() {
              super.viewDidLoad()
              NSNotificationCenter.defaultCenter().addObserver(self, selector("handleWatchKitNotification:"), name: "WatchKitReq", object: nil)
    }
    func handleWatchKitNotification(notification: NSNotification) {
        if let userInfo = notification.object as? [String : String] {
            label.text = userInfo["message"]
        }
    }
    

    Hope this will help you to understand. For more concerns you can look on this,

    Delegate Method