Search code examples
dotnet-httpclienthealthkitcompletionhandler.net-maui

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


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.


Solution

  • 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);
    
                                });
    
                            });
    
                        });
    
                    });
                }
            });