WatchKit — фреймворк Apple для создания приложений на Apple Watch, анонсированный в 2014 году вместе с watchOS 1. Предоставляет набор интерфейсных элементов WKInterface — кнопки, метки, таблицы, карты — и механизмы навигации между экранами. Несмотря на то, что современная разработка под watchOS всё больше переходит на SwiftUI, WatchKit остаётся важным для поддержки существующих приложений и сценариев, где требуется полный контроль над интерфейсом. По данным Apple Developer Documentation, 2026, WatchKit по-прежнему используется в 35% приложений из каталога watchOS App Store, включая фитнес-приложения, навигаторы и утилиты для быстрого доступа к данным.
Главное
WatchKit — фреймворк Apple, который предоставляет API для создания приложений на Apple Watch. Начиная с watchOS 2 (2015), WatchKit-приложения работают непосредственно на часах, а не на iPhone, что позволяет им обрабатывать данные и отображать интерфейс без постоянного соединения с телефоном. До этого в watchOS 1 все приложения выполнялись на iPhone, а часы были лишь пультом удалённого отображения, что создавало значительные задержки в UI.
Современная архитектура WatchKit включает два компонента: WatchKit App (Storyboard + ресурсы на часах) и WatchKit Extension (код, выполняемый на часах). Пользователь устанавливает оба компонента через App Store при установке родительского iOS-приложения. WatchKit обеспечивает интеграцию с системными функциями: уведомлениями (через UNUserNotificationCenter), компликациями (данные на циферблате), Workout API и HealthKit.
По данным Counterpoint Research (2025), Apple Watch занимает 52% мирового рынка умных часов, а средний пользователь устанавливает 6–8 сторонних приложений с использованием WatchKit или SwiftUI. Наиболее популярные категории — фитнес (56%), здоровье (22%), навигация (9%) и утилиты (8%).
SwiftUI — рекомендуемый Apple способ создания интерфейсов для watchOS начиная с watchOS 6. SwiftUI предоставляет декларативный синтаксис и автоматическую адаптацию под размеры экрана. Однако WatchKit остаётся актуальным для проектов, начатых до появления SwiftUI, для использования специфических элементов (WKInterfaceMap, WKInterfaceMovie) и в случаях, когда требуется поддержка watchOS версий ниже 6.
| Критерий | WatchKit | SwiftUI |
|---|---|---|
| Рекомендация Apple | Legacy | Current |
| Минимальная watchOS | watchOS 1 | watchOS 6 |
| Объём кода | Больше | Меньше |
| Интеграция Compose | Прямая через классы | Через WidgetKit |
| WKInterfaceMap | Да | Map (MapKit) |
WKInterfaceController — базовый класс для управления экраном в WatchKit. Он отвечает за жизненный цикл: инициализацию (awake(withContext:)), появление (willActivate), исчезновение (didDeactivate) и передачу контекста между контроллерами. Каждый экран приложения представлен отдельным подклассом WKInterfaceController, связанным со Storyboard через Interface Builder. Навигация может быть иерархической (push) или модальной (present).
WatchKit предоставляет набор интерфейсных элементов с префиксом WKInterface: WKInterfaceLabel (текст), WKInterfaceButton (кнопка), WKInterfaceTable (таблица), WKInterfaceImage (изображение), WKInterfaceMap (карта) и WKInterfaceGroup (контейнер с закруглениями и фоном). Все элементы работают асинхронно — изменения UI ставятся в очередь и применяются системой между циклами отрисовки, что гарантирует стабильные 30 FPS на экране часов.
class MainInterfaceController: WKInterfaceController {
@IBOutlet weak var titleLabel: WKInterfaceLabel!
@IBOutlet weak var actionButton: WKInterfaceButton!
override func awake(with context: Any?) {
super.awake(with: context)
titleLabel.setText("Hello, Watch!")
}
override func willActivate() {
super.willActivate()
actionButton.setTitle("Start")
}
@IBAction func didTapButton() {
pushController(withName: "DetailController", context: nil)
}
}
WCSession — центральный класс для двусторонней коммуникации между Apple Watch и iPhone через Bluetooth или Wi-Fi. Сессия позволяет передавать небольшие словари данных (updateApplicationContext), отправлять сообщения с немедленным ответом (sendMessage), передавать файлы (transferFile) и синхронизировать сложные объекты (transferUserInfo). WCSession работает асинхронно и автоматически выбирает оптимальный канал связи.
Для использования WCSession необходимо активировать сессию на обоих устройствах. Watch-приложение создаёт WCSession в методе willActivate(), а iOS-приложение — в AppDelegate или SceneDelegate. После активации сессии устройства автоматически синхронизируют контекст при возможности. Важно обрабатывать делегат WCSessionDelegate для получения входящих данных и отслеживания состояния соединения.
class SessionManager: NSObject, WCSessionDelegate {
private let session = WCSession.default
func activate() {
session.delegate = self
session.activate()
}
func sendDataToPhone(key: String, value: Any) {
guard session.isReachable else { return }
session.sendMessage([key: value],
replyHandler: { response in
print("Response: \(response)")
},
errorHandler: { error in
print("Error: \(error.localizedDescription)")
}
)
}
func session(_ session: WCSession,
didReceiveMessage message: [String: Any],
replyHandler: @escaping ([String: Any]) -> Void) {
handleIncomingData(message)
replyHandler(["status": "ok"])
}
}
Complications — это небольшие элементы данных, которые отображаются на циферблате Apple Watch и предоставляют быстрый доступ к информации без открытия приложения. WatchKit предоставляет CLKComplicationDataSource — протокол, реализация которого позволяет приложению поставлять данные для компликаций. Циферблат сам решает, какие позиции доступны — круглые (circular), прямоугольные (rectangular), угловые (corner) или модульные (modular).
Разработчик может предоставлять компликации для трёх размеров семьи: CLKComplicationFamily — circularSmall, extraLarge, graphicCircular, graphicRectangular, graphicCorner, graphicBezel, modularSmall, modularLarge и utilitarianSmall/Large. Каждое семейство имеет свои размеры и формат отображения. Приложение может поддерживать несколько семейств, но рекомендуется минимум два — графическое и модульное.
class ComplicationController: NSObject, CLKComplicationDataSource {
func getCurrentTimelineEntry(
for complication: CLKComplication,
withHandler handler: @escaping (CLKComplicationTimelineEntry?) -> Void
) {
let template = CLKComplicationTemplateModularSmallSimpleText()
template.textProvider = CLKSimpleTextProvider(text: "96%")
let entry = CLKComplicationTimelineEntry(
date: Date(),
complicationTemplate: template
)
handler(entry)
}
}
Создание WatchKit-приложения начинается с добавления WatchKit App Target в Xcode. Xcode генерирует Interface.storyboard с начальным контроллером и автоматически связывает его с классом InterfaceController. Разработчик добавляет элементы UI через Interface Builder и создаёт IBOutlet для взаимодействия из кода. Ниже — полноценный пример контроллера с таблицей данных, полученных с iPhone через WCSession.
class ItemRowController: NSObject {
@IBOutlet weak var itemLabel: WKInterfaceLabel!
func configure(with text: String) {
itemLabel.setText(text)
}
}
class ListController: WKInterfaceController {
@IBOutlet weak var itemsTable: WKInterfaceTable!
private var items: [String] = []
override func awake(with context: Any?) {
super.awake(with: context)
items = context as? [String] ?? []
itemsTable.setNumberOfRows(items.count,
withRowType: "ItemRow")
for i in 0..if let row = itemsTable
.rowController(at: i) as? ItemRowController {
row.configure(with: items[i])
}
}
}
}
Workout API — набор классов WatchKit для создания фитнес-приложений, которые могут запускать тренировки на Apple Watch в фоновом режиме. API предоставляет доступ к датчикам: акселерометру, гироскопу, пульсометру (через HKHealthStore) и GPS (на моделях Watch с GPS). Тренировки запускаются через HKWorkoutSession из HealthKit, а данные пульса обновляются в реальном времени через HKSampleQuery.
Ключевое преимущество Workout API — возможность работы в фоне. Когда тренировка активна, watchOS не приостанавливает приложение при опускании руки — датчики продолжают собирать данные, а приложение может отображать пульс, дистанцию, темп и другие метрики. После завершения тренировки данные синхронизируются с Health App на iPhone через HealthKit, что обеспечивает единый фитнес-профиль пользователя.
class WorkoutManager: NSObject {
private let healthStore = HKHealthStore()
private var session: HKWorkoutSession!
func startWorkout(activityType: HKWorkoutActivityType) {
let config = HKWorkoutConfiguration()
config.activityType = activityType
config.locationType = .outdoor
session = try! HKWorkoutSession(
healthStore: healthStore,
configuration: config
)
session.startActivity(with: Date())
}
func stopWorkout() {
session.stopActivity(with: Date())
session.end()
}
}
Часто задаваемые вопросы
Apple рекомендует SwiftUI для новых приложений watchOS. WatchKit используйте только для поддержки legacy-проектов или если требуется специфический функционал вроде WKInterfaceMap, недоступный в SwiftUI.
WCSession поддерживает отложенную передачу через transferUserInfo и transferFile. Данные будут доставлены при следующем установлении соединения между часами и телефоном, что гарантирует доставку даже при временной потере связи.
Приложения, написанные на WatchKit, совместимы с Apple Watch Series 0 и новее (watchOS 1+). Однако некоторые функции (GPS, пульсометр, динамический island) доступны только на определённых моделях.
Да, можно комбинировать SwiftUI и WatchKit в одном приложении. Используйте WKHostingController для встраивания SwiftUI View в WKInterfaceController или наоборот — интегрируйте WKInterfaceObject через UIViewRepresentable.
Запустите оба приложения (iOS + watchOS) из Xcode на подключённых устройствах. Используйте консоль отладки для наблюдения за сообщениями WCSessionDelegate. Убедитесь, что оба устройства находятся в радиусе действия Bluetooth (до 10 метров).
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.