فریمورک Core Motion — یک مؤلفه سیستمی iOS است که دسترسی به دادههای شتابسنج، ژیروسکوپ، مغناطیسسنج و گامشمار را در دستگاههای Apple فراهم میکند. به گفته Apple Developer Documentation, 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 میلیوات کار کنند. این امر به دلیل ایزولاسیون سختافزاری ممکن شد: پردازنده مشترک حافظه غیرفرار و گذرگاه داده مخصوص خود را دارد که مستقل از سیستم اصلی است.
معماری Core Motion بر اساس مدل Singleton از طریق CMMotionManager ساخته شده است. برنامه یک نمونه واحد از مدیر دریافت میکند و از طریق آن فرکانس بهروزرسانی را تنظیم کرده، جمعآوری دادهها را از هر نوع سنسور شروع یا متوقف میکند. دادهها از طریق بلوکها با فاصله زمانی مشخص شده تحویل داده میشوند.
فریمورک از دو حالت دریافت داده استفاده میکند: 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 هرتز
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 نیاز ندارد — کافی است import فریمورک را اضافه کرده و یک نمونه CMMotionManager ایجاد کنید. با این حال، برای CMPedometer از iOS 11 به بعد نیاز به درخواست مجوز از طریق CMStepCounter یا استفاده از CMPedometer با درخواست اجازه از طریق دیالوگ سیستمی است.
فرآیند ادغام شامل: ایجاد CMMotionManager، بررسی در دسترس بودن سنسور از طریق isAccelerometerAvailable / isGyroAvailable / isDeviceMotionAvailable، تنظیم فاصله بهروزرسانی و شروع دریافت دادهها. مهم است که وقتی دادهها مورد نیاز نیستند، بهروزرسانیها را از طریق stopAccelerometerUpdates متوقف کنید — این برای مصرف انرژی حیاتی است.
برای کار در پسزمینه، CMPedometer و CMAltimeter به تنظیمات اضافی نیاز ندارند — آنها از پردازنده مشترک حرکت استفاده میکنند. برای CMMotionManager کار در پسزمینه در دسترس نیست — دادهها فقط زمانی جمعآوری میشوند که برنامه فعال و در پیشزمینه باشد. تنها شرط برای CMPedometer — برنامه باید حداقل یک بار توسط کاربر پس از نصب اجرا شده باشد تا اشتراک بهروزرسانیهای پسزمینه از iOS مقداردهی اولیه شود.
Core Motion از فرکانس پرسوجوی تطبیقی پشتیبانی میکند: اگر برنامه به دادههای بلادرنگ نیاز ندارد، کافی است فاصله 1–5 هرتز را به جای 100 هرتز تنظیم کنید. برای برنامههای تناسب اندام، فرکانس بهینه 10 هرتز برای CMMotionManager و 1 هرتز برای CMPedometer است. Apple توصیه میکند فرکانس را به حداقل لازم برای عملکرد صحیح کاهش دهید.
برای بازیهای کنترلشونده با شیب، فرکانس 60–100 هرتز برای اطمینان از روانی واکنش لازم است. در این مورد، استفاده از startDeviceMotionUpdates با یک صف جداگانه و پردازش دادهها در سریعترین زمان ممکن مهم است. به گفته Apple، فرکانس 60 هرتز حدود 2 برابر بیشتر از 30 هرتز انرژی مصرف میکند.
هنگام کار با Core Motion باید سازگاری دستگاهها را در نظر گرفت: ژیروسکوپ در iPhone 3GS و iPad نسل اول وجود ندارد، مغناطیسسنج — در همه iPadهای بدون ماژول سلولی. برای بررسی در دسترس بودن سنسورها از روشهای استاتیک isAccelerometerAvailable، isGyroAvailable و isDeviceMotionAvailable کلاس CMMotionManager استفاده میشود. در شبیهساز، Core Motion دادههای آزمایشی بازمیگرداند — برای اشکالزدایی روی سنسور واقعی همیشه به یک دستگاه فیزیکی Apple نیاز است.
// پیکربندی بهینه برای برنامه تناسب اندام
motionManager.deviceMotionUpdateInterval = 0.1 // 10 هرتز
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 هرتز Core Motion حدود 5–7% باتری در ساعت مصرف میکند. در 10 هرتز — حدود 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 از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید