Сбой CMotionManager при создании экземпляра
ОБНОВЛЕНИЕ: Похоже, что это решается в iOS 13. Оставляя все оригинальные детали ниже.
Я получаю сбой при создании экземпляра моего объекта CMMotionManager для Core Motion. Это на iPhone Xs под управлением iOS 12.0.1.
Я могу надежно воспроизвести это с помощью приложения с одним представлением со следующим контроллером представления.
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 6S, так и на iPhone 7 - очевидно, с iOS 12.0.1. Я также проверил несколько вещей в вашем проекте и не смог воспроизвести вашу проблему вообще - даже в симуляторах - и я не думаю, что возможно скачать симулятор с конкретными исправлениями (12.0.x), только с незначительными обновлениями версии - так что 12.1 будет следующим. Это выглядит очень специфично для оборудования iPhone XS, и я бы посоветовал вам решить проблему с поддержкой Apple.
РЕДАКТИРОВАТЬ: Ну, я видел, что вы уже заполнили отчет об ошибке на openradar. Этот парень даже ссылался на статус сообщения об ошибке на openradar-mirror.
Ответ 2
Вы решили этот вопрос? У меня такой же вопрос на моем iphone XR, версия ОС 12.0
Ответ 3
Я не знаю много о CoreMotion, но сообщение об ошибке говорит вам, что вы пытаетесь вызвать действие пользовательского интерфейса в фоновом потоке. Попробуйте вставить свой код в:
DispatchQueue.main.async {
//your code here
}
Также кажется, что вы пытаетесь выполнить действия, связанные с пользовательским интерфейсом, в viewDidLoad()
. Технически это хорошо, но помните, что некоторые взгляды, вероятно, не изложены в тот момент.