Swift - 磁力计数据的获取(附样例)
使用 CoreMotion 框架,我们可以很方便地获取设备各种传感器的数据(比如:加速器、陀螺仪、磁力计)。上文中我介绍了陀螺仪(点击查看),本文接着讲解如何获取磁力计相关数据。
一、相关说明
1,磁力计介绍
磁力计(又叫磁力传感器、磁力仪、磁场计、磁强计),它可以用来感应周边的磁场情况。
其获取的数据包含三轴磁力值。
iPad的盒盖锁屏功能就是通过磁力计实现。同时它可以感应地球磁场, 获得方向信息, 使位置服务数据更精准,常用于电子罗盘和导航应用。
2,CMMotionManager类
(1)通过 CMMotionManager 类我们可以获取到加速器,陀螺仪,磁力仪,传感器这4类数据,同时它们的接口是一致的。
(2)CMMotionManager 同时提供了"拉"和"推"两种方式的获取方式。二者区别如下:
- 通过获取当前任何传感器的状态或是 CoreMotionManager 的只读属性组合数据来“拉”动态数据。
- 通过 block 闭包在特定的时间间隔来获取你想要的更新数据集合来捕获“推”数据。
二、使用样例
1,需要的时候才去采集数据
(1)效果图
这个便是前面讲的拉数据(pull)。我们每次点击“获取数据”按钮后,便去取当前磁力计的数据并显示出来。

(2)样例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | import UIKit import CoreMotion class ViewController : UIViewController { //用于显示数据信息 @IBOutlet weak var textView: UITextView ! //运动管理器 let motionManager = CMMotionManager () override func viewDidLoad() { super .viewDidLoad() } //点击获取当前磁力计数据 @IBAction func getMagnetometerData(_ sender: Any ) { //判断设备支持情况 guard motionManager.isMagnetometerAvailable else { self .textView.text = "\n当前设备不支持磁力计\n" return } //获取数据 self .motionManager.startMagnetometerUpdates() if let magnetometerData = self .motionManager.magnetometerData { let magneticField = magnetometerData.magneticField var text = "---当前磁力计数据---\n" text += "x: \(magneticField.x)\n" text += "y: \(magneticField.y)\n" text += "z: \(magneticField.z)\n" self .textView.text = text } } override func didReceiveMemoryWarning() { super .didReceiveMemoryWarning() } } |
2,实时采集所有数据
(1)效果图这个便是前面讲的推数据(push)。根据我们设置的采集频率(通知频率)来不断地获取最新数据。

(2)样例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | import UIKit import CoreMotion class ViewController : UIViewController { //用于显示数据信息 @IBOutlet weak var textView: UITextView ! //运动管理器 let motionManager = CMMotionManager () //刷新时间间隔 let timeInterval: TimeInterval = 0.2 override func viewDidLoad() { super .viewDidLoad() //开始磁力计更新 startMagnetometerUpdates() } // 开始获取磁力计数据 func startMagnetometerUpdates() { //判断设备支持情况 guard motionManager.isMagnetometerAvailable else { self .textView.text = "\n当前设备不支持磁力计\n" return } //设置刷新时间间隔 self .motionManager.magnetometerUpdateInterval = self .timeInterval //开始实时获取数据 let queue = OperationQueue .current self .motionManager.startMagnetometerUpdates(to: queue!, withHandler: { (magnetometerData, error) in guard error == nil else { print (error!) return } // 有更新 if self .motionManager.isMagnetometerActive { if let magneticField = magnetometerData?.magneticField { var text = "---当前磁力计数据---\n" text += "x: \(magneticField.x)\n" text += "y: \(magneticField.y)\n" text += "z: \(magneticField.z)\n" self .textView.text = text } } }) } override func didReceiveMemoryWarning() { super .didReceiveMemoryWarning() } } |