我的应用使用iOS(iPhone)上CMAltimeter的气压数据.一直都很好.但在安装iOS 17.4后,它停止工作.其他使用气压数据的应用程序也停止工作.因此,这似乎是iOS 17.4中的一个主要故障.

以下是用于测试这一点的(SWIFT)代码.此代码过go 在早期版本的iOS中运行良好,但在17.4中,authorizationStatus()返回.restricted,调用处理程序时出现错误:

The operation couldn’t be completed. (CMErrorDomain error 105.)

这一切都表明存在一些身份验证失败.我已经在Apple上记录了错误报告.

但我想知道其他人是否也经历过同样的经历,是否有一些变通办法/解决方案,使气压数据再次可用.

if CMAltimeter.isRelativeAltitudeAvailable() {
    status = CMAltimeter.authorizationStatus()
    self.altimeter.startRelativeAltitudeUpdates(to: OperationQueue.main) { (data, _error) in
        DispatchQueue.main.async {
            error = _error != nil ? _error!.localizedDescription : "<nil>"
            print(error)
            pressure = data != nil ? String(format: "%f", data!.pressure.doubleValue) : ""
        }
    }
}

PS: Core Motion的文档(CMAltimeter是其中的一部分)指出,需要为所有Core Motion服务定义NSMotionUsageDescription .info.plist属性.我有这个财产,但它似乎没有什么不同.

推荐答案

Note that the following is a work-around. I urge everybody to file a bug-report with Apple, to make sure there is pressure on Apple to fix this.

首先,NSMotionUsageDescription键必须在应用程序的.info.plist文件中定义.

其他人则提出了CMSensorRecorder种变通办法.事实证明,设置应用程序中的"健身跟踪"设置需要启用才能工作.

authorizationStatus.restricted,时,用户首先需要打开设置>;"隐私和安全">;"运动和健身">;"健身跟踪".

authorizationStatus.notDetermined,时,则开始CMSensorRecorder.你的应用程序的设置中将添加"Motion&;Fitness"隐私设置,用户将被iOS要求授权.当用户接受时,authorizationStatus将更改为.authorized,您可以启动CMAltimeter.

authorizationStatus.denied,时,用户需要打开应用程序的"运动健身"隐私设置.&

以下代码对我有效:

let status = CMAltimeter.authorizationStatus()
switch status {
case .notDetermined:
    // trigger a authorization popup
    let recorder = CMSensorRecorder()
    DispatchQueue.global().async {
       recorder.recordAccelerometer(forDuration: 0.1)
    }
case .restricted:
    popupText = "Please switch \"Fitness Tracking\" on, in the Apple Settings app, under \"Privacy & Security\" > \"Motion & Fitness\""
    showingPopup = true
case .denied:
    popupText = "Please switch \"Motion & Fitness\" on, in the app settings"
    showingPopup = true
default:
    print("authorized")
}
Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { timer in
   let status = CMAltimeter.authorizationStatus()
   if status == .authorized {
      timer.invalidate()
      self.altimeter.startRelativeAltitudeUpdates(to: OperationQueue.main) { (data, _error) in
         // handle altimeter data
      }
   }
}

Ios相关问答推荐

PieChartView未以编程方式显示在屏幕上

Flutter 翼项目.升级到XCode 15.0.1`pod install`抛出错误FlutterMacOS.podspec.json 3.13.2的ParserError

如何在Swift中同时实现三个手势?

如何在Combine发布者之间强制执行最小延迟

为什么在Actor内部使用withTaskGroupwork并行运行?

更改订单时如何保存商品的位置?

在标签中显示多个计数器但在同一屏幕(Swift,IOS)

PropertyWrapper 不存在的 Codable 属性的默认值

SwiftUI NavigationLink 立即加载目标视图,无需单击

iPhone 6 和 6 Plus 媒体查询

在 iOS 中获取设备位置(仅限国家/地区)

NSURLConnection 的 Xcode 4 警告未使用表达式结果

改变 UIView 位置的简单方法?

构建失败:ld:重复符号 _OBJC_CLASS_$_Algebra5FirstViewController

在 Swift 中将 HTML 转换为纯文本

从 NSData 或 UIImage 中查找图像类型

应用程序不包含正确的测试版权利

由于 GoogleSignIn、AdMob 提交应用程序时 iOS 10 GM 发布错误应用程序try 在没有使用说明的情况下访问隐私敏感数据

Flutter:如何创建一个新项目

打开 XIB 文件后 Xcode 6.3 冻结/挂起