Как считать шаги в реальном времени в iOS с помощью Xamarin

Я написал интерфейс и реализацию Android для подсчета шагов с помощью Android SensorService. Сейчас я пытаюсь сделать то же самое для iOS. Я не могу найти никаких примеров кода по этой теме, кроме этого https://github.com/xamarin/ios-samples/blob/master/PrivacyPrompts/PrivacyPrompts/PrivacyManager/MotionPrivacyManager.cs который возвращает количество шагов между двумя интервалы. Но мне нужно следить за количеством шагов в реальном времени. Или близко к этому. Android SensorService имеет некоторую задержку, но делает это в режиме реального времени. Мне нужно сделать то же самое для iOS. Есть ли способ сделать в iOS?

Может быть, мне нужно сделать временное окно из 2-х таймфреймов и попытаться отслеживать данные таким образом? Но временные рамки могут быть очень маленькими, от секунды до 5 минут. Будет ли это даже работать?

using CoreMotion;
using Foundation;
using UIKit;

namespace PrivacyPrompts
{
public class MotionPrivacyManager : IPrivacyManager, IDisposable
{
    CMStepCounter stepCounter;
    string motionStatus = "Indeterminate";
    nint steps = 0;

    CMMotionManager motionManger; // before iOS 8.0
    CMPedometer pedometer; // since iOS 8.0

    public MotionPrivacyManager ()
    {
        if (UIDevice.CurrentDevice.CheckSystemVersion (8, 0)) {
            pedometer = new CMPedometer ();
            motionStatus = CMPedometer.IsStepCountingAvailable ? "Available" : "Not available";
        } else {
            stepCounter = new CMStepCounter ();
            motionManger = new CMMotionManager ();
            motionStatus = motionManger.DeviceMotionAvailable ? "Available" : "Not available";
        }
    }

    public Task RequestAccess ()
    {
        var yesterday = NSDate.FromTimeIntervalSinceNow (-60 * 60 * 24);

        if (UIDevice.CurrentDevice.CheckSystemVersion (8, 0)) {
            if(!CMPedometer.IsStepCountingAvailable)
                return Task.FromResult<object> (null);

            return pedometer.QueryPedometerDataAsync (yesterday, NSDate.Now)
                .ContinueWith (PedometrQueryContinuation);
        } else {
            if (!motionManger.DeviceMotionAvailable)
                return Task.FromResult<object> (null);

            return stepCounter.QueryStepCountAsync (yesterday, NSDate.Now, NSOperationQueue.MainQueue)
                .ContinueWith (StepQueryContinuation);
        }

    }

    void PedometrQueryContinuation(Task<CMPedometerData> t)
    {
        if (t.IsFaulted) {
            var code = ((NSErrorException)t.Exception.InnerException).Code;
            if (code == (int)CMError.MotionActivityNotAuthorized)
                motionStatus = "Not Authorized";
            return;
        }

        steps = t.Result.NumberOfSteps.NIntValue;
    }

    void StepQueryContinuation(Task<nint> t)
    {
        if (t.IsFaulted) {
            var code = ((NSErrorException)t.Exception.InnerException).Code;
            if (code == (int)CMError.MotionActivityNotAuthorized)
                motionStatus = "Not Authorized";
            return;
        }

        steps = t.Result;
    }

    public string CheckAccess ()
    {
        return motionStatus;
    }

    public string GetCountsInfo()
    {
        return steps > 0 ? string.Format ("You have taken {0} steps in the past 24 hours", steps) : string.Empty;
    }

    public void Dispose ()
    {
        motionManger.Dispose ();
        stepCounter.Dispose ();
    }
}

0 ответов

Другие вопросы по тегам