作者:杨静怡崇志 | 来源:互联网 | 2023-01-19 09:47
我的应用程序在后台报告并记录位置,高度,旋转和加速度计数据(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 }
我找不到关于运动背景模式改变的任何信息,但似乎必须有一种方法,否则RunKeeper,Strava将会破坏.在IOS11发布之前,有人可以帮助我重新开始工作吗?
谢谢!
1> mani..:
还遇到了这个问题.
我们的解决方案是确保我们启用并运行另一个后台模式(在我们的例子中是位置更新+音频)并在切换后台/前景时重新启动核心动作更新.
代码示例:
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)
}
}
}