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("Здраво, Watch!")
}
override func willActivate() {
super.willActivate()
actionButton.setTitle("Старт")
}
@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, пулсметар, динамичко острво) доступне су само на одређеним моделима.
Да, можете комбиновати SwiftUI и WatchKit у једној апликацији. Користите WKHostingController за уграђивање SwiftUI View-а у WKInterfaceController или обрнуто — интегришите WKInterfaceObject преко UIViewRepresentable-а.
Покрените обе апликације (iOS + watchOS) из Xcode-а на повезаним уређајима. Користите конзолу за отклањање грешака за посматрање WCSessionDelegate порука. Уверите се да су оба уређаја у домету Bluetooth-а (до 10 метара).
Закључци
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође