2017-09-11 1 views
6

내 앱이 배경에서 위치, 고도, 회전 및 가속도계 데이터 (DeviceMotion)를보고하고 기록합니다. 이것은 iOS 10.3.3에서 정상적으로 작동합니다. IOS 11에서는 장치가 잠겨있는 동안 모션 데이터에 더 이상 액세스하지 않습니다. 그러나 고도 데이터와 위치 데이터는 여전히 콘솔로 스트리밍됩니다.IOS 11에서 백그라운드에서 DeviceMotion이 작동을 멈췄습니다.

은 모션 데이터에 액세스하거나 내가 모션 업데이트를 시작 해요 방법 OperationQueue.main

다음

같은 애플 이제 블록이하는 방식으로 액세스를 시도하고있는 중이 야에서 저를 방지 IOS (11)에 변경 뭔가를 가지고 있습니다. 휴대 전화가 잠금 해제되어 있으면 모두 정상적으로 작동합니다. 내가 전화를 잠금 경우, 더 이상 업데이트는 무엇 변경 모션 배경 모드에 대해 아무것도 찾을 수 없습니다

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 출시 전에이 기능을 다시 사용할 수있게 도와 줄 수 있습니까?

감사합니다.

+0

비슷한 문제가 발생했습니다. 모션 업데이트를 위해 앱을 계속 활성화하려면 CoreLocation 백그라운드 모드를 사용하고 있습니까? – doovers

+0

@doovers 수정하십시오. CoreLocation은 사용 중이며 이전에는 동작에 필요한 백그라운드 모드를 지원했습니다. 실망스러운 점은 WatchKit에는 백그라운드에서 모션에 대한 액세스를 허용하는 운동 모드가 있다는 점입니다. –

+0

우리가 혼자가 아니라고 생각합니다 ...이 [thread] (https://forums.developer.apple.com/thread/86034)를 확인하십시오. 어떤 기기에서 문제가 발생합니까? 나는 6 & 7을 시도했고 단지 7 개가 작동하지 않습니다. – doovers

답변

5

이 문제가 발생했습니다.

우리의 솔루션은 background/foreground를 전환 할 때 다른 배경 모드가 활성화되어 실행되고 있는지 확인하고 (코어 위치 업데이트 + 오디오에서) 코어 모션 업데이트를 다시 시작하는 것입니다.

코드 샘플 :

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

마니 감사합니다. 나는 여행을하다가 이것을 시도 할 기회가 없었습니다. 애플은 어제 11.1 베타 2를 발표했고 초기 결과가 좋았습니다. 더 많은 테스트를 해보고 싶었지만 –

0

공식 11.1 릴리스는 문제를 해결하고 난 원래 구현이 그들을 위해 일하고 8 사용자 것을 아이폰에서 들었습니다.

11.2 베타 버전은 아무 것도 고장 나지 않았습니다.

+1

11.1 버전에서 아직 ** 작동하지 않는 보고서가 여러 개 있습니다 .xMagneticNorthZVertical 설정이 있습니다. Apple에 버그 보고서를 다시 열어달라고 요청했습니다. – fishinear

관련 문제