Для группового проекта, над которым я работаю в школе, мне нужно было выяснить, какое решение лучше всего подойдет для нашего приложения. В этом блоге я поделюсь своими выводами о CMPedometer от Core Motion.

Core Motion - это инструмент, предоставляемый Apple, который позволяет получить доступ к сопроцессору движения в iPhone 5S и более поздних версиях. Он обрабатывает данные от встроенного акселерометра, гироскопа и компаса телефона. iPhone 6 и новее также имеют доступ к барометру. В последней версии этот процессор известен как M9.

Сопроцессор iPhone M9 всегда отслеживает эти данные и временно сохраняет их для использования. Важно отметить, что Core Motion одновременно хранит только текущий 7-дневный период. Вот некоторые из доступных данных на основе фитнеса:

CMPедометр

CMPedometer позволяет получить доступ к пешеходным мероприятиям. Это включает в себя количество шагов, расстояние, количество этажей (подъем по лестнице), темп и частоту шагов. Вы можете проверить, доступны ли эти данные, используя методы фреймворка:

//Start by importing CoreMotion
import CoreMotion
//Create an instance of CMPedometer
let pedometer = CMPedometer()

Теперь вы можете использовать шагомер, чтобы проверить, есть ли на устройстве следующие данные, показанные в фрагменте кода ниже. Обратите внимание: всегда полезно проверить, доступны ли данные, прежде чем пытаться их запросить.

//These return BOOL values that tell you if the device has this data available:
pedometer.isStepCountingAvailable()
pedometer.isDistanceAvailable()
pedometer.isFloorCountingAvailable()
pedometer.isPaceAvailable()
pedometer.isCadenceAvailable()
//Apple Documentation

Теперь мы можем запросить экземпляр CMPedometer в течение заданного периода времени и получить доступ к данным, полученным обратно в обработчике завершения.

//Create a NSCalendar
let calendar = NSCalendar.currentCalendar()
//create an NSDate that is the time period for yesterday
let yesterday = calendar.dateByAddingUnit(.Day, value: -1, toDate: NSDate(), options: [])
//Safely unwrap the optional NSDate
if let today = today {
//Use the NSDate to get the data from the CMPedometer instance for yesterday till the current moment
pedometer.queryPedometerDataFromDate(yesterday, toDate: NSDate()) { data, error in
//Unwrap the data and make sure we didn't run into an error
guard let activityData = data where error == nil else {
print("There was an error getting the data: \(error)")
return
}
//prints out step count
print("Steps: \(activityData.numberOfSteps)")
//print out optional distance in of walking and running in meters
print("Distance \(activityData.distance)")
//print out optional floors ascended
print("Floors ascended: \(activityData.floorsAscended)")
//print out optional floors descended
print("Floors descended \(activityData.floorsDescended)")
}
}

Пример вывода может выглядеть так:

Steps: 14457
Distance Optional(11546.85863591393)
Floors ascended: Optional(7)
Floors descended Optional(7)

Вы также можете начать отслеживать живую сессию:

//Calls the pedometer to start live updating the data from a specific date. In this case, for the data when it is called. It will regularly call this method until you ask it to stop.
pedometer.startPedometerUpdatesFromDate(NSDate()) { data, error in
guard let activityData = data where error == nil else {
print("There was an error getting the data: \(error)")
return
}
//You can than do something with the data that is being provided back. 
print("Steps: \(activityData.numberOfSteps)")
print("Distance: \(activityData.distance)")
print("Floors ascended: \(activityData.floorsAscended)")
print("Floors descended: \(activityData.floorsDescended)")
print("Current Pace: \(activityData.currentPace)")
print("Current Cadence: \(activityData.currentCadence)")
}

Вот и все. Основы работы с классом CMPedometer. Это может быть отличным способом получить базовые данные о движении, с которыми вы можете работать и предоставлять своим пользователям.