CMotionManager在实例化时崩溃

12

编辑:这似乎已经在iOS 13上得到解决,以下是所有原始细节。

当我实例化用于核心运动的CMMotionManager对象时,我的应用程序崩溃了。这是在运行iOS 12.0.1的iPhone Xs上发生的。

我可以使用以下视图控制器可靠地重现此问题。

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()
    }
}
完整的示例项目在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) 

有人以前遇到过这个问题或者有解决崩溃的想法吗?


1
在他人的帮助下,我已经发现该问题可在 iPhone X 和 Xs 上重现,但不会在 iPhone SE、6S、7 或 iPad (2017) 上出现。这可能意味着它是与 A11 芯片或更新的设备有关。 - smithco
参考资料,我发现在我的iPhone Xs上使用iOS 12.1 beta版本时出现了相同的错误。 - smithco
2
这是针对 iPhone X 系列的特定问题。我在 Xs Max 上遇到了相同的错误,但在其他设备上没有任何问题。即使核心运动实例化在 DispatchQueue.main.async 块内部,它仍然会发生。看起来像是苹果的一个 bug。 - SafeFastExpressive
1
这个错误在iPhone XS iOS12.1.2 Beta版本中仍然存在。 - Neimsz
1
我在运行iOS 12.3.1的iPhone XR上仍然遇到这个问题。行为很奇怪。如果我以调试模式启动应用程序,堆栈跟踪似乎像发生了崩溃一样,但是应用程序继续运行而没有任何问题。然而,如果我运行UI测试,同样的CoreMotion事件会触发相同的堆栈跟踪并且合法地使应用程序崩溃,从而防止测试运行。 - christopherdrum
显示剩余6条评论
2个回答

4

我已经在 iPhone 6S iPhone 7 上测试了您的应用程序 - 显然使用的是iOS 12.0.1。我还检查了您的项目中的一些内容,并且完全无法重现您的问题 - 即使在模拟器中也不行 - 而且我认为不可能下载带有特定修复程序( 12.0.x )的模拟器,只能进行次要版本更新 - 因此下一个版本是 12.1 。这看起来非常特定于iPhone XS硬件,我建议您向 Apple支持提交问题。

编辑:好吧,我看到您已经在 openradar 上填写了错误报告。 这个人甚至引用了 openradar-mirror 上的错误报告状态。


感谢您检查这两个设备。我还可以确认iPhone SE和iPad(2017年型号)都很好。然而,iPhone X和Xs明显存在问题。顺便说一句,我已经向苹果报告了一个错误,但那个开放式雷达不是我的,很高兴知道其他人也在关注这个问题。 - smithco
1
是的,说实话,这个错误真的非常奇怪 - 考虑到CoreMotion库的功能。很抱歉我不能再帮你了伙计! - Guilherme Matuella
我在我的项目中遇到了同样的问题,而且只发生在我的XS上。iPhone 7没问题。真的很奇怪。可能是个bug。 - arthurschiller
1
即使在主线程块中调用,仅在Xs Max上发生(但不在我的iPhone X上)。在先前的型号上没有发生。 - SafeFastExpressive
我使用iOS 12.1.4 iPhone XS Max,但这仍然无法正常工作。我已在bugreport.apple.com上提交了rdar,并且工程师已将我的错误标记为重复。希望他们能尽快修复这个问题。 - Parth Sane

-1

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

DispatchQueue.main.async {
    //your code here
}

看起来你正在viewDidLoad()中尝试执行与UI相关的操作。从技术上讲,这样做没问题,但要记住,在那个时候可能还没有布局出一些视图。


2
我希望这只是一个来自主线程的突发UI调用,就像它看起来那么简单 :-P。无论是否在DispatchQueue.main.async块中,都会发生相同的错误。示例应用程序除了对视图控制器的viewDidLoad调用之外没有其他UI操作。 - smithco
2
很明显他在viewDidLoad方法中没有执行任何与UI相关的操作,只是实例化了一个CMMotionManager。 - Guilherme Matuella

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接