{"id":"5833d5fa-7c91-4935-b172-dbb0a3e92afb","shortId":"gvZxV2","kind":"skill","title":"core-motion","tagline":"Access accelerometer, gyroscope, magnetometer, pedometer, and activity-recognition data using CoreMotion. Use when reading device sensor data, counting steps, detecting user activity (walking/running/driving), tracking altitude changes, or implementing motion-based interactions i","description":"# CoreMotion\n\nRead device sensor data -- accelerometer, gyroscope, magnetometer, pedometer, and\nactivity recognition -- on iOS and watchOS. CoreMotion fuses raw sensor inputs into\nprocessed device-motion data and provides pedometer/activity APIs for fitness and\nnavigation use cases. Targets Swift 6.3 / iOS 26+.\n\n## Contents\n\n- [Setup](#setup)\n- [CMMotionManager: Sensor Data](#cmmotionmanager-sensor-data)\n- [Processed Device Motion](#processed-device-motion)\n- [CMPedometer: Step and Distance Data](#cmpedometer-step-and-distance-data)\n- [CMMotionActivityManager: Activity Recognition](#cmmotionactivitymanager-activity-recognition)\n- [CMAltimeter: Altitude Data](#cmaltimeter-altitude-data)\n- [Update Intervals and Battery](#update-intervals-and-battery)\n- [Common Mistakes](#common-mistakes)\n- [Review Checklist](#review-checklist)\n- [References](#references)\n\n## Setup\n\n### Info.plist\n\nAdd `NSMotionUsageDescription` to Info.plist with a user-facing string explaining\nwhy your app needs motion data. Without this key, the app crashes on first access.\n\n```xml\n<key>NSMotionUsageDescription</key>\n<string>This app uses motion data to track your activity.</string>\n```\n\n### Authorization\n\nCoreMotion uses `CMAuthorizationStatus` for pedometer and activity APIs. Sensor\nAPIs (accelerometer, gyro) do not require explicit authorization but do require\nthe usage description key.\n\n```swift\nimport CoreMotion\n\nlet status = CMMotionActivityManager.authorizationStatus()\nswitch status {\ncase .notDetermined:\n    // Will prompt on first use\n    break\ncase .authorized:\n    break\ncase .restricted, .denied:\n    // Direct user to Settings\n    break\n@unknown default:\n    break\n}\n```\n\n## CMMotionManager: Sensor Data\n\nCreate exactly **one** `CMMotionManager` per app. Multiple instances degrade\nsensor update rates.\n\n```swift\nimport CoreMotion\n\nlet motionManager = CMMotionManager()\n```\n\n### Accelerometer Updates\n\n```swift\nguard motionManager.isAccelerometerAvailable else { return }\n\nmotionManager.accelerometerUpdateInterval = 1.0 / 60.0  // 60 Hz\n\nmotionManager.startAccelerometerUpdates(to: .main) { data, error in\n    guard let acceleration = data?.acceleration else { return }\n    print(\"x: \\(acceleration.x), y: \\(acceleration.y), z: \\(acceleration.z)\")\n}\n\n// When done:\nmotionManager.stopAccelerometerUpdates()\n```\n\n### Gyroscope Updates\n\n```swift\nguard motionManager.isGyroAvailable else { return }\n\nmotionManager.gyroUpdateInterval = 1.0 / 60.0\n\nmotionManager.startGyroUpdates(to: .main) { data, error in\n    guard let rotationRate = data?.rotationRate else { return }\n    print(\"x: \\(rotationRate.x), y: \\(rotationRate.y), z: \\(rotationRate.z)\")\n}\n\nmotionManager.stopGyroUpdates()\n```\n\n### Polling Pattern (Games)\n\nFor games, start updates without a handler and poll the latest sample each frame:\n\n```swift\nmotionManager.startAccelerometerUpdates()\n\n// In your game loop / display link:\nif let data = motionManager.accelerometerData {\n    let tilt = data.acceleration.x\n    // Move player based on tilt\n}\n```\n\n## Processed Device Motion\n\nDevice motion fuses accelerometer, gyroscope, and magnetometer into a single\n`CMDeviceMotion` object with attitude, user acceleration (gravity removed),\nrotation rate, and calibrated magnetic field.\n\n```swift\nguard motionManager.isDeviceMotionAvailable else { return }\n\nmotionManager.deviceMotionUpdateInterval = 1.0 / 60.0\n\nmotionManager.startDeviceMotionUpdates(\n    using: .xArbitraryZVertical,\n    to: .main\n) { motion, error in\n    guard let motion else { return }\n\n    let attitude = motion.attitude       // roll, pitch, yaw\n    let userAccel = motion.userAcceleration\n    let gravity = motion.gravity\n    let heading = motion.heading         // 0-360 degrees (requires magnetometer)\n\n    print(\"Pitch: \\(attitude.pitch), Roll: \\(attitude.roll)\")\n}\n\nmotionManager.stopDeviceMotionUpdates()\n```\n\n### Attitude Reference Frames\n\n| Frame | Use Case |\n|---|---|\n| `.xArbitraryZVertical` | Default. Z is vertical, X arbitrary at start. Most games. |\n| `.xArbitraryCorrectedZVertical` | Same as above, corrected for gyro drift over time. |\n| `.xMagneticNorthZVertical` | X points to magnetic north. Requires magnetometer. |\n| `.xTrueNorthZVertical` | X points to true north. Requires magnetometer + location. |\n\nCheck available frames before use:\n\n```swift\nlet available = CMMotionManager.availableAttitudeReferenceFrames()\nif available.contains(.xTrueNorthZVertical) {\n    // Safe to use true north\n}\n```\n\n## CMPedometer: Step and Distance Data\n\n`CMPedometer` provides step counts, distance, pace, cadence, and floor counts.\n\n```swift\nlet pedometer = CMPedometer()\n\nguard CMPedometer.isStepCountingAvailable() else { return }\n\n// Historical query\npedometer.queryPedometerData(\n    from: Calendar.current.startOfDay(for: Date()),\n    to: Date()\n) { data, error in\n    guard let data else { return }\n    print(\"Steps today: \\(data.numberOfSteps)\")\n    print(\"Distance: \\(data.distance?.doubleValue ?? 0) meters\")\n    print(\"Floors up: \\(data.floorsAscended?.intValue ?? 0)\")\n}\n\n// Live updates\npedometer.startUpdates(from: Date()) { data, error in\n    guard let data else { return }\n    print(\"Steps: \\(data.numberOfSteps)\")\n}\n\n// Stop when done\npedometer.stopUpdates()\n```\n\n### Availability Checks\n\n| Method | What It Checks |\n|---|---|\n| `isStepCountingAvailable()` | Step counter hardware |\n| `isDistanceAvailable()` | Distance estimation |\n| `isFloorCountingAvailable()` | Barometric altimeter for floors |\n| `isPaceAvailable()` | Pace data |\n| `isCadenceAvailable()` | Cadence data |\n\n## CMMotionActivityManager: Activity Recognition\n\nDetects whether the user is stationary, walking, running, cycling, or in a vehicle.\n\n```swift\nlet activityManager = CMMotionActivityManager()\n\nguard CMMotionActivityManager.isActivityAvailable() else { return }\n\n// Live activity updates\nactivityManager.startActivityUpdates(to: .main) { activity in\n    guard let activity else { return }\n\n    if activity.walking {\n        print(\"Walking (confidence: \\(activity.confidence.rawValue))\")\n    } else if activity.running {\n        print(\"Running\")\n    } else if activity.automotive {\n        print(\"In vehicle\")\n    } else if activity.cycling {\n        print(\"Cycling\")\n    } else if activity.stationary {\n        print(\"Stationary\")\n    }\n}\n\nactivityManager.stopActivityUpdates()\n```\n\n### Historical Activity Query\n\n```swift\nlet yesterday = Calendar.current.date(byAdding: .day, value: -1, to: Date())!\n\nactivityManager.queryActivityStarting(\n    from: yesterday,\n    to: Date(),\n    to: .main\n) { activities, error in\n    guard let activities else { return }\n    for activity in activities {\n        print(\"\\(activity.startDate): walking=\\(activity.walking)\")\n    }\n}\n```\n\n## CMAltimeter: Altitude Data\n\n```swift\nlet altimeter = CMAltimeter()\n\nguard CMAltimeter.isRelativeAltitudeAvailable() else { return }\n\naltimeter.startRelativeAltitudeUpdates(to: .main) { data, error in\n    guard let data else { return }\n    print(\"Relative altitude: \\(data.relativeAltitude) meters\")\n    print(\"Pressure: \\(data.pressure) kPa\")\n}\n\naltimeter.stopRelativeAltitudeUpdates()\n```\n\nFor absolute altitude (GPS-based):\n\n```swift\nguard CMAltimeter.isAbsoluteAltitudeAvailable() else { return }\n\naltimeter.startAbsoluteAltitudeUpdates(to: .main) { data, error in\n    guard let data else { return }\n    print(\"Altitude: \\(data.altitude)m, accuracy: \\(data.accuracy)m\")\n}\n\naltimeter.stopAbsoluteAltitudeUpdates()\n```\n\n## Update Intervals and Battery\n\n| Interval | Hz | Use Case | Battery Impact |\n|---|---|---|---|\n| `1.0 / 10.0` | 10 | UI orientation | Low |\n| `1.0 / 30.0` | 30 | Casual games | Moderate |\n| `1.0 / 60.0` | 60 | Action games | High |\n| `1.0 / 100.0` | 100 | Max rate (iPhone) | Very High |\n\nUse the lowest frequency that meets your needs. `CMMotionManager` caps at 100 Hz\nper sample. For higher frequencies, use `CMBatchedSensorManager` on watchOS/iOS 17+.\n\n## Common Mistakes\n\n### DON'T: Create multiple CMMotionManager instances\n\n```swift\n// WRONG -- degrades update rates for all instances\nclass ViewA { let motion = CMMotionManager() }\nclass ViewB { let motion = CMMotionManager() }\n\n// CORRECT -- single instance, shared across the app\n@Observable\nfinal class MotionService {\n    static let shared = MotionService()\n    let manager = CMMotionManager()\n}\n```\n\n### DON'T: Skip sensor availability checks\n\n```swift\n// WRONG -- crashes on devices without gyroscope\nmotionManager.startGyroUpdates(to: .main) { data, _ in }\n\n// CORRECT -- check first\nguard motionManager.isGyroAvailable else {\n    showUnsupportedMessage()\n    return\n}\nmotionManager.startGyroUpdates(to: .main) { data, _ in }\n```\n\n### DON'T: Forget to stop updates\n\n```swift\n// WRONG -- updates keep running, draining battery\nclass MotionVC: UIViewController {\n    override func viewDidAppear(_ animated: Bool) {\n        super.viewDidAppear(animated)\n        motionManager.startAccelerometerUpdates(to: .main) { _, _ in }\n    }\n    // Missing viewDidDisappear stop!\n}\n\n// CORRECT -- stop in the counterpart lifecycle method\noverride func viewDidDisappear(_ animated: Bool) {\n    super.viewDidDisappear(animated)\n    motionManager.stopAccelerometerUpdates()\n}\n```\n\n### DON'T: Use unnecessarily high update rates\n\n```swift\n// WRONG -- 100 Hz for a compass display\nmotionManager.deviceMotionUpdateInterval = 1.0 / 100.0\n\n// CORRECT -- 10 Hz is more than enough for a compass\nmotionManager.deviceMotionUpdateInterval = 1.0 / 10.0\n```\n\n### DON'T: Assume all CMMotionActivity properties are mutually exclusive\n\n```swift\n// WRONG -- checking only one property\nif activity.walking { handleWalking() }\n\n// CORRECT -- multiple can be true simultaneously; check confidence\nif activity.walking && activity.confidence == .high {\n    handleWalking()\n} else if activity.automotive && activity.confidence != .low {\n    handleDriving()\n}\n```\n\n## Review Checklist\n\n- [ ] `NSMotionUsageDescription` present in Info.plist with a clear explanation\n- [ ] Single `CMMotionManager` instance shared across the app\n- [ ] Sensor availability checked before starting updates (`isAccelerometerAvailable`, etc.)\n- [ ] Authorization status checked before pedometer/activity APIs\n- [ ] Update interval set to the lowest acceptable frequency\n- [ ] All `start*Updates` calls have matching `stop*Updates` in lifecycle counterparts\n- [ ] Handlers dispatched to appropriate queues (not blocking main for heavy processing)\n- [ ] `CMMotionActivity.confidence` checked before acting on activity type\n- [ ] Error parameters checked in update handlers\n- [ ] Attitude reference frame chosen based on actual need (not defaulting to true north unnecessarily)\n\n## References\n\n- Extended patterns (SwiftUI integration, batched sensor manager, headphone motion): [references/motion-patterns.md](references/motion-patterns.md)\n- [CoreMotion framework](https://sosumi.ai/documentation/coremotion)\n- [CMMotionManager](https://sosumi.ai/documentation/coremotion/cmmotionmanager)\n- [CMPedometer](https://sosumi.ai/documentation/coremotion/cmpedometer)\n- [CMMotionActivityManager](https://sosumi.ai/documentation/coremotion/cmmotionactivitymanager)\n- [CMDeviceMotion](https://sosumi.ai/documentation/coremotion/cmdevicemotion)\n- [CMAltimeter](https://sosumi.ai/documentation/coremotion/cmaltimeter)\n- [CMBatchedSensorManager](https://sosumi.ai/documentation/coremotion/cmbatchedsensormanager)\n- [Getting processed device-motion data](https://sosumi.ai/documentation/coremotion/getting-processed-device-motion-data)","tags":["core","motion","swift","ios","skills","dpearson2699","accessibility","agent-skills","ai-coding","apple","claude-code","codex-skills"],"capabilities":["skill","source-dpearson2699","skill-core-motion","topic-accessibility","topic-agent-skills","topic-ai-coding","topic-apple","topic-claude-code","topic-codex-skills","topic-cursor-skills","topic-ios","topic-ios-development","topic-liquid-glass","topic-localization","topic-mapkit"],"categories":["swift-ios-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/dpearson2699/swift-ios-skills/core-motion","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add dpearson2699/swift-ios-skills","source_repo":"https://github.com/dpearson2699/swift-ios-skills","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 599 github stars · SKILL.md body (11,452 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T18:53:40.700Z","embedding":null,"createdAt":"2026-04-18T20:34:35.814Z","updatedAt":"2026-05-18T18:53:40.700Z","lastSeenAt":"2026-05-18T18:53:40.700Z","tsv":"'-1':672 '-360':426 '/documentation/coremotion)':1111 '/documentation/coremotion/cmaltimeter)':1131 '/documentation/coremotion/cmbatchedsensormanager)':1135 '/documentation/coremotion/cmdevicemotion)':1127 '/documentation/coremotion/cmmotionactivitymanager)':1123 '/documentation/coremotion/cmmotionmanager)':1115 '/documentation/coremotion/cmpedometer)':1119 '/documentation/coremotion/getting-processed-device-motion-data)':1144 '0':425,545,552 '1.0':266,301,395,770,776,782,788,955,968 '10':772,958 '10.0':771,969 '100':790,807,948 '100.0':789,956 '17':818 '26':79 '30':778 '30.0':777 '6.3':77 '60':268,784 '60.0':267,302,396,783 'absolut':731 'acceler':278,280,380 'acceleration.x':285 'acceleration.y':287 'acceleration.z':289 'acceleromet':5,43,193,258,368 'accept':1044 'access':4,170 'accuraci':756 'across':849,1021 'act':1071 'action':785 'activ':11,26,48,109,113,181,189,598,622,627,631,663,682,687,691,693,1073 'activity-recognit':10 'activity.automotive':647,1003 'activity.confidence':998,1004 'activity.confidence.rawvalue':639 'activity.cycling':653 'activity.running':642 'activity.startdate':695 'activity.stationary':658 'activity.walking':635,697,986,997 'activitymanag':615 'activitymanager.queryactivitystarting':675 'activitymanager.startactivityupdates':624 'activitymanager.stopactivityupdates':661 'actual':1087 'add':145 'altimet':588,703 'altimeter.startabsolutealtitudeupdates':741 'altimeter.startrelativealtitudeupdates':709 'altimeter.stopabsolutealtitudeupdates':759 'altimeter.stoprelativealtitudeupdates':729 'altitud':29,116,120,699,722,732,753 'anim':913,916,934,937 'api':68,190,192,1037 'app':158,166,174,245,851,1023 'appropri':1060 'arbitrari':448 'assum':972 'attitud':378,411,436,1081 'attitude.pitch':432 'attitude.roll':434 'author':182,199,224,1032 'avail':481,487,573,867,1025 'available.contains':490 'barometr':587 'base':35,359,735,1085 'batch':1100 'batteri':125,130,763,768,906 'block':1063 'bool':914,935 'break':222,225,233,236 'byad':669 'cadenc':508,595 'calendar.current.date':668 'calendar.current.startofday':524 'calibr':386 'call':1049 'cap':805 'case':74,215,223,226,441,767 'casual':779 'chang':30 'check':480,574,578,868,882,981,994,1026,1034,1069,1077 'checklist':137,140,1008 'chosen':1084 'class':835,840,854,907 'clear':1015 'cmaltimet':115,119,698,704,1128 'cmaltimeter-altitude-data':118 'cmaltimeter.isabsolutealtitudeavailable':738 'cmaltimeter.isrelativealtitudeavailable':706 'cmauthorizationstatus':185 'cmbatchedsensormanag':815,1132 'cmdevicemot':375,1124 'cmmotionact':974 'cmmotionactivity.confidence':1068 'cmmotionactivitymanag':108,112,597,616,1120 'cmmotionactivitymanager-activity-recognit':111 'cmmotionactivitymanager.authorizationstatus':212 'cmmotionactivitymanager.isactivityavailable':618 'cmmotionmanag':83,87,237,243,257,804,825,839,844,862,1018,1112 'cmmotionmanager-sensor-data':86 'cmmotionmanager.availableattitudereferenceframes':488 'cmpedomet':97,103,497,502,515,1116 'cmpedometer-step-and-distance-data':102 'cmpedometer.isstepcountingavailable':517 'common':131,134,819 'common-mistak':133 'compass':952,966 'confid':638,995 'content':80 'core':2 'core-mot':1 'coremot':15,38,54,183,209,254,1107 'correct':457,845,881,924,957,988 'count':22,505,511 'counter':581 'counterpart':928,1056 'crash':167,871 'creat':240,823 'cycl':608,655 'data':13,21,42,64,85,89,101,107,117,121,161,177,239,273,279,306,312,351,501,529,534,558,563,593,596,700,712,717,744,749,879,892,1141 'data.acceleration':355 'data.accuracy':757 'data.altitude':754 'data.distance':543 'data.floorsascended':550 'data.numberofsteps':540,568 'data.pressure':727 'data.relativealtitude':723 'date':526,528,557,674,679 'day':670 'default':235,443,1090 'degrad':248,829 'degre':427 'deni':228 'descript':205 'detect':24,600 'devic':19,40,62,91,95,363,365,873,1139 'device-mot':61,1138 'direct':229 'dispatch':1058 'display':347,953 'distanc':100,106,500,506,542,584 'done':291,571 'doublevalu':544 'drain':905 'drift':460 'els':263,281,298,314,392,408,518,535,564,619,632,640,645,651,656,688,707,718,739,750,886,1001 'enough':963 'error':274,307,403,530,559,683,713,745,1075 'estim':585 'etc':1031 'exact':241 'exclus':978 'explain':155 'explan':1016 'explicit':198 'extend':1096 'face':153 'field':388 'final':853 'first':169,220,883 'fit':70 'floor':510,548,590 'forget':896 'frame':340,438,439,482,1083 'framework':1108 'frequenc':799,813,1045 'func':911,932 'fuse':55,367 'game':326,328,345,452,780,786 'get':1136 'gps':734 'gps-base':733 'graviti':381,420 'guard':261,276,296,309,390,405,516,532,561,617,629,685,705,715,737,747,884 'gyro':194,459 'gyroscop':6,44,293,369,875 'handledriv':1006 'handler':333,1057,1080 'handlewalk':987,1000 'hardwar':582 'head':423 'headphon':1103 'heavi':1066 'high':787,795,943,999 'higher':812 'histor':520,662 'hz':269,765,808,949,959 'impact':769 'implement':32 'import':208,253 'info.plist':144,148,1012 'input':58 'instanc':247,826,834,847,1019 'integr':1099 'interact':36 'interv':123,128,761,764,1039 'intvalu':551 'io':51,78 'iphon':793 'isaccelerometeravail':1030 'iscadenceavail':594 'isdistanceavail':583 'isfloorcountingavail':586 'ispaceavail':591 'isstepcountingavail':579 'keep':903 'key':164,206 'kpa':728 'latest':337 'let':210,255,277,310,350,353,406,410,416,419,422,486,513,533,562,614,630,666,686,702,716,748,837,842,857,860 'lifecycl':929,1055 'link':348 'live':553,621 'locat':479 'loop':346 'low':775,1005 'lowest':798,1043 'm':755,758 'magnet':387,467 'magnetomet':7,45,371,429,470,478 'main':272,305,401,626,681,711,743,878,891,919,1064 'manag':861,1102 'match':1051 'max':791 'meet':801 'meter':546,724 'method':575,930 'miss':921 'mistak':132,135,820 'moder':781 'motion':3,34,63,92,96,160,176,364,366,402,407,838,843,1104,1140 'motion-bas':33 'motion.attitude':412 'motion.gravity':421 'motion.heading':424 'motion.useracceleration':418 'motionmanag':256 'motionmanager.accelerometerdata':352 'motionmanager.accelerometerupdateinterval':265 'motionmanager.devicemotionupdateinterval':394,954,967 'motionmanager.gyroupdateinterval':300 'motionmanager.isaccelerometeravailable':262 'motionmanager.isdevicemotionavailable':391 'motionmanager.isgyroavailable':297,885 'motionmanager.startaccelerometerupdates':270,342,917 'motionmanager.startdevicemotionupdates':397 'motionmanager.startgyroupdates':303,876,889 'motionmanager.stopaccelerometerupdates':292,938 'motionmanager.stopdevicemotionupdates':435 'motionmanager.stopgyroupdates':323 'motionservic':855,859 'motionvc':908 'move':357 'multipl':246,824,989 'mutual':977 'navig':72 'need':159,803,1088 'north':468,476,496,1093 'notdetermin':216 'nsmotionusagedescript':146,172,1009 'object':376 'observ':852 'one':242,983 'orient':774 'overrid':910,931 'pace':507,592 'paramet':1076 'pattern':325,1097 'pedomet':8,46,187,514 'pedometer.querypedometerdata':522 'pedometer.startupdates':555 'pedometer.stopupdates':572 'pedometer/activity':67,1036 'per':244,809 'pitch':414,431 'player':358 'point':465,473 'poll':324,335 'present':1010 'pressur':726 'print':283,316,430,537,541,547,566,636,643,648,654,659,694,720,725,752 'process':60,90,94,362,1067,1137 'processed-device-mot':93 'prompt':218 'properti':975,984 'provid':66,503 'queri':521,664 'queue':1061 'rate':251,384,792,831,945 'raw':56 'read':18,39 'recognit':12,49,110,114,599 'refer':141,142,437,1082,1095 'references/motion-patterns.md':1105,1106 'relat':721 'remov':382 'requir':197,202,428,469,477 'restrict':227 'return':264,282,299,315,393,409,519,536,565,620,633,689,708,719,740,751,888 'review':136,139,1007 'review-checklist':138 'roll':413,433 'rotat':383 'rotationr':311,313 'rotationrate.x':318 'rotationrate.y':320 'rotationrate.z':322 'run':607,644,904 'safe':492 'sampl':338,810 'sensor':20,41,57,84,88,191,238,249,866,1024,1101 'set':232,1040 'setup':81,82,143 'share':848,858,1020 'showunsupportedmessag':887 'simultan':993 'singl':374,846,1017 'skill' 'skill-core-motion' 'skip':865 'sosumi.ai':1110,1114,1118,1122,1126,1130,1134,1143 'sosumi.ai/documentation/coremotion)':1109 'sosumi.ai/documentation/coremotion/cmaltimeter)':1129 'sosumi.ai/documentation/coremotion/cmbatchedsensormanager)':1133 'sosumi.ai/documentation/coremotion/cmdevicemotion)':1125 'sosumi.ai/documentation/coremotion/cmmotionactivitymanager)':1121 'sosumi.ai/documentation/coremotion/cmmotionmanager)':1113 'sosumi.ai/documentation/coremotion/cmpedometer)':1117 'sosumi.ai/documentation/coremotion/getting-processed-device-motion-data)':1142 'source-dpearson2699' 'start':329,450,1028,1047 'static':856 'stationari':605,660 'status':211,214,1033 'step':23,98,104,498,504,538,567,580 'stop':569,898,923,925,1052 'string':154 'super.viewdidappear':915 'super.viewdiddisappear':936 'swift':76,207,252,260,295,341,389,485,512,613,665,701,736,827,869,900,946,979 'swiftui':1098 'switch':213 'target':75 'tilt':354,361 'time':462 'today':539 'topic-accessibility' 'topic-agent-skills' 'topic-ai-coding' 'topic-apple' 'topic-claude-code' 'topic-codex-skills' 'topic-cursor-skills' 'topic-ios' 'topic-ios-development' 'topic-liquid-glass' 'topic-localization' 'topic-mapkit' 'track':28,179 'true':475,495,992,1092 'type':1074 'ui':773 'uiviewcontrol':909 'unknown':234 'unnecessarili':942,1094 'updat':122,127,250,259,294,330,554,623,760,830,899,902,944,1029,1038,1048,1053,1079 'update-intervals-and-batteri':126 'usag':204 'use':14,16,73,175,184,221,398,440,484,494,766,796,814,941 'user':25,152,230,379,603 'user-fac':151 'useraccel':417 'valu':671 'vehicl':612,650 'vertic':446 'viewa':836 'viewb':841 'viewdidappear':912 'viewdiddisappear':922,933 'walk':606,637,696 'walking/running/driving':27 'watcho':53 'watchos/ios':817 'whether':601 'without':162,331,874 'wrong':828,870,901,947,980 'x':284,317,356,447,464,472 'xarbitrarycorrectedzvert':453 'xarbitraryzvert':399,442 'xmagneticnorthzvert':463 'xml':171 'xtruenorthzvert':471,491 'y':286,319 'yaw':415 'yesterday':667,677 'z':288,321,444","prices":[{"id":"a054cf58-7957-49fa-a90b-fc0d35123806","listingId":"5833d5fa-7c91-4935-b172-dbb0a3e92afb","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"dpearson2699","category":"swift-ios-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T20:34:35.814Z"}],"sources":[{"listingId":"5833d5fa-7c91-4935-b172-dbb0a3e92afb","source":"github","sourceId":"dpearson2699/swift-ios-skills/core-motion","sourceUrl":"https://github.com/dpearson2699/swift-ios-skills/tree/main/skills/core-motion","isPrimary":false,"firstSeenAt":"2026-04-18T22:00:52.313Z","lastSeenAt":"2026-05-18T18:53:40.700Z"},{"listingId":"5833d5fa-7c91-4935-b172-dbb0a3e92afb","source":"skills_sh","sourceId":"dpearson2699/swift-ios-skills/core-motion","sourceUrl":"https://skills.sh/dpearson2699/swift-ios-skills/core-motion","isPrimary":true,"firstSeenAt":"2026-04-18T20:34:35.814Z","lastSeenAt":"2026-05-07T22:40:34.022Z"}],"details":{"listingId":"5833d5fa-7c91-4935-b172-dbb0a3e92afb","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"dpearson2699","slug":"core-motion","github":{"repo":"dpearson2699/swift-ios-skills","stars":599,"topics":["accessibility","agent-skills","ai-coding","apple","claude-code","codex-skills","cursor-skills","ios","ios-development","liquid-glass","localization","mapkit","networking","storekit","swift","swift-concurrency","swiftdata","swiftui","widgetkit","xcode"],"license":"other","html_url":"https://github.com/dpearson2699/swift-ios-skills","pushed_at":"2026-04-26T21:04:17Z","description":"Agent Skills for iOS 26+, Swift 6.3, SwiftUI, and modern Apple frameworks","skill_md_sha":"f4cf514646381f38b881c84bebbcf2d03a522e1a","skill_md_path":"skills/core-motion/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/dpearson2699/swift-ios-skills/tree/main/skills/core-motion"},"layout":"multi","source":"github","category":"swift-ios-skills","frontmatter":{"name":"core-motion","description":"Access accelerometer, gyroscope, magnetometer, pedometer, and activity-recognition data using CoreMotion. Use when reading device sensor data, counting steps, detecting user activity (walking/running/driving), tracking altitude changes, or implementing motion-based interactions in iOS/watchOS apps."},"skills_sh_url":"https://skills.sh/dpearson2699/swift-ios-skills/core-motion"},"updatedAt":"2026-05-18T18:53:40.700Z"}}