เฟรมเวิร์ก Core Motion เป็นส่วนประกอบระบบของ iOS ที่ให้การเข้าถึงข้อมูลจากมาตรความเร่ง ไจโรสโคป แมกนีโตมิเตอร์ และเครื่องนับก้าวบนอุปกรณ์ Apple ตามเอกสารของนักพัฒนา Apple, 2025 เฟรมเวิร์กประมวลผลข้อมูลดิบจากเซ็นเซอร์และแปลงเป็นเมตริกที่เข้าใจได้ — ความเร่ง ความเร็วเชิงมุม ทิศทาง และจำนวนก้าว API เดียว สำหรับเซ็นเซอร์เคลื่อนไหวทั้งหมดช่วยให้นักพัฒนาสร้างเครื่องนับก้าว แอปฟิตเนส และเกมที่มีการควบคุมด้วยการเอียงอุปกรณ์
ประเด็นสำคัญ
Core Motion เป็นเฟรมเวิร์กระบบของ Apple ที่เปิดตัวใน iOS 4 สำหรับทำงานกับเซ็นเซอร์เคลื่อนไหวของอุปกรณ์ โดยให้อินเทอร์เฟซแบบรวมสำหรับเข้าถึงมาตรความเร่ง ไจโรสโคป แมกนีโตมิเตอร์ และเครื่องนับก้าว ช่วยให้นักพัฒนาไม่ต้องทำงานกับไดรเวอร์ฮาร์ดแวร์ในระดับต่ำ
ข้อได้เปรียบหลักของ Core Motion คือ การกรองด้วยฮาร์ดแวร์ ของข้อมูล เฟรมเวิร์กจะรวมค่าที่อ่านได้จากมาตรความเร่งและไจโรสโคปโดยอัตโนมัติเพื่อคำนวณ userAcceleration บริสุทธิ์โดยไม่มีส่วนประกอบของแรงโน้มถ่วง และยังให้ทิศทางของอุปกรณ์ในรูปแบบของควอเทอร์เนียนและมุมออยเลอร์
ตามข้อมูลของ Apple WWDC 2023 Core Motion ถูกใช้ในแอปฟิตเนสมากกว่า 80% บน App Store เฟรมเวิร์กได้รับการปรับให้เหมาะสมสำหรับการใช้พลังงาน — ความถี่ในการสอบถามเซ็นเซอร์จะลดลงโดยอัตโนมัติเมื่อไม่มีสมาชิก ช่วยยืดอายุแบตเตอรี่ของอุปกรณ์
คุณลักษณะทางสถาปัตยกรรมที่สำคัญคือการใช้ โคโพรเซสเซอร์ซีรีส์ M (Motion coprocessor) ซึ่งประมวลผลข้อมูลเซ็นเซอร์เคลื่อนไหวอย่างอิสระจากโปรเซสเซอร์หลักซีรีส์ A เริ่มต้นจากชิป M7 (iPhone 5S) โคโพรเซสเซอร์จะรวบรวมข้อมูลมาตรความเร่งและไจโรสโคปอย่างต่อเนื่อง ทำให้ CMPedometer และ CMAltimeter ทำงานในพื้นหลังขณะหน้าจอล็อกได้โดยใช้พลังงานน้อยกว่า 1 mW สิ่งนี้เป็นไปได้เนื่องจากการแยกฮาร์ดแวร์: โคโพรเซสเซอร์มีหน่วยความจำแบบไม่ลบเลือนและบัสข้อมูลของตัวเองที่เป็นอิสระจากระบบหลัก
สถาปัตยกรรมของ Core Motion สร้างขึ้นบน โมเดลซิงเกิลตัน ผ่าน CMMotionManager แอปพลิเคชันได้รับอินสแตนซ์เดียวของตัวจัดการและผ่านทางนั้นกำหนดค่าความถี่ในการอัปเดต เริ่มหรือหยุดการรวบรวมข้อมูลสำหรับเซ็นเซอร์แต่ละประเภท ข้อมูลจะมาถึงผ่านบล็อก closure ตามช่วงเวลาที่กำหนด
เฟรมเวิร์กใช้ สองโหมด ในการรับข้อมูล: pull (การสอบถามแบบแอคทีฟผ่าน startAccelerometerUpdates) และ push (การรับแบบพาสซีฟผ่าน startAccelerometerUpdatesToQueue) โหมด push เหมาะสำหรับแอปพลิเคชัน UI มากกว่าเนื่องจากข้อมูลถูกส่งไปยังคิวที่ระบุโดยไม่บล็อกเธรดหลัก
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 ให้การเข้าถึงเซ็นเซอร์สี่ประเภท: มาตรความเร่งวัดความเร่งเชิงเส้นตามสามแกน ไจโรสโคปวัดความเร็วเชิงมุมของการหมุน และแมกนีโตมิเตอร์วัดความแรงของสนามแม่เหล็กสำหรับเข็มทิศ ประเภทที่สี่คือข้อมูล CMDeviceMotion แบบรวม ซึ่งรวมถึงค่าที่อ่านได้ซึ่งถูกกรองจากเซ็นเซอร์ทั้งหมด
CMDeviceMotion เป็นคลาสที่มีค่าที่สุดสำหรับการพัฒนา โดยให้ userAcceleration (ความเร่งโดยไม่มีแรงโน้มถ่วง) rotationRate (ความเร็วในการหมุน) magneticField (เวกเตอร์สนามแม่เหล็ก) และ attitude (ทิศทางของอุปกรณ์เป็นควอเทอร์เนียนหรือมุมออยเลอร์) ในการคำนวณ attitude Core Motion ใช้การรวมเซ็นเซอร์ของไจโรสโคปและมาตรความเร่งด้วยอัลกอริทึมที่คล้ายกับตัวกรองเสริม
แมกนีโตมิเตอร์ใช้สำหรับ การแก้ไขการเลื่อนของไจโรสโคป ไจโรสโคปบริสุทธิ์จะสะสมข้อผิดพลาดเมื่อเวลาผ่านไปเนื่องจากการเลื่อนเนื่องจากอุณหภูมิและสัญญาณรบกวน — แมกนีโตมิเตอร์และมาตรความเร่งจะแก้ไขข้อผิดพลาดนี้ ให้ความแม่นยำของทิศทาง 1–2 องศาในตำแหน่งคงที่
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 — คลาสสำหรับนับจำนวนก้าว ระยะทางที่เดินทาง และจังหวะการเคลื่อนที่ โดยใช้ข้อมูลมาตรความเร่งพร้อมการประมวลผลด้วยฮาร์ดแวร์บนโคโพรเซสเซอร์เคลื่อนที่ซีรีส์ M (M7/M8/M9/M10/M11) ซึ่งช่วยให้ทำงานในพื้นหลังโดยใช้พลังงานน้อยที่สุด — ประมาณ 1% ของแบตเตอรี่ต่อการติดตามต่อเนื่อง 8 ชั่วโมง
CMAltimeter — คลาสสำหรับกำหนดความสูงสัมพัทธ์โดยใช้บารอมิเตอร์ที่ติดตั้งใน iPhone 6 ขึ้นไป โดยแสดงการเปลี่ยนแปลงความสูงสัมพันธ์กับจุดเริ่มต้นด้วย ความแม่นยำประมาณ 1 เมตร ใช้ในแอปฟิตเนสสำหรับนับชั้น และในแอปนำทางสำหรับกำหนดการเปลี่ยนแปลงระดับความสูง
ข้อมูล CMPedometer พร้อมใช้งานด้วยความล่าช้าไม่เกิน 5 วินาที สำหรับค่าปัจจุบัน สำหรับข้อมูลย้อนหลัง สามารถสอบถามข้อมูลย้อนหลังสูงสุด 7 วันผ่าน queryPedometerData เครื่องนับก้าวจะจดจำการเดิน การวิ่ง และการปั่นจักรยานโดยอัตโนมัติ — กิจกรรมประเภทนี้สามารถใช้งานได้ผ่าน queryPedometerData ด้วยการกรองตามประเภท
ความแม่นยำของ CMPedometer อยู่ที่ประมาณ 95% เมื่อเดินปกติ และลดลงเหลือ 90% เมื่อวิ่ง ความแม่นยำขึ้นอยู่กับ: ตำแหน่งของโทรศัพท์ในกระเป๋าหรือเป้สะพายหลัง ประเภทของรองเท้า และพื้นผิว Apple แนะนำให้ใช้ CMPedometer ร่วมกับ Core Location สำหรับการกำหนดระยะทางกลางแจ้ง — GPS ให้ระยะทางที่แม่นยำกว่า ในขณะที่ Core Motion จัดการนับก้าว
let pedometer = CMPedometer()
guard CMPedometer
.isStepCountingAvailable() else { return }
pedometer.startUpdates(from: Date()) { data, _ in
guard let pedData = pedometerData else { return }
print("ก้าว: \(pedData.numberOfSteps)")
print("ระยะทาง: \(pedData.distance)")
}
// การเข้าถึงเครื่องวัดความสูง
let altimeter = CMAltimeter()
altimeter.startRelativeAltitudeUpdates(
to: OperationQueue.current()!
) { data, _ in
print("ความสูง: \(data?.relativeAltitude)")
}
การรวม Core Motion ไม่ต้องการสิทธิ์พิเศษหรือ entitlement — เพียงแค่เพิ่ม การนำเข้าเฟรมเวิร์ก และสร้างอินสแตนซ์ CMMotionManager อย่างไรก็ตาม สำหรับ CMPedometer ตั้งแต่ iOS 11 เป็นต้นไป ต้องมีการอนุญาตผ่าน CMStepCounter หรือการใช้ CMPedometer พร้อมกล่องโต้ตอบขออนุญาตจากระบบ
กระบวนการรวมประกอบด้วย: การสร้าง CMMotionManager การตรวจสอบความพร้อมใช้งานของเซ็นเซอร์ผ่าน isAccelerometerAvailable / isGyroAvailable / isDeviceMotionAvailable การตั้งค่าช่วงเวลาอัปเดต และเริ่มการรวบรวมข้อมูล สิ่งสำคัญคือต้องหยุดอัปเดตผ่าน stopAccelerometerUpdates เมื่อไม่ต้องการข้อมูลอีกต่อไป — นี่เป็นสิ่งสำคัญสำหรับการใช้พลังงาน
สำหรับการทำงานในพื้นหลัง CMPedometer และ CMAltimeter ไม่ต้องการการกำหนดค่าเพิ่มเติม — พวกเขาใช้โคโพรเซสเซอร์เคลื่อนที่ สำหรับ CMMotionManager การทำงานในพื้นหลังไม่สามารถใช้ได้ — ข้อมูลจะถูกรวบรวมเฉพาะเมื่อแอปทำงานและอยู่ในเบื้องหน้าเท่านั้น เงื่อนไขเดียวสำหรับ CMPedometer คือแอปต้องถูกเปิดใช้งานโดยผู้ใช้อย่างน้อยหนึ่งครั้งหลังการติดตั้งเพื่อเริ่มต้นการสมัครรับอัปเดตพื้นหลังจาก iOS
Core Motion รองรับ ความถี่ในการสอบถามแบบปรับตัว: หากแอปไม่ต้องการข้อมูลแบบเรียลไทม์ การตั้งค่าช่วงเวลาเป็น 1–5 Hz ก็เพียงพอแทนที่จะเป็น 100 Hz สำหรับแอปฟิตเนส ความถี่ที่เหมาะสมคือ 10 Hz สำหรับ CMMotionManager และ 1 Hz สำหรับ CMPedometer Apple แนะนำให้ลดความถี่ให้เหลือน้อยที่สุดที่จำเป็นสำหรับการทำงานที่ถูกต้อง
สำหรับเกมที่มีการควบคุมด้วยการเอียง ต้องใช้ ความถี่ 60–100 Hz เพื่อให้การตอบสนองราบรื่น ในกรณีนี้ สิ่งสำคัญคือต้องใช้ startDeviceMotionUpdates กับคิวแยกต่างหากและประมวลผลข้อมูลให้เร็วที่สุด ตามข้อมูลของ Apple ความถี่ 60 Hz ใช้พลังงานมากกว่า 30 Hz ประมาณ 2 เท่า
เมื่อทำงานกับ Core Motion สิ่งสำคัญคือต้องพิจารณา ความเข้ากันได้ของอุปกรณ์: ไจโรสโคปไม่มีใน iPhone 3GS และ iPad รุ่นที่ 1 แมกนีโตมิเตอร์ไม่มีใน iPad ทุกรุ่นที่ไม่มีโมดูลเซลลูลาร์ วิธีการแบบสแตติก isAccelerometerAvailable, isGyroAvailable และ isDeviceMotionAvailable ของคลาส CMMotionManager ใช้สำหรับตรวจสอบความพร้อมใช้งานของเซ็นเซอร์ บนซิมิวเลเตอร์ Core Motion จะส่งคืนข้อมูลทดสอบ — สำหรับการดีบักบนเซ็นเซอร์จริง จำเป็นต้องใช้อุปกรณ์ Apple จริงเสมอ
// การตั้งค่าที่เหมาะสมสำหรับแอปฟิตเนส
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()
}
}
คำถามที่พบบ่อย
ใช่ Core Motion ทำงานบนอุปกรณ์ Apple ทั้งหมดที่มี เซ็นเซอร์ที่จำเป็น มาตรความเร่งมีอยู่ใน iPhone, iPad และ iPod touch ทุกรุ่น ไจโรสโคปมีอยู่ใน iPhone 4 ขึ้นไป และ iPad 2 ขึ้นไป แมกนีโตมิเตอร์มีเฉพาะใน iPhone เท่านั้น ไม่มีใน iPad บารอมิเตอร์มีใน iPhone 6 ขึ้นไป
ผลกระทบต่อแบตเตอรี่ขึ้นอยู่กับ ความถี่ในการสอบถาม ที่ 100 Hz Core Motion ใช้แบตเตอรี่ประมาณ 5–7% ต่อชั่วโมง ที่ 10 Hz — ประมาณ 1–2% ต่อชั่วโมง CMPedometer บนโคโพรเซสเซอร์เคลื่อนที่ใช้พลังงานน้อยกว่า 1% ตลอด 8 ชั่วโมงการทำงาน Apple แนะนำให้หยุดอัปเดตเสมอเมื่อไม่ต้องการข้อมูล
ใช่ CMPedometer ให้โซลูชันพร้อมใช้สำหรับเครื่องนับก้าวโดยไม่ต้องประมวลผลข้อมูลดิบจากมาตรความเร่ง คลาสจะจดจำขั้นตอนโดยอัตโนมัติด้วยความแม่นยำประมาณ 95% เมื่อเดิน และ 90% เมื่อวิ่ง สำหรับเครื่องตรวจจับขั้นตอนแบบกำหนดเอง คุณสามารถใช้ CMMotionManager กับอัลกอริทึมของคุณเองได้
Core Motion ถูกรวมเข้ากับ iOS ในระดับระบบและใช้โคโพรเซสเซอร์ซีรีส์ M สำหรับการประมวลผลที่ใช้พลังงานต่ำ Android ใช้ SensorManager ที่เข้าถึงไดรเวอร์ฮาร์ดแวร์โดยตรง แต่ไม่มีโคโพรเซสเซอร์เฉพาะ ซึ่งเพิ่มการใช้พลังงานระหว่างการติดตามในพื้นหลัง
สำหรับ CMPedometer บน iOS 11 ขึ้นไป ต้องได้รับอนุญาตจากผู้ใช้ คำขอจะทำโดยอัตโนมัติเมื่อสร้าง CMPedometer และแสดงกล่องโต้ตอบของระบบ ใน Info.plist คุณต้องเพิ่มคีย์ NSMotionUsageDescription พร้อมคำอธิบายว่าเหตุใดแอปจึงต้องการเข้าถึงข้อมูลการเคลื่อนไหว
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม