CoreMotion的主线程检查器警告仅出现在2018年型号的iPhone上

Cod*_*der 16 iphone xcode ios core-motion

以下是该问题的极为简化的版本:

import UIKit
import CoreMotion

class ViewController: UIViewController {
    private let manager = CMMotionManager()
    private let interval = 0.01

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        startUpdates()
    }

    private func startUpdates() {
        let queue = OperationQueue()
        queue.name = "com.demo.motion"
        queue.qualityOfService = .userInteractive
        queue.maxConcurrentOperationCount = 1
        manager.accelerometerUpdateInterval = interval
        manager.startAccelerometerUpdates(to: queue) { _, _ in }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我在iPhone XR上运行此程序时,我将收到以下消息:

主线程检查器:在后台线程上调用的UI API:-[UIApplication applicationState] PID:1237,TID:147763,线程名称:com.apple.CoreMotion.MotionThread,队列名称:com.apple.root.default-qos.overcommit ,QoS:0

  • 我的设备正在运行12.3,这是当前最新的iOS版本
  • 在各种iPad(2018年之前),iPhone 8,iPhone 6S和其他较旧型号上运行此程序时,不会出现此问题。
  • 更改qualityOfService对此没有影响(我的首选是使用utility
  • 出于好奇,我将整个startUpdates()功能包装在主调度程序周围,但没有成功

根据队列名称和发生的时间,我认为这是内部的东西,与较旧的设备相比,XR中速度更快的处理器才暴露出来。

Cod*_*der 13

使用iOS 13时的新答案

我刚刚在2018年的设备上使用新发布的iOS 13版本(17A577)对它进行了测试,它不再产生线程错误。

使用iOS 12时的上一个答案

这是一个已知问题,已通过此处的雷达报告给Apple