如何在Xcode中实现点击按钮打印iPhone指南针朝向数据?
解决方案
核心问题原因
- 缺少主动申请iOS位置权限的逻辑,未授权状态下CoreLocation不会触发任何更新回调
- 未在Info.plist中配置权限说明文本,权限申请会直接被系统拒绝
- 缺少对无效朝向数据的过滤,部分无效返回不会输出可识别内容
修复步骤
- 首先在项目的Info.plist中添加权限配置,右键选择Add Row,添加
NSLocationWhenInUseUsageDescription字段,值填写你向用户解释权限用途的文本,比如需要获取位置权限以读取指南针朝向 - 替换为以下修改后的代码:
import UIKit import CoreLocation class PointingViewController: UIViewController, CLLocationManagerDelegate { var locationManager: CLLocationManager = CLLocationManager() override func viewDidLoad() { super.viewDidLoad() locationManager.delegate = self // 设置朝向更新精度,单位为度,1度精度可满足绝大多数日常使用场景 locationManager.headingFilter = 1 // 首次使用主动申请位置权限 if locationManager.authorizationStatus == .notDetermined { locationManager.requestWhenInUseAuthorization() } } func locationManager(_ manager: CLLocationManager, didUpdateHeading newHeading: CLHeading) { // 过滤无效朝向数据,精度小于0代表当前读取的朝向不可用 guard newHeading.headingAccuracy >= 0 else { return } print("当前磁北朝向:\(newHeading.magneticHeading)") print("当前真北朝向:\(newHeading.trueHeading)") // 如果每次点击仅需要获取一次当前朝向,拿到有效值后可停止更新节省电量 // locationManager.stopUpdatingHeading() } // 监听权限状态变更 func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) { let status = manager.authorizationStatus if status == .authorizedWhenInUse || status == .authorizedAlways { print("位置权限已获取,可正常读取指南针数据") } else { print("位置权限未开启,无法获取指南针数据") } } @IBAction func firstButtonPressed(_ sender: Any) { // 点击按钮时先校验权限状态 let status = locationManager.authorizationStatus guard status == .authorizedWhenInUse || status == .authorizedAlways else { // 此处可自定义弹框引导用户开启权限 print("请先开启位置权限后重试") return } locationManager.startUpdatingHeading() } }
额外注意事项
- 必须使用真机调试,iOS模拟器没有指南针硬件,无法返回任何朝向数据
- 仅需要相对磁北方向时直接使用
magneticHeading即可,trueHeading需要设备获取到GPS定位才会返回有效值 - 如果应用不需要持续获取朝向变化,建议每次拿到有效数据后主动调用
locationManager.stopUpdatingHeading()停止更新
内容的提问来源于stack exchange,提问作者Lior Colina
相关产品推荐
相关产品推荐

