Измерение и приборостроение
Использование API Ios Healthkit для отслеживания и отображения данных о фитнесе
Table of Contents
Введение в API HealthKit от Apple
В эпоху, когда персональные данные о здоровье дают действенные идеи, API iOS HealthKit стал краеугольным камнем для разработчиков, создающих приложения для фитнеса и хорошего самочувствия. Эта структура, представленная Apple с iOS 8, обеспечивает единый, безопасный репозиторий для информации о здоровье и активности. Интегрируя HealthKit, ваше приложение может читать и писать в хранилище данных приложения Health, позволяя пользователям видеть консолидированный взгляд на свои шаги, частоту сердечных сокращений, анализ сна, журналы питания и даже клинические записи. В этой статье рассматривается, как использовать API HealthKit для эффективного отслеживания и отображения данных о фитнесе, охватывающих рабочие процессы разрешения, стратегии запросов, визуализацию данных и лучшие практики производства.
Понимание архитектуры HealthKit
HealthKit организует данные вокруг двух основных концепций: типов данных и объектов данных . Типы данных определяют категорию измерений, такую как или . Объектами данных являются фактические записи, которые могут быть выборки (одно измерение или событие), корреляции (группы связанных образцов)] или тренировки . Хранилище HealthKit шифруется на устройстве и синхронизируется через iCloud, но только тогда, когда пользователь явно позволяет синхронизировать Health. Каждый запрос доступа должен быть авторизован пользователем через системный диалог, обеспечивая соблюдение конфиденциальности.
Ключевые компоненты
- HKHealthStore — центральная точка входа для всех операций HealthKit.
- HKObjectType — Идентифицирует тип данных о здоровье (количество, категория или характеристика).
- HKSampleQuery — извлекает фиксированный набор хранимых образцов.
- HKStatisticsQuery — вычисляет агрегированные значения (сумма, среднее, мин, макс и т.д.) за временной интервал.
- HKObserverQuery — мониторы для изменений в заданных типах данных, позволяющие обновлять фон.
Настройка разрешений - запрос доступа
Перед любым обменом данными ваше приложение должно запросить разрешение с использованием . Вы должны объявить разрешения на чтение и запись в с ключами и . Для отслеживания фитнеса вы обычно читаете количество шагов, активную энергию, частоту сердечных сокращений и потенциально записываете тренировки.
import HealthKit
let healthStore = HKHealthStore()
func requestHealthPermissions() {
guard HKHealthStore.isHealthDataAvailable() else { return }
let readTypes: Set<HKObjectType> = [
HKObjectType.quantityType(forIdentifier: .stepCount)!,
HKObjectType.quantityType(forIdentifier: .heartRate)!,
HKObjectType.quantityType(forIdentifier: .activeEnergyBurned)!,
HKObjectType.categoryType(forIdentifier: .sleepAnalysis)!
]
let writeTypes: Set<HKSampleType> = [
HKObjectType.workoutType()
]
healthStore.requestAuthorization(toShare: writeTypes, read: readTypes) { success, error in
// Handle response
}
}
Всегда бережно относитесь к обратному вызову авторизации. Если пользователь отказывается, избегайте блокировки функциональности; вместо этого объясните, почему данные необходимы, и предоставьте альтернативу (например, ручную запись). Помните, что разрешения могут быть изменены позже на вкладке «Источники» приложения «Здоровье».
Запрос данных о фитнесе
HealthKit предлагает несколько типов запросов для эффективного сбора данных. Наиболее распространенными для фитнес-приложений являются запросы выборки и запросы статистики.
HKSampleQuery - поиск исходных данных
Используйте , когда вам нужны отдельные записи, такие как последние 100 показаний частоты сердечных сокращений или сегодняшние журналы шагов. Укажите предикат для фильтрации по дате, источнику или значению. Для производительности всегда ограничивайте количество возвращаемых результатов.
let stepType = HKQuantityType.quantityType(forIdentifier: .stepCount)!
let startDate = Calendar.current.startOfDay(for: Date())
let predicate = HKQuery.predicateForSamples(withStart: startDate, end: Date(), options: .strictStartDate)
let query = HKSampleQuery(sampleType: stepType, predicate: predicate, limit: HKObjectQueryNoLimit, sortDescriptors: nil) { query, samples, error in
guard let samples = samples as? [HKQuantitySample] else { return }
// Process samples
}
healthStore.execute(query)
HKStatisticsQuery - агрегированные данные
Для итогов, средних или максимальных значений за определенный период (например, ежедневное количество шагов) используйте .
let statisticsQuery = HKStatisticsQuery(quantityType: stepType, quantitySamplePredicate: predicate, options: .cumulativeSum) { query, result, error in
let sum = result?.sumQuantity()?.doubleValue(for: HKUnit.count()) ?? 0
// Update UI with total steps
}
healthStore.execute(statisticsQuery)
HKStatisticsCollectionQuery - Данные временных рядов
Чтобы отобразить график шагов в день за прошедшую неделю, используйте . Он подбирает статистику за каждый день между датой начала и концом, что делает его идеальным для тенденций.
let now = Date()
let sevenDaysAgo = Calendar.current.date(byAdding: .day, value: -7, to: now)!
let anchorDate = Calendar.current.startOfDay(for: now)
let daily = DateComponents(day: 1)
let collectionQuery = HKStatisticsCollectionQuery(quantityType: stepType, quantitySamplePredicate: nil, options: .cumulativeSum, anchorDate: anchorDate, intervalComponents: daily)
collectionQuery.initialResultsHandler = { query, results, error in
results?.enumerateStatistics(from: sevenDaysAgo, to: now) { statistics, stop in
let steps = statistics.sumQuantity()?.doubleValue(for: HKUnit.count()) ?? 0
// Append steps for statistics.startDate
}
}
healthStore.execute(collectionQuery)
Отображение данных фитнеса
Сырые числа бессмысленны без четкой визуализации. Хорошо продуманный пользовательский интерфейс превращает данные HealthKit в мотивационные идеи. Рассмотрим следующие подходы:
- Краткие карты: Показать сегодняшний счет шагов, активные минуты и пульс тренд в компактной приборной панели.
- Чаты: Используйте линейные или барные диаграммы для отображения еженедельных шагов, ежемесячной активной энергии или зон сердечного ритма. Библиотеки, такие как Свифт-чарты (iOS 16+) или Чаты (DGCharts) интегрируются плавно.
- Кольца для целей: Классические кольца активности Apple можно эмулировать для визуализации энергии, упражнений и часов ожидания.
- Краткие результаты тренировок: Текущая продолжительность, средний сердечный ритм, расстояние и калории, сжигаемые для каждой зарегистрированной тренировки.
Пример: Построение панели управления счетом шагов
Объедините запрос статистики выше с SwiftUI, чтобы создать стойку шага обновления:
struct StepCardView: View {
@State private var steps: Double = 0
var body: some View {
VStack {
Text("Steps")
.font(.headline)
Text("\(Int(steps))")
.font(.largeTitle)
.bold()
}
.onAppear { fetchTodaySteps() }
}
func fetchTodaySteps() {
// Use HKStatisticsQuery as shown earlier
}
}
Обновления в реальном времени с помощью HKObserverQuery
Чтобы поддерживать работу панели управления без ручного обновления, настройте . Система уведомляет ваше приложение, когда новые данные сохраняются в HealthKit (даже если приложение фоновое, если вы регистрируетесь для отправки фона).
let observerQuery = HKObserverQuery(sampleType: stepType, predicate: nil) { query, completionHandler, error in
DispatchQueue.main.async { self.fetchTodaySteps() }
completionHandler()
}
healthStore.execute(observerQuery)
Для обновления фона вы также должны позвонить . Обратите внимание, что iOS замедляет обратный фон для сохранения батареи; используйте это экономно и всегда обрабатывайте обработчик завершения.
Лучшие практики для конфиденциальности и безопасности
Данные о здоровье чувствительны. Apple соблюдает строгие правила, и несоблюдение может привести к отказу App Store.
- Минимальные запросы данных: Запрашивайте только типы данных, которые фактически использует ваше приложение. Избегайте запрашивать «записи о состоянии здоровья», если вам нужно только подсчитать шаг.
- Четкое объяснение строк: Описание использования в Info.plist должно быть конкретным, например, «Это приложение читает ваш счет шагов, чтобы показать вашу повседневную деятельность».
- Никогда не делитесь исходными данными HealthKit без явного согласия пользователя. Если синхронизация с вашим бэкэндом, анонимизируйте и шифруйте данные.
- Уважительное отношение к авторизации изменяется: Наблюдайте, когда пользователь отзывает разрешения через или проверяя статус авторизации перед каждым запросом.
- Ошибки управления изящно: Запросы HealthKit могут потерпеть неудачу из-за авторизации, отсутствия данных или ошибок в базе данных. Всегда покажите удобное сообщение.
Интеграция с Apple Watch и другими источниками
HealthKit автоматически собирает данные из Apple Watch, сторонних приложений и ручных записей. Ваше приложение iOS не нуждается в различении источника, если вы специально не хотите фильтровать по источнику. Для приложений для тренировок рассмотрите возможность написания объектов HealthKit. Когда пользователь начинает тренировку на Apple Watch, система может автоматически записывать метрики; ваше приложение для iOS может прочитать их позже.
Чтобы написать данные тренировки:
let workout = HKWorkout(activityType: .running, start: workoutStart, end: workoutEnd, duration: duration, totalEnergyBurned: energy, totalDistance: distance, metadata: nil)
healthStore.save(workout) { success, error in
// Handle
}
Вы также можете добавить связанные образцы (например, частоту сердечных сокращений, маршрут) в тренировку с использованием и .
Обычные подводные камни и как их избежать
- Предполагая, что данные всегда доступны: Новый пользователь может не иметь данных HealthKit.Разработайте свой пользовательский интерфейс, чтобы показать заполнителей или побудить пользователя начать отслеживание через приложение Health или Apple Watch.
- Запрос слишком большого количества данных одновременно: Большие запросы (например, все образцы за прошлый год) могут быть медленными и сбоями в памяти. Используйте предикаты даты и начинайте с ограничениями.
- Игнорирование часовых поясов: Временные метки HealthKit находятся в UTC. При группировке по дням преобразуйтесь в местный часовой пояс пользователя, чтобы избежать смещения.
- Блокировка основного потока: Запросы HealthKit асинхронны, но их обработчики завершения могут не работать на основном потоке.
- Забыв проверить доступность данных о здоровье: HealthKit недоступен на iPad и iPod touch. Всегда звоните перед любым взаимодействием.
Расширение медицинских записей и клинических данных
Для приложений, ориентированных на клиническое здоровье, HealthKit также поддерживает Health Records (через FHIR). С разрешения пользователя ваше приложение может получить доступ к иммунизации, результатам лабораторных исследований, лекарствам и условиям. Это открывает возможности для отслеживания лекарств, проверки на аллергию или управления хроническими заболеваниями. Однако эти типы данных требуют дополнительного рассмотрения для получения права на медицинское обслуживание от Apple.
Заключение
API iOS HealthKit предлагает надежную, ориентированную на конфиденциальность основу для отслеживания и отображения данных о фитнесе. Понимая его модель разрешения, типы запросов и лучшие практики, вы можете создать приложение, которое легко интегрируется с экосистемой здоровья пользователя. Начните с простых шагов и запросов сердечного ритма, а затем постепенно включите более продвинутые функции, такие как обновления фона, подключение к часам и клинические записи. Результат - мощный инструмент, который не только информирует пользователей об их здоровье, но и мотивирует их к достижению своих целей в фитнесе.
Для дальнейшего чтения, обратитесь к официальному Apple HealthKit Documentation, HealthKit Human Interface Guidelines и ресурсам сообщества, таким как Ray Wenderlich’s HealthKit Tutorial для практических примеров кода.