Как люди, которые знают меня, возможно, знают, что я уже несколько лет играю с различными носимыми устройствами, начиная с Nike Fuel Band, а также пробуя продукты Misfit и UP. Я в основном просто с интересом наблюдала за уровнями моих упражнений, и, действительно, теперь сплю, у нас в доме есть маленький, который со временем поднимался и опускался.
Совсем недавно, с появлением HealthKit, появился стандартный метод доступа к этой информации из нескольких продуктов на iPhone. Мне нужно было освежить свой JavaScript для работы, поэтому я решил поиграть в Кордове. строить что-то в свободное время. Одна из замечательных особенностей этого сообщества Cordova по сравнению с другими средами разработки приложений — это большое и здоровое сообщество плагинов — и быстрый Google, и я нашел то, что мне нужно для поддержки HealthKit HealthKit . Мне потребовалось лишь небольшое количество исправлений , чтобы получить информацию, которую я хотел. В этом блоге я просто рассмотрю количество шагов в день в качестве показателя активности.
Я собираюсь предположить, что остальная часть приложения Cordova на месте, и начать с простого носимого объекта, который предоставляет обещание, позволяющее проверить, доступен ли HealthKit на этой платформе, у вас может быть iOS 8, но HealthKit — это только iPhone. Помните, что большая часть Cordova взаимодействует с кучей асинхронных собственных систем, поэтому вы должны убедиться, что учитываете это при работе с ним. Отсюда и либеральное использование обещаний . (Если вы хотите поддерживать <iOS 8, вам нужно будет использовать другую библиотеку обещаний / shim). В этом случае я также использую библиотеку underscorejs для создания обещания, результат которого не будет рассчитан, пока он не будет вызван для первый раз.
var wearable = {
avaliable: _.once(function() {
return new Promise(function(resolve, reject) {
if (window.plugins.healthkit) {
window.plugins.healthkit.available(
function() {
console.log("Healthkit is avaliable");
resolve(true);
},
function() {
console.log("Healthkit is not avaliable");
reject(Error(false));
}
);
} else {
reject(Error("HealthKit Not Available"));
}
});
}),
...
}
Следующий этап кода, когда вы убедитесь, что система доступна, — это проверка того, что вы можете получить доступ к данным, к которым хотите получить доступ. Теперь в руководстве разработчика Apple четко указано, что вам следует запрашивать только те данные, к которым вы, возможно, захотите получить доступ один раз. Поэтому не нужно запрашивать данные шага один раз, а не данные о скорости здоровья в другой части пользовательского интерфейса. Плагин Cordova HealthKit просто вернется с успехом, если эти значения уже авторизованы, поэтому мы будем использовать другое обещание в качестве шлюза для фактической работы с данными, чтобы создать одну согласованную точку входа для авторизации.
var wearable = {
...
getHealthKit : _.once(function() {
return wearable.avaliable().then(function() {
return new Promise(function(resolve, reject) {
window.plugins.healthkit.requestAuthorization(
{
'readTypes': ['HKQuantityTypeIdentifierStepCount'],
'writeTypes': []
},
function() {
console.log("HealthKit authorisation accepted");
resolve(window.plugins.healthkit);
},
function() {
reject(Error("HealthKit authorisation rejected"));
});
});
});
}),
...
}
Наконец, теперь у нас есть все подготовительные работы, давайте предложим простой метод определения количества шагов, записанных вчера. Затем я использую специальную функцию sumQuantityType, которая выполняет довольно умную статистическую работу для вас. Подумайте, есть ли у вас iPhone 6 вместе с браслетом для пошагового мониторинга, например Apple Watch, в HealthKit у вас будет две партии данных, которые непоследовательно перекрываются. HealthKit предоставляет методы для решения этой проблемы, дополнительную информацию можно найти в презентации WWDC от 2014 года , но в основном он рассчитывает для каждого временного сегмента, какой источник (источники) данных использовать для получения значения для запрошенного временного диапазона.
var wearable = {
...
querySteps : function() {
return wearable.getHealthKit().then(function (healthkit)
{
return new Promise(function(resolve, reject) {
var m = moment().startOf('day');
var endDate = m.toDate();
var startDate = moment(m).subtract('d', 1).toDate();
healthkit.sumQuantityType({
'startDate': startDate,
'endDate': endDate,
'sampleType': "HKQuantityTypeIdentifierStepCount"
},
function(value)
{
resolve(value)
},
function()
{
reject(Error("Problem queuing steps"));
});
});
}
}
Теперь у нас есть этот объект, мы можем получить доступ к данным и показать их пользователю. Обратите внимание, что объекты обещаний цепочки, так что функция catch скажет вам, если что-то пошло не так на каком-либо этапе процесса, если бы вы попытались связать это с обработчиками событий, у вас был бы безбожный беспорядок кода и обратных вызовов.
wearable.querySteps()
.then(function(value){
console.log("Number of steps " + value);
... update UI
})
.catch(function (error) {
... update UI
};
Это, конечно, только начало, есть еще много интересного, что вы можете получить с помощью этого API; но это на другой день. Мне нравится HealthKit, потому что, в отличие от GoogleFit, все ваши данные о здоровье по умолчанию хранятся локально. Здесь есть большой потенциал для того, чтобы делать интересные вещи.
Наконец, быстрый крик Эдди Вербруггена, который создал плагин HealthKit вместе с целым рядом других интересных библиотек.
Я собираюсь немного погулять, должен достичь этих целей. ?