2017-09-11 2 views
6

Mon application enregistre et enregistre les données de localisation, d'altitude, de rotation et d'accéléromètre (DeviceMotion) en arrière-plan. Cela fonctionne très bien sur ios 10.3.3. Sur IOS 11, je n'ai plus accès aux données de mouvement lorsque l'appareil est verrouillé. Cependant, les données d'altitude et les données de localisation sont toujours diffusées sur la console.Dans IOS 11, DeviceMotion en arrière-plan a cessé de fonctionner

a quelque chose changé dans l'IOS 11 qui me empêche d'accéder aux données de mouvement ou que je fais en essayant d'y accéder d'une manière qu'Apple bloque maintenant comme OperationQueue.main

Voici comment je commence les mises à jour de mouvement. Si le téléphone est déverrouillé, tout fonctionne correctement. Si je le verrouillage du téléphone, pas d'autres mises à jour .:

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 } 

Je ne peux pas trouver quoi que ce soit sur les modes de mouvement de fond changeant, mais il semble qu'il doit y avoir un moyen autrement RunKeeper, Strava cassera. Quelqu'un peut-il m'aider à faire fonctionner ce travail avant le lancement d'IOS11?

Merci!

+0

J'ai moi-même un problème similaire. Utilisez-vous le mode d'arrière-plan CoreLocation pour que l'application reste active pour les mises à jour de mouvement? – doovers

+0

@doovers Correct. CoreLocation est en cours d'utilisation et a déjà pris en charge les modes d'arrière-plan nécessaires pour le mouvement. Ce qui est frustrant, c'est que WatchKit a un mode d'entraînement pour permettre l'accès au mouvement en arrière-plan. –

+0

On dirait que nous ne sommes pas seuls sur ce ... Cochez cette [thread] (https://forums.developer.apple.com/thread/86034). Sur quels appareils voyez-vous le problème? J'ai essayé 6 et 7 et seulement 7 ne fonctionne pas. – doovers

Répondre

5

Également rencontré ce problème. Notre solution consistait à s'assurer qu'un autre mode d'arrière-plan était activé et en cours d'exécution (dans notre cas, les mises à jour de localisation + audio) et redémarrer les mises à jour de base lors du changement d'arrière-plan/avant-plan.

Exemple de code:

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

Merci Mani Je n'ai pas eu l'occasion d'essayer ça depuis que je suis en voyage Apple a sorti 11.1 Beta 2 hier et les premiers résultats sont bons. –

0

La version 11.1 officielle résolu le problème et je l'ai entendu de l'iPhone 8 utilisateurs que la mise en œuvre d'origine travaille pour eux.

La bêta 11.2 n'a rien brisé.

+1

J'ai plusieurs rapports maintenant qu'il ne fonctionne toujours pas pour la version 11.1, mais c'est avec un paramètre .xMagneticNorthZVertical J'ai demandé à Apple de rouvrir le rapport de bogue. – fishinear