Статьи

Сколько шагов я прошел вчера: использование Cordova, HealthKit, JavaScript и несколько обещаний

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

Я собираюсь немного погулять, должен достичь этих целей. 🙂