You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 02:06:05