Как люди, которые знают меня, возможно, знают, что я уже несколько лет играю с различными носимыми устройствами, начиная с 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 вместе с целым рядом других интересных библиотек.
Я собираюсь немного погулять, должен достичь этих целей. ?