Framework Core Motion là một thành phần hệ thống iOS cung cấp quyền truy cập vào dữ liệu gia tốc kế, con quay hồi chuyển, từ kế và máy đếm bước trên các thiết bị Apple. Theo Apple Developer Documentation, 2025, framework xử lý dữ liệu thô từ cảm biến và chuyển đổi chúng thành các chỉ số dễ hiểu — gia tốc, vận tốc góc, hướng và số bước. Một API duy nhất cho tất cả cảm biến chuyển động cho phép các nhà phát triển tạo máy đếm bước, ứng dụng thể dục và trò chơi với điều khiển nghiêng thiết bị.
Những điểm chính
Core Motion là một framework hệ thống của Apple, được giới thiệu trong iOS 4 để làm việc với các cảm biến chuyển động của thiết bị. Nó cung cấp một giao diện thống nhất để truy cập gia tốc kế, con quay hồi chuyển, từ kế và máy đếm bước, giải phóng nhà phát triển khỏi việc phải làm việc với trình điều khiển phần cứng ở cấp thấp.
Lợi thế chính của Core Motion là lọc phần cứng dữ liệu. Framework tự động kết hợp các chỉ số từ gia tốc kế và con quay hồi chuyển để tính toán userAcceleration thuần túy không có thành phần trọng lực, đồng thời cung cấp hướng của thiết bị trong không gian dưới dạng quaternion và góc Euler.
Theo Apple WWDC 2023, Core Motion được sử dụng trong hơn 80% ứng dụng thể dục trên App Store. Framework được tối ưu hóa cho mức tiêu thụ điện năng — tần số thăm dò cảm biến tự động giảm khi không có người đăng ký, kéo dài thời lượng pin của thiết bị.
Một đặc điểm kiến trúc quan trọng là việc sử dụng bộ đồng xử lý dòng M (Motion coprocessor), xử lý dữ liệu cảm biến chuyển động độc lập với bộ xử lý chính dòng A. Bắt đầu từ chip M7 (iPhone 5S), bộ đồng xử lý liên tục thu thập dữ liệu gia tốc kế và con quay hồi chuyển, cho phép CMPedometer và CMAltimeter hoạt động ở chế độ nền với màn hình khóa và tiêu thụ dưới 1 mW. Điều này trở nên khả thi nhờ cách ly phần cứng: bộ đồng xử lý có bộ nhớ không bay hơi riêng và bus dữ liệu độc lập với hệ thống chính.
Kiến trúc Core Motion được xây dựng theo mô hình singleton thông qua CMMotionManager. Ứng dụng nhận một phiên bản duy nhất của trình quản lý và thông qua đó cấu hình tần số cập nhật, bắt đầu hoặc dừng thu thập dữ liệu cho từng loại cảm biến. Dữ liệu đến qua các khối closure tại khoảng thời gian xác định.
Framework sử dụng hai chế độ lấy dữ liệu: pull (thăm dò chủ động qua startAccelerometerUpdates) và push (nhận thụ động qua startAccelerometerUpdatesToQueue). Chế độ push được ưu tiên cho ứng dụng UI vì dữ liệu được gửi đến hàng đợi xác định mà không chặn luồng chính.
import CoreMotion
let motionManager = CMMotionManager()
motionManager.accelerometerUpdateInterval = 0.1
guard motionManager
.isAccelerometerAvailable else { return }
motionManager.startAccelerometerUpdates(
to: OperationQueue.current()!
) { data, _ in
guard let accel = data?.acceleration else { return }
print("X: \(accel.x), Y: \(accel.y), Z: \(accel.z)")
}
Core Motion cung cấp quyền truy cập vào bốn loại cảm biến: gia tốc kế đo gia tốc tuyến tính theo ba trục, con quay hồi chuyển đo vận tốc góc quay và từ kế đo cường độ từ trường cho la bàn. Loại thứ tư là dữ liệu CMDeviceMotion kết hợp, bao gồm các chỉ số đã lọc từ tất cả cảm biến.
CMDeviceMotion là lớp có giá trị nhất cho phát triển. Nó cung cấp userAcceleration (gia tốc không có trọng lực), rotationRate (tốc độ quay), magneticField (vectơ từ trường) và attitude (hướng thiết bị dưới dạng quaternion hoặc góc Euler). Để tính attitude, Core Motion sử dụng kết hợp cảm biến con quay hồi chuyển và gia tốc kế với thuật toán tương tự bộ lọc bổ sung.
Từ kế được sử dụng để hiệu chỉnh trôi con quay hồi chuyển. Con quay hồi chuyển thuần túy tích lũy lỗi theo thời gian do trôi nhiệt và nhiễu — từ kế và gia tốc kế hiệu chỉnh lỗi này, cung cấp độ chính xác hướng từ 1 đến 2 độ ở vị trí tĩnh.
guard motionManager
.isDeviceMotionAvailable else { return }
motionManager.deviceMotionUpdateInterval = 1.0 // 1 Hz
motionManager.startDeviceMotionUpdates(
using: .xArbitraryZVertical,
to: OperationQueue.current()!
) { motion, _ in
guard let attitude = motion?.attitude else { return }
print("Roll: \(attitude.roll)")
print("Pitch: \(attitude.pitch)")
print("Yaw: \(attitude.yaw)")
}
CMPedometer — lớp để đếm bước, quãng đường đã đi và tốc độ di chuyển. Nó sử dụng dữ liệu gia tốc kế với xử lý phần cứng trên bộ đồng xử lý chuyển động dòng M (M7/M8/M9/M10/M11). Điều này cho phép hoạt động nền với mức tiêu thụ điện năng tối thiểu — khoảng 1% pin cho 8 giờ theo dõi liên tục.
CMAltimeter — lớp xác định độ cao tương đối dựa trên phong vũ biểu được cài đặt trong iPhone 6 trở lên. Nó hiển thị thay đổi độ cao so với điểm bắt đầu với độ chính xác khoảng 1 mét. Nó được sử dụng trong ứng dụng thể dục để đếm tầng và trong ứng dụng định vị để xác định thay đổi độ cao.
Dữ liệu CMPedometer có sẵn với độ trễ không quá 5 giây cho chỉ số hiện tại. Đối với dữ liệu lịch sử, có thể truy vấn tối đa 7 ngày qua queryPedometerData. Máy đếm bước tự động nhận dạng đi bộ, chạy bộ và đạp xe — các loại hoạt động này có sẵn qua queryPedometerData với lọc theo loại.
Độ chính xác của CMPedometer khoảng 95% khi đi bộ thông thường và giảm xuống 90% khi chạy. Độ chính xác bị ảnh hưởng bởi: vị trí đặt điện thoại trong túi hoặc ba lô, loại giày và bề mặt. Apple khuyến nghị sử dụng CMPedometer kết hợp với Core Location để xác định khoảng cách ngoài trời — GPS cung cấp khoảng cách chính xác hơn trong khi Core Motion xử lý việc đếm bước.
let pedometer = CMPedometer()
guard CMPedometer
.isStepCountingAvailable() else { return }
pedometer.startUpdates(from: Date()) { data, _ in
guard let pedData = pedometerData else { return }
print("Bước: \(pedData.numberOfSteps)")
print("Khoảng cách: \(pedData.distance)")
}
// Truy cập máy đo độ cao
let altimeter = CMAltimeter()
altimeter.startRelativeAltitudeUpdates(
to: OperationQueue.current()!
) { data, _ in
print("Độ cao: \(data?.relativeAltitude)")
}
Tích hợp Core Motion không yêu cầu quyền đặc biệt hay entitlement — chỉ cần thêm import framework và tạo một phiên bản CMMotionManager. Tuy nhiên, đối với CMPedometer từ iOS 11 trở đi, cần có ủy quyền qua CMStepCounter hoặc sử dụng CMPedometer với hộp thoại cấp phép hệ thống.
Quy trình tích hợp bao gồm: tạo CMMotionManager, kiểm tra khả năng sử dụng cảm biến qua isAccelerometerAvailable / isGyroAvailable / isDeviceMotionAvailable, thiết lập khoảng thời gian cập nhật và bắt đầu thu thập dữ liệu. Điều quan trọng là dừng cập nhật qua stopAccelerometerUpdates khi không cần dữ liệu — điều này rất quan trọng cho mức tiêu thụ điện năng.
Đối với hoạt động nền, CMPedometer và CMAltimeter không yêu cầu cấu hình thêm — chúng sử dụng bộ đồng xử lý chuyển động. Đối với CMMotionManager, hoạt động nền không khả dụng — dữ liệu chỉ được thu thập khi ứng dụng đang hoạt động và ở tiền cảnh. Điều kiện duy nhất cho CMPedometer là ứng dụng phải được người dùng khởi chạy ít nhất một lần sau khi cài đặt để khởi tạo đăng ký cập nhật nền từ iOS.
Core Motion hỗ trợ tần số thăm dò thích ứng: nếu ứng dụng không cần dữ liệu thời gian thực, chỉ cần đặt khoảng thời gian 1–5 Hz thay vì 100 Hz. Đối với ứng dụng thể dục, tần số tối ưu là 10 Hz cho CMMotionManager và 1 Hz cho CMPedometer. Apple khuyến nghị giảm tần số xuống mức tối thiểu cần thiết cho hoạt động chính xác.
Đối với trò chơi có điều khiển nghiêng, cần tần số 60–100 Hz để đảm bảo phản hồi mượt mà. Trong trường hợp này, điều quan trọng là sử dụng startDeviceMotionUpdates với hàng đợi riêng và xử lý dữ liệu nhanh nhất có thể. Theo Apple, 60 Hz tiêu thụ năng lượng gấp khoảng 2 lần so với 30 Hz.
Khi làm việc với Core Motion, điều quan trọng là xem xét khả năng tương thích thiết bị: con quay hồi chuyển không có trên iPhone 3GS và iPad thế hệ 1, từ kế không có trên tất cả iPad không có mô-đun di động. Các phương thức tĩnh isAccelerometerAvailable, isGyroAvailable và isDeviceMotionAvailable của lớp CMMotionManager được sử dụng để kiểm tra khả năng sử dụng cảm biến. Trên trình mô phỏng, Core Motion trả về dữ liệu thử nghiệm — để gỡ lỗi trên cảm biến thực, luôn cần một thiết bị Apple vật lý.
// Cài đặt tối ưu cho ứng dụng thể dục
motionManager.deviceMotionUpdateInterval = 0.1 // 10 Hz
motionManager.startDeviceMotionUpdates(
to: .main
) { [weak self] motion, error in
guard let self = self,
let motion = motion else { return }
if motion.userAcceleration.magnitude() > 2.0 {
self.detectedSignificantMovement()
}
}
Câu hỏi thường gặp
Có, Core Motion hoạt động trên tất cả thiết bị Apple có cảm biến cần thiết. Gia tốc kế có trên tất cả iPhone, iPad và iPod touch. Con quay hồi chuyển có trên tất cả iPhone 4 trở lên, iPad 2 trở lên. Từ kế chỉ có trên iPhone, không có trên iPad. Phong vũ biểu có trên iPhone 6 trở lên.
Tác động lên pin phụ thuộc vào tần số thăm dò. Ở 100 Hz, Core Motion tiêu thụ khoảng 5–7% pin mỗi giờ. Ở 10 Hz — khoảng 1–2% mỗi giờ. CMPedometer trên bộ đồng xử lý chuyển động tiêu thụ dưới 1% trong 8 giờ hoạt động. Apple khuyến nghị luôn dừng cập nhật khi không cần dữ liệu.
Có, CMPedometer cung cấp giải pháp có sẵn cho máy đếm bước mà không cần xử lý dữ liệu thô từ gia tốc kế. Lớp tự động nhận dạng bước với độ chính xác khoảng 95% khi đi bộ và 90% khi chạy. Đối với máy dò bước tùy chỉnh, bạn có thể sử dụng CMMotionManager với thuật toán riêng của mình.
Core Motion được tích hợp vào iOS ở cấp hệ thống và sử dụng bộ đồng xử lý dòng M để xử lý năng lượng thấp. Android sử dụng SensorManager với quyền truy cập trực tiếp vào trình điều khiển phần cứng nhưng không có bộ đồng xử lý chuyên dụng, làm tăng mức tiêu thụ điện năng khi theo dõi nền.
Đối với CMPedometer trên iOS 11 trở lên, cần có quyền của người dùng. Yêu cầu được thực hiện tự động khi tạo CMPedometer và hiển thị hộp thoại hệ thống. Trong Info.plist, bạn cần thêm khóa NSMotionUsageDescription với mô tả lý do ứng dụng cần quyền truy cập dữ liệu chuyển động.
Tổng kế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