работает на выпуск 11.1. Но это с настройкой .xMagneticNorthZVertical. Я попросил Apple заново открыть отчет об ошибке.

риложение сообщает и записывает данные о местоположении, высоте, вращении и акселерометре (DeviceMotion) в фоновом режиме. Это прекрасно работает на IOS 10.3.3. На IOS 11 у меня больше нет доступа к данным движения, пока устройство заблокировано. Данные о высоте и местоположении все еще передаются на консоль.

Что-то изменилось в IOS 11, что мешает мне получить доступ к данным движения, или я пытаюсь получить к нему доступ таким образом, который Apple теперь блокирует, как OperationQueue.main

Вот как я начинаю обновления движений. Если телефон разблокирован, все работает нормально. Если я блокирую телефон, больше никаких обновлений.

let motionManager = self.motionManager

    if motionManager.isDeviceMotionAvailable {
        motionUpdateInterval = 0.15
        motionManager.deviceMotionUpdateInterval = motionUpdateInterval

        motionManager.startDeviceMotionUpdates(using: .xArbitraryZVertical, to: OperationQueue.main) {deviceMotion, error in
            guard let deviceMotion = deviceMotion else { return }

Я не могу найти ничего об изменении режимов фона Motion, но, похоже, должен быть способ, иначе RunKeeper, Strava сломается. Может кто-нибудь помочь мне заставить это работать снова перед запуском IOS11?

Спасибо!

 Nicholas K22 сент. 2017 г., 22:03
Я смотрю эту тему в течение нескольких дней. У меня открыт запрос на поддержку Apple, который был открыт с воскресенья. Я отправлю обратно, если что-то случится. Пожалуйста, сделайте то же самое.
 Nicholas K22 сент. 2017 г., 18:43
@doovers Правильно. CoreLocation используется и ранее поддерживал фоновые режимы, необходимые для движения. Что расстраивает, так это то, что WatchKit имеет режим тренировки, позволяющий получить доступ к движению в фоновом режиме.
 doovers22 сент. 2017 г., 18:50
Кажется, мы не одиноки в этом ... Проверьте этонить, На каких устройствах вы видите проблему? Я пробовал 6 и 7, и только 7 не работает.
 Nicholas K11 окт. 2017 г., 15:54
Всем привет. Вчера я получил электронное письмо от Apple, в котором говорилось, что проблема может быть исправлена в 11.1 Beta 2. Установлена вчера вечером, и в приложении все выглядит хорошо. У меня другая проблема компиляции с бета-версией Xcode, и я пока не смог проверить что-то в консоли, но ознакомился с 11.1 Beta 2.
 doovers21 сент. 2017 г., 15:20
У меня похожая проблема. Используете ли вы фоновый режим CoreLocation, чтобы приложение оставалось активным для обновлений движения?

Ответы на вопрос(2)

и я слышал от пользователей iPhone 8, что оригинальная реализация работает для них.

Бета 11.2 ничего не сломала.

 fishinear12 нояб. 2017 г., 15:13
У меня есть несколько отчетов сейчас, когда это все ещене работает на выпуск 11.1. Но это с настройкой .xMagneticNorthZVertical. Я попросил Apple заново открыть отчет об ошибке.

Нашим решением было обеспечить включение и запуск другого фонового режима (в нашем случае обновления местоположения + аудио) и перезапустить обновления основного движения при переключении фона / переднего плана.

Пример кода:

import UIKit
import CoreMotion

final class MotionDetector {
    private let motionManager = CMMotionManager()
    private let opQueue: OperationQueue = {
        let o = OperationQueue()
        o.name = "core-motion-updates"
        return o
    }()

    private var shouldRestartMotionUpdates = false

    init() {
        NotificationCenter.default.addObserver(self,
                                               selector: #selector(appDidEnterBackground),
                                               name: .UIApplicationDidEnterBackground,
                                               object: nil)
        NotificationCenter.default.addObserver(self,
                                               selector: #selector(appDidBecomeActive),
                                               name: .UIApplicationDidBecomeActive,
                                               object: nil)
    }

    deinit {
        NotificationCenter.default.removeObserver(self,
                                                  name: .UIApplicationDidEnterBackground,
                                                  object: nil)
        NotificationCenter.default.removeObserver(self,
                                                  name: .UIApplicationDidBecomeActive,
                                                  object: nil)
    }

    func start() {
        self.shouldRestartMotionUpdates = true
        self.restartMotionUpdates()
    }

    func stop() {
        self.shouldRestartMotionUpdates = false
        self.motionManager.stopDeviceMotionUpdates()
    }

    @objc private func appDidEnterBackground() {
        self.restartMotionUpdates()
    }

    @objc private func appDidBecomeActive() {
        self.restartMotionUpdates()
    }

    private func restartMotionUpdates() {
        guard self.shouldRestartMotionUpdates else { return }

        self.motionManager.stopDeviceMotionUpdates()
        self.motionManager.startDeviceMotionUpdates(using: .xArbitraryZVertical, to: self.opQueue) { deviceMotion, error in
            guard let deviceMotion = deviceMotion else { return }
            print(deviceMotion)
        }
    }
}
 inigo33320 мар. 2018 г., 12:16
Кажется, это работает, хотя я считаю, что не нужно активировать режим фонового звука.
 mani28 дек. 2018 г., 16:44
эй @MottiShneor - в настоящее время мы используем версию этого в нашем производственном приложении. Обработчики уведомленийнаходятся реализованы.shouldRestartMotionUpdates используется для определения необходимости перезапуска обработчиков (скрывая сложность), так как вызывающему классу нужно только вызватьstart или жеstop, Чтобы сэкономить батареюstart/stop актуально.
 Praveen Kondapalli03 сент. 2018 г., 15:00
Я использую iOS 11.4.1, и основные обновления Motion прекращаются, когда приложение переходит в фоновый режим. Я также включил базовый режим Core Locaton, но безуспешно
 Nicholas K11 окт. 2017 г., 15:55
Спасибо, Мани. У меня не было возможности попробовать это, так как я путешествовал. Вчера Apple выпустила 11.1 Beta 2, и первые результаты хорошие. Мне нужно больше тестировать, но я хочу поблагодарить вас за то, что поделились.
 Motti Shneor27 дек. 2018 г., 15:47
Благодарю. Сначала - спасибо. Я борюсь с этой проблемой уже несколько дней. Тем не менее - Этот ответ по-прежнему жизнеспособен на последних iPhone (X, Xs, 8 и т. Д.) И последней версии ОС (iOS 12.1.2? А также - Вы пропустили реализацию обработчиков уведомлений. Что они делают? Назовите "restartMotionUpdates ( )? установите "shouldRestartMotionUpdates" в значение true? Кто в любом случае устанавливает значение false (если оно нам не нужно).

Ваш ответ на вопрос