iOS设备如何检测系统设置中Motion & Fitness功能是否开启
检测iOS系统级Motion & Fitness总开关状态的可行方案
可以通过官方公开的CoreMotion API的状态返回值和错误特征实现判断,无需调用私有API,符合App Store审核要求。
判断逻辑
- 第一步:先验证设备硬件是否支持Motion & Fitness功能
调用CMMotionActivityManager.isActivityAvailable(),如果返回false说明设备本身不支持该功能,无需后续判断。 - 第二步:根据授权状态和错误特征做细分判断
- 当
CMMotionActivityManager.authorizationStatus()返回.authorized:说明系统总开关已开启,且你的应用已获得授权 - 当返回
.denied/.restricted时,主动调用一次CMMotionActivityManager的活动查询接口,根据返回的错误类型区分两种场景:- 返回错误码为
CMError.Code.motionActivityNotAllowed:对应 系统级Motion & Fitness总开关已关闭 - 返回错误码为
CMError.Code.motionActivityNotAuthorized:对应系统总开关已开启,但用户单独拒绝了你的应用的Motion授权
- 返回错误码为
- 当返回
.notDetermined时,主动触发一次授权请求,若系统未弹出授权弹窗且直接返回上述motionActivityNotAllowed错误,即可判定系统总开关处于关闭状态。
- 当
代码示例(Swift)
import CoreMotion let motionManager = CMMotionActivityManager() func checkSystemMotionFitnessSwitchStatus(completion: @escaping (Bool) -> Void) { guard CMMotionActivityManager.isActivityAvailable() else { completion(false) // 硬件不支持 return } let status = CMMotionActivityManager.authorizationStatus() switch status { case .authorized: completion(true) // 总开关已开且应用已授权 case .denied, .restricted: // 主动查询一次区分错误类型 motionManager.queryActivityStarting(from: Date(), to: Date(), to: .main) { _, error in if let error = error as? CMError { completion(error.code != .motionActivityNotAllowed) } motionManager.stopActivityUpdates() } case .notDetermined: // 触发授权请求 motionManager.queryActivityStarting(from: Date(), to: Date(), to: .main) { _, error in if let error = error as? CMError, error.code == .motionActivityNotAllowed { completion(false) // 总开关关闭,未弹出授权窗 } else { let newStatus = CMMotionActivityManager.authorizationStatus() completion(newStatus != .denied) } motionManager.stopActivityUpdates() } @unknown default: completion(false) } }
注意事项
- 需要提前在项目Info.plist中添加
NSMotionUsageDescription权限描述,否则调用接口会直接触发崩溃 - 上述判断逻辑完全基于官方公开API,不会触发App Store审核拒绝
内容的提问来源于stack exchange,提问作者michaelthedeveloper
相关产品推荐
相关产品推荐

