.Net Maui app completion handlers and iOS HealthKit not working with HttpClient

250 Views Asked by At

This works perfectly in Android.

public async Task<double> UploadData()
    {
        double steps = 0.0;

        await _healthData.GetSteps((totalSteps) =>
        {
            SentrySdk.CaptureMessage("totalSteps = " + totalSteps);

            MainThread.BeginInvokeOnMainThread(() =>
            {
                steps = totalSteps;
                //Task.Delay(1000);
            });

        });

        SentrySdk.CaptureMessage("UploadData steps = " + steps);

        var fitness = new Fitness();
        fitness.Steps = steps;

        await _restService.SaveItemAsync(fitness, true);

        return steps;
    }

In iOS, totalSteps is correct, but steps is still 0 when fitness.Steps = steps runs. Bottom line, I can't get the totalSteps value from inside the _healthData.GetSteps((totalSteps) operation. The Android Google Fit and iOS HealthKit API calls run with completion handlers.

At this stage, I'm just trying to figure out how to upload data (steps, calories, active minutes, distance) to my server.

Does anyone know how to make this work? I can display all the data (steps, calories, active minutes, distance) in a View using an ObservableCollection.

1

There are 1 best solutions below

2
Dumber_Texan2 On BEST ANSWER

I got this to work by embedding the calls like so.

_healthData.GetHealthPermissionAsync((result) =>
        {
            if (result)
            {
                _healthData.FetchSteps((totalSteps) =>
                {                        

                    _healthData.FetchMetersWalked((metersWalked) =>
                    {
                        
                        _healthData.FetchActiveMinutes((activeMinutes) =>
                        {
                                           
                        
                       _healthData.FetchActiveEnergyBurned((caloriesBurned) =>
                            {
                               
                                var fitness = new Fitness();
                                fitness.Steps = totalSteps;
                                fitness.Calories = caloriesBurned;
                                fitness.Distance = metersWalked;
                                fitness.Minutes = activeMinutes;

                                _restService.SaveItemAsync(fitness, true);

                            });

                        });

                    });

                });
            }
        });