在iOS 11中,背景中的devicemotion停止工作



我的应用程序报告和记录位置,高度,旋转和加速度计数据(devicemotion)在后台。这在iOS 10.3.3上正常工作。在iOS 11上,设备锁定时我不再拥有访问运动数据。不过,高空数据和位置数据仍在传输到控制台。

在iOS 11中发生了一些变化,可以防止我访问运动数据,或者我正在尝试以苹果现在阻止诸如aperationqueue.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 }

我找不到有关运动背景模式的变化,但似乎一定有一种方法,否则跑步者,Strava将会破裂。有人可以在iOS1启动之前帮助我再次工作吗?

谢谢!

也遇到了这个问题。

我们的解决方案是确保我们启用了另一个背景模式并运行(在我们的情况位置更新 音频中)并在切换背景/前景时重新启动核心运动更新。

代码样本:

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)
        }
    }
}

官方11.1版本解决了问题,我从iPhone 8用户听到原始实现为他们工作。

11.2 beta尚未破坏任何东西。

最新更新