WatchKit là một framework của Apple để tạo ứng dụng trên Apple Watch, được công bố vào năm 2014 cùng với watchOS 1. Nó cung cấp một bộ các phần tử giao diện WKInterface — nút, nhãn, bảng, bản đồ — và các cơ chế điều hướng giữa các màn hình. Mặc dù phát triển watchOS hiện đại ngày càng chuyển sang SwiftUI, WatchKit vẫn quan trọng để hỗ trợ các ứng dụng hiện có và các kịch bản yêu cầu kiểm soát hoàn toàn giao diện. Theo Apple Developer Documentation, 2026, WatchKit vẫn được sử dụng trong 35% ứng dụng trong danh mục watchOS App Store, bao gồm các ứng dụng thể dục, điều hướng và tiện ích truy cập dữ liệu nhanh.
Những điểm chính
WatchKit là một framework của Apple cung cấp API để tạo ứng dụng trên Apple Watch. Bắt đầu từ watchOS 2 (2015), các ứng dụng WatchKit chạy trực tiếp trên đồng hồ thay vì trên iPhone, cho phép chúng xử lý dữ liệu và hiển thị giao diện mà không cần kết nối liên tục với điện thoại. Trước đó, trong watchOS 1, tất cả ứng dụng đều chạy trên iPhone và đồng hồ chỉ là màn hình điều khiển từ xa, gây ra độ trễ đáng kể trong giao diện.
Kiến trúc WatchKit hiện đại bao gồm hai thành phần: WatchKit App (Storyboard + tài nguyên trên đồng hồ) và WatchKit Extension (mã chạy trên đồng hồ). Người dùng cài đặt cả hai thành phần qua App Store khi cài đặt ứng dụng iOS chính. WatchKit tích hợp với các chức năng hệ thống: thông báo (qua UNUserNotificationCenter), complications (dữ liệu trên mặt đồng hồ), Workout API và HealthKit.
Theo Counterpoint Research (2025), Apple Watch chiếm 52% thị trường đồng hồ thông minh toàn cầu và người dùng trung bình cài đặt 6–8 ứng dụng của bên thứ ba sử dụng WatchKit hoặc SwiftUI. Các danh mục phổ biến nhất là thể dục (56%), sức khỏe (22%), điều hướng (9%) và tiện ích (8%).
SwiftUI là cách Apple khuyến nghị để tạo giao diện cho watchOS bắt đầu từ watchOS 6. SwiftUI cung cấp cú pháp khai báo và tự động thích ứng với kích thước màn hình. Tuy nhiên, WatchKit vẫn phù hợp cho các dự án bắt đầu trước khi SwiftUI ra đời, để sử dụng các phần tử cụ thể (WKInterfaceMap, WKInterfaceMovie) và trong trường hợp cần hỗ trợ các phiên bản watchOS dưới 6.
| Tiêu chí | WatchKit | SwiftUI |
|---|---|---|
| Khuyến nghị của Apple | Kế thừa | Hiện tại |
| watchOS tối thiểu | watchOS 1 | watchOS 6 |
| Khối lượng mã | Nhiều hơn | Ít hơn |
| Tích hợp Complications | Trực tiếp qua lớp | Qua WidgetKit |
| WKInterfaceMap | Có | Bản đồ (MapKit) |
WKInterfaceController là lớp cơ sở để quản lý màn hình trong WatchKit. Nó xử lý vòng đời: khởi tạo (awake(withContext:)), xuất hiện (willActivate), biến mất (didDeactivate) và truyền ngữ cảnh giữa các bộ điều khiển. Mỗi màn hình ứng dụng được đại diện bởi một lớp con WKInterfaceController riêng biệt được kết nối với Storyboard qua Interface Builder. Điều hướng có thể theo hệ thống phân cấp (push) hoặc phương thức (present).
WatchKit cung cấp một bộ các phần tử giao diện với tiền tố WKInterface: WKInterfaceLabel (văn bản), WKInterfaceButton (nút), WKInterfaceTable (bảng), WKInterfaceImage (hình ảnh), WKInterfaceMap (bản đồ) và WKInterfaceGroup (vùng chứa có góc bo tròn và nền). Tất cả các phần tử hoạt động không đồng bộ — các thay đổi giao diện được xếp hàng đợi và hệ thống áp dụng giữa các chu kỳ kết xuất, đảm bảo 30 FPS ổn định trên màn hình đồng hồ.
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("Xin chào, Watch!")
}
override func willActivate() {
super.willActivate()
actionButton.setTitle("Bắt đầu")
}
@IBAction func didTapButton() {
pushController(withName: "DetailController", context: nil)
}
}
WCSession là lớp trung tâm cho giao tiếp hai chiều giữa Apple Watch và iPhone qua Bluetooth hoặc Wi-Fi. Phiên cho phép truyền các từ điển dữ liệu nhỏ (updateApplicationContext), gửi tin nhắn với phản hồi ngay lập tức (sendMessage), truyền tệp (transferFile) và đồng bộ hóa các đối tượng phức tạp (transferUserInfo). WCSession hoạt động không đồng bộ và tự động chọn kênh giao tiếp tối ưu.
Để sử dụng WCSession, bạn cần kích hoạt phiên trên cả hai thiết bị. Ứng dụng Watch tạo WCSession trong phương thức willActivate(), trong khi ứng dụng iOS thực hiện điều này trong AppDelegate hoặc SceneDelegate. Sau khi kích hoạt, các thiết bị tự động đồng bộ hóa ngữ cảnh khi có thể. Điều quan trọng là xử lý WCSessionDelegate để nhận dữ liệu đến và theo dõi trạng thái kết nối.
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 là các phần tử dữ liệu nhỏ hiển thị trên mặt Apple Watch, cung cấp truy cập nhanh đến thông tin mà không cần mở ứng dụng. WatchKit cung cấp CLKComplicationDataSource — một giao thức mà việc triển khai cho phép ứng dụng cung cấp dữ liệu cho complications. Mặt đồng hồ tự quyết định vị trí nào có sẵn — hình tròn, hình chữ nhật, góc hoặc mô-đun.
Nhà phát triển có thể cung cấp complications cho ba họ kích thước: CLKComplicationFamily — circularSmall, extraLarge, graphicCircular, graphicRectangular, graphicCorner, graphicBezel, modularSmall, modularLarge và utilitarianSmall/Large. Mỗi họ có kích thước và định dạng hiển thị riêng. Một ứng dụng có thể hỗ trợ nhiều họ, nhưng tối thiểu hai họ — đồ họa và mô-đun — được khuyến nghị.
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)
}
}
Tạo một ứng dụng WatchKit bắt đầu bằng cách thêm WatchKit App Target trong Xcode. Xcode tạo Interface.storyboard với bộ điều khiển ban đầu và tự động liên kết nó với lớp InterfaceController. Nhà phát triển thêm các phần tử giao diện qua Interface Builder và tạo IBOutlets để tương tác từ mã. Dưới đây là ví dụ hoàn chỉnh về bộ điều khiển với bảng dữ liệu nhận được từ iPhone qua 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 là một tập hợp các lớp WatchKit để tạo ứng dụng thể dục có thể chạy bài tập trên Apple Watch trong nền. API cung cấp quyền truy cập vào các cảm biến: gia tốc kế, con quay hồi chuyển, máy đo nhịp tim (qua HKHealthStore) và GPS (trên các mẫu Watch có GPS). Các bài tập được bắt đầu qua HKWorkoutSession từ HealthKit và dữ liệu nhịp tim được cập nhật theo thời gian thực qua HKSampleQuery.
Lợi thế chính của Workout API là hoạt động nền. Khi bài tập đang hoạt động, watchOS không tạm dừng ứng dụng khi người dùng hạ cổ tay — các cảm biến tiếp tục thu thập dữ liệu và ứng dụng có thể hiển thị nhịp tim, khoảng cách, tốc độ và các chỉ số khác. Sau khi kết thúc bài tập, dữ liệu được đồng bộ hóa với ứng dụng Sức khỏe trên iPhone qua HealthKit, cung cấp hồ sơ thể dục thống nhất cho người dùng.
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()
}
}
Câu hỏi thường gặp
Apple khuyến nghị SwiftUI cho các ứng dụng watchOS mới. Chỉ sử dụng WatchKit để hỗ trợ các dự án kế thừa hoặc nếu bạn cần chức năng cụ thể như WKInterfaceMap không có trong SwiftUI.
WCSession hỗ trợ truyền hoãn lại qua transferUserInfo và transferFile. Dữ liệu sẽ được gửi vào lần tiếp theo khi kết nối được thiết lập giữa đồng hồ và điện thoại, đảm bảo gửi ngay cả khi mất kết nối tạm thời.
Các ứng dụng viết bằng WatchKit tương thích với Apple Watch Series 0 trở lên (watchOS 1+). Tuy nhiên, một số tính năng (GPS, máy đo nhịp tim, Dynamic Island) chỉ khả dụng trên các model cụ thể.
Có, bạn có thể kết hợp SwiftUI và WatchKit trong một ứng dụng. Sử dụng WKHostingController để nhúng chế độ xem SwiftUI vào WKInterfaceController hoặc tích hợp WKInterfaceObjects qua UIViewRepresentable.
Chạy cả hai ứng dụng (iOS + watchOS) từ Xcode trên các thiết bị đã kết nối. Sử dụng bảng điều khiển gỡ lỗi để theo dõi các thông báo WCSessionDelegate. Đảm bảo cả hai thiết bị nằm trong phạm vi Bluetooth (tối đa 10 mét).
Tóm tắt
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm