Swift

Swift – 活动器CMMotionActivityManager的使用(获取当前的运动状态)

1 CMMotionActivityManager介绍

活动器 CMMotionActivityManagerCoreMotion 框架中的一个功能类,主要用于检查用户当前的活动状态。

总共可以检测到 5 种状态:静止步行跑步自行车驾车

同时每次返回结果时,都会附带本次结果准确程度的描述,共有:三个等级。

2 使用样例

(1)程序启动后先判断设备是否支持活动器(需要5S或以后的设备)。

(2)如果支持的话则实时获取当前的运动状态以及精确度。并将这些数据不断更新到界面上。


3 样例实现

(1)由于安全限制,首先我们要在 info.plist 文件中加入访问用户健康和运动信息的相关描述。

(2)样例代码

import UIKit
import CoreMotion
 
class ViewController: UIViewController {
    //用于显示实时信息
    @IBOutlet weak var textView: UITextView!
     
    //活动器对象
    let motionActivityManager = CMMotionActivityManager()
     
    override func viewDidLoad() {
        super.viewDidLoad()
         
        //开始获取活动状态
        startActivityUpdates()
    }
     
    // 开始获取活动器数据
    func startActivityUpdates() {
        //判断设备支持情况
        guard CMMotionActivityManager.isActivityAvailable() else {
            self.textView.text = "\n当前设备不支持获取当前运动状态\n"
            return
        }
         
        //初始化并开始实时获取数据
        let queue = OperationQueue.current
        self.motionActivityManager.startActivityUpdates(to: queue!, withHandler: {
            activity in
            //获取各个数据
            var text = "---活动器数据---\n"
            text += "当前状态: \(activity!.getDescription())\n"
            if (activity!.confidence == .low) {
                text += "准确度: 低\n"
            } else if (activity!.confidence == .medium) {
                text += "准确度: 低\n"
            } else if (activity!.confidence == .high) {
                text += "准确度: 高\n"
            }
            self.textView.text = text
        })
    }
     
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}
 
extension CMMotionActivity {
    /// 获取用户设备当前所处环境的描述
    func getDescription() -> String {
        if self.stationary {
            return "静止"
        } else if self.walking {
            return "步行"
        } else if self.running {
            return "跑步"
        } else if self.automotive {
            return "驾车"
        }else if self.cycling {
            return "自行车"
        }
        return "未知"
    }
}