CMotionManager在实例化时崩溃

smi*_*hco 12 ios core-motion swift ios12

我在为Core Motion实例化我的CMMotionManager对象时遇到了崩溃.这是在运行iOS 12.0.1的iPhone X上.

我可以通过单视图应用程序使用以下视图控制器可靠地重现这一点.

import UIKit
import CoreMotion

class ViewController: UIViewController {
    var motion: CMMotionManager?
    override func viewDidLoad() {
        super.viewDidLoad()

        // This causes a crash on iPhone Xs, iOS 12.0.1
        self.motion = CMMotionManager()
    }
}
Run Code Online (Sandbox Code Playgroud)

完整示例项目位于https://github.com/doctorcolinsmith/motiontestcrash/tree/master

运行上面的代码时,我在调试器中输出以下输出的线程上出现故障.

=================================================================
Main Thread Checker: UI API called on a background thread: -[UIApplication applicationState]
PID: 3634, TID: 630341, Thread name: com.apple.CoreMotion.MotionThread, Queue name: com.apple.root.default-qos.overcommit, QoS: 0
Backtrace:
4   libobjc.A.dylib                     0x000000019b0d3894 <redacted> + 56
5   CoreMotion                          0x00000001a19337a4 CoreMotion + 305060
6   CoreMotion                          0x00000001a1933cd8 CoreMotion + 306392
7   CoreMotion                          0x00000001a1933be8 CoreMotion + 306152
8   CoreMotion                          0x00000001a19653cc CoreMotion + 508876
9   CoreMotion                          0x00000001a196542c CoreMotion + 508972
10  CoreFoundation                      0x000000019be6c888 <redacted> + 28
11  CoreFoundation                      0x000000019be6c16c <redacted> + 276
12  CoreFoundation                      0x000000019be67470 <redacted> + 2324
13  CoreFoundation                      0x000000019be66844 CFRunLoopRunSpecific + 452
14  CoreFoundation                      0x000000019be675a8 CFRunLoopRun + 84
15  CoreMotion                          0x00000001a1964d64 CoreMotion + 507236
16  libsystem_pthread.dylib             0x000000019bae1a04 <redacted> + 132
17  libsystem_pthread.dylib             0x000000019bae1960 _pthread_start + 52
18  libsystem_pthread.dylib             0x000000019bae9df4 thread_start + 4
2018-10-24 16:19:31.423680-0700 motiontest[3634:630341] [reports] Main Thread Checker: UI API called on a background thread: -[UIApplication applicationState]
PID: 3634, TID: 630341, Thread name: com.apple.CoreMotion.MotionThread, Queue name: com.apple.root.default-qos.overcommit, QoS: 0
Backtrace:
4   libobjc.A.dylib                     0x000000019b0d3894 <redacted> + 56
5   CoreMotion                          0x00000001a19337a4 CoreMotion + 305060
6   CoreMotion                          0x00000001a1933cd8 CoreMotion + 306392
7   CoreMotion                          0x00000001a1933be8 CoreMotion + 306152
8   CoreMotion                          0x00000001a19653cc CoreMotion + 508876
9   CoreMotion                          0x00000001a196542c CoreMotion + 508972
10  CoreFoundation                      0x000000019be6c888 <redacted> + 28
11  CoreFoundation                      0x000000019be6c16c <redacted> + 276
12  CoreFoundation                      0x000000019be67470 <redacted> + 2324
13  CoreFoundation                      0x000000019be66844 CFRunLoopRunSpecific + 452
14  CoreFoundation                      0x000000019be675a8 CFRunLoopRun + 84
15  CoreMotion                          0x00000001a1964d64 CoreMotion + 507236
16  libsystem_pthread.dylib             0x000000019bae1a04 <redacted> + 132
17  libsystem_pthread.dylib             0x000000019bae1960 _pthread_start + 52
18  libsystem_pthread.dylib             0x000000019bae9df4 thread_start + 4
(lldb) 
Run Code Online (Sandbox Code Playgroud)

有没有人遇到过这个问题,或者对如何解决崩溃问题有所了解?

Tom*_*DRS -1

我对 CoreMotion 了解不多,但错误消息告诉您正在尝试在后台线程上调用 UI 操作。尝试将您的代码放入:

DispatchQueue.main.async {
    //your code here
}
Run Code Online (Sandbox Code Playgroud)

您似乎还尝试在 中执行与 UI 相关的操作viewDidLoad()。从技术上讲,这没问题,但请记住,某些视图可能尚未在当时列出。

  • 我希望这就像流氓 UI 调用主线程一样简单:-P。无论是否在 DispatchQueue.main.async 块中,都会发生相同的错误。除了视图控制器上的 viewDidLoad 调用之外,示例应用程序没有其他 UI 操作。 (2认同)
  • 显然他没有在 viewDidLoad 中执行任何与 UI 相关的操作,只是实例化了 CMMotionManager。 (2认同)