Работа с HealthKit. Часть 1

от автора


В цикле статей наши коллеги из Techmas поделятся опытом работы с HealthKit и созданием приложений для фитнеса. Первая статья является вводной по технологии и рассматривает приложение, которое выбирает персональные данные из Health.

Платформа HealthKit была опубликована компанией Apple в iOS 8. Она представляет собой API для сторонних приложений, который позволяет использовать собирать информацию о состояние здоровья пользователя. HealthKit включает в себя предустановленное по умолчанию на iOS8 и iOS9 приложение Health, которое отображает все имеющиеся данные: физическая нагрузка, питание, давление, калории, время сна и прочие персональные характеристики.

Сразу после запуска платформы разработчики столкнулись с рядом проблем, которые привели к временному запрету на ее интеграцию. Сейчас все исправлено и отлажено, а приложений в AppStore с использованием HealthKit становится все больше.

Общие сведения

Итак, HealthKit является агрегатом с интерфейсом для доступа ко всей информации:

Преимущества его использования для разработчиков приложений:

  • HealthKit служит общим хранилищем данных для набора приложений. Например, для подсчета количества шагов пользователи могут использовать как разные приложения, так и разные устройства. При установке каждого нового приложения история будет сохраняться.
  • Разные приложения могут обмениваться данными друг с другом без использования дополнительных интеграционных решений. Вся информация доступна в приложение Health.
  • HealthKit дает возможность для настройки отдельных прав каждому приложению по определенным показателям.
  • Расширения функционала приложений за счет использования дополнительных данных о здоровье от сторонних приложений.

Отметим, что HealthKit и приложение Health пока недоступны для iPad.

Немного теории

Сам HealthKit представляет собой иерархию неизменяемых классов, наследуемых от абстрактного класса HKObject.

Каждый объект имеет свойства:

  • UUID. Уникальный идентификатор записи.
  • Source. Источник данных (может быть как устройство, так и приложение).
  • Metadata. Дополнительные данные о записи. Предоставляет собой словарь, содержащий как предопределенные, так и пользовательские ключи.

Объекты в HealthKit могут быть двух типов: характеристики (characteristics) и выборки (samples). Характеристики представляют собой данные, которые не изменяются со временем: пол, дата рождения, группа крови. Сторонние приложения не могут изменять эти данные. Выборки же доступны для добавления новых данных. Это объекты классов, наследуемых от HKSample. Они имеют следующие свойства:

  • Type. Тип выборки: количество шагов, время сна, пр.
  • Start time. Начало времени выборки.
  • End time. Конец времени расчета выборки. Если выборка в моменте, то значение совпадает с началом времени.

Пример приложения

Ниже мы рассмотрим создание приложения, которое запрашивает использование HealthKit и выводит данные по характеристикам пользователя.

Права на использование HealthKit

Использовать HealthKit могут только те приложения, для которых использование HealthKit APIs является основным функционалом. Например, приложение для органайзера и ведения записей не будет отображать данные о состояние здоровья. Кроме этого, есть и ряд других ограничений:

  • Данные о здоровье не могут быть использованы в рекламных целях. При этом сами приложения с HealthKit могут использовать рекламные блоки и зарабатывать на объявлениях.
  • Приложение может делиться информацией из HealthKit только с разрешения пользователя и только с тем приложением, которое также авторизовано и использует HealthKit.

Весь список ограничений доступен на сайте Apple.

Теперь добавим HealthKit в тестовое приложение. Для этого, во-первых, установим расширение для HealthKit в настройках проекта.
Важно, что App ID должен сдержать строку HealthKit, иначе опция будет недоступна.

Далее добавим разрешение пользователя на использование данных о состояние здоровья.

Импортируем расширение для использования HealthKit:

import HealthKit

Теперь необходимо определить объект класса HKHealthStore, который является одним из основных в HealthKit. HealthKitStore позволяет получить права на доступ к данным HealthKit, возможность считывать характеристики и записывать новые выборки:

let healthKitStore: HKHealthStore = HKHealthStore()

Как мы отмечали ранее, пользователь выбирает только отдельные характеристики, к которым приложение имеет доступ. Все типы являются потомками HKObjectType.

Создадим функцию

 authorizeHealthKit(completion: ((success:Bool, error:NSError!) -> Void)!)

В ней определим данные для чтения и записи.

Данные для чтения (характеристики):

 let healthKitTypesToRead = Set(arrayLiteral:     HKObjectType.characteristicTypeForIdentifier(HKCharacteristicTypeIdentifierDateOfBirth)!,     HKObjectType.characteristicTypeForIdentifier(HKCharacteristicTypeIdentifierBiologicalSex)! ) 

Данные для чтения и записи (выборки):

 let healthKitTypesToWrite = Set(arrayLiteral:     HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierActiveEnergyBurned)!,     HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierDistanceWalkingRunning)! ) 

Кроме этого, добавим проверку на использование HKHealthStore на устройстве (на данный момент HealthKit недоступен на iPad):

 if !HKHealthStore.isHealthDataAvailable() {     let error = NSError(domain: "ru.techmas.techmasHealthKit", code: 2, userInfo: [NSLocalizedDescriptionKey:"HealthKit is not available in this Device"])     if( completion != nil )     {         completion(success:false, error:error)     }     return; } 

Наконец, запросим авторизацию передав в параметрах два набора с типами Set<HKSampleType> и Set<HKObjectType> для чтения и записи соответственно:

 healthKitStore.requestAuthorizationToShareTypes(healthKitTypesToWrite, readTypes: healthKitTypesToRead) {     (success, error) -> Void in     if( completion != nil )     {         completion(success:success,error:error)     } } 

Добавим вызов функции в viewDidLoad():

 authorizeHealthKit { (authorized,  error) -> Void in if authorized {     print("HealthKit authorization received.") } else {     print("HealthKit authorization denied!")     if error != nil {         print("\(error)")     } } 

При запуске приложения будет доступно окно:

Чтение характеристик

Следующим шагом получим характеристики. Добавим пол и возраст в приложение Health:

Создадим функцию readProfile(). Ее код приведен ниже:

 func readProfile() -> (age:NSDate?, bioSex:HKBiologicalSexObject?) {     // Reading Characteristics     var bioSex : HKBiologicalSexObject?     var dateOfBirth : NSDate?          do {         dateOfBirth = try healthKitStore.dateOfBirth()         bioSex = try healthKitStore.biologicalSex()     }     catch {         print(error)     }     return (dateOfBirth, bioSex) } 

Для доступа к характеристикам мы воспользовались созданным объектом healthKitStore.
Возможные идентификаторы и их типы для получения характеристик доступы в документации по ссылке.

Теперь используя следующее обращение мы получаем набор характеристик пользователя:

let profile = readProfile()

Код примера доступен в git.

В следующих статьях мы отдельно опишем способы получения выборок и добавления данных по тренировкам.

ссылка на оригинал статьи http://habrahabr.ru/post/271133/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *