2016-07-17 32 views
0

Ich versuche, Gerätbewegungsaktualisierungen auf einem iPhone oder iPad im Hintergrund zu erhalten, CMMotionManager verwendend. Ich habe alle früheren Beiträge zu diesem Thema gelesen und dachte, dass ich Code hätte, der funktionieren würde. Meine App verwendet auch Hintergrund-Audio, und das funktioniert einwandfrei im Vordergrund und Hintergrund. In Info.plist habe ich Hintergrund-Audio-und Hintergrund-Standortaktualisierungen aktiviert.Gerätebewegungsaktualisierungen im Hintergrund

Zu Testzwecken habe ich "var motionManager = CMMotionManager()" in AppDelegate erklärt, und enthalten Sie den folgenden Code in didFinishLaunchingWithOptions:

motionManager.deviceMotionUpdateInterval = 0.10 
    let queue = NSOperationQueue() 
    motionManager.startDeviceMotionUpdatesToQueue(queue, withHandler: { 
     data, error in 

     let accelerationVector = sqrt(pow(data!.userAcceleration.x, 2) + pow(data!.userAcceleration.y, 2) + pow(data!.userAcceleration.z, 2)) 
     print("\(accelerationVector)") 
    }) 

Als ich die App auf meinem Gerät ausgeführt werden, da der Code ausführt, im Vordergrund erwartet, aber wenn Ich drücke den Home-Knopf, ich bekomme ungefähr 10 weitere Lesungen, bevor es aufhört. Wenn ich auf das App-Symbol tippe, beginnen die Messungen erneut. Ich habe auch Breakpoints auf den Code im Handler gelegt und ähnliche Ergebnisse erhalten.

Was fehlt mir?

Antwort

0

Nachdem ich weitere Nachforschungen angestellt hatte, fand ich das Problem heraus. Ich habe verwendet, um Hintergrund-Audio zu spielen. Dadurch wird das Audio im Hintergrund abgespielt, aber dadurch wird meine App nicht im Hintergrund ausgeführt. Wenn ich zum Abspielen von Audio auf umschaltete, wird die App im Hintergrund ausgeführt, einschließlich der Gerätebewegungsaktualisierungen.

0

ich den Motion Manager in ViewDidlLoad erklärt habe

CMMotionManager    *motionManager; 
/*--Initialising Motion Manager--*/ 
motionManager = [[CMMotionManager alloc] init]; 
motionManager.deviceMotionUpdateInterval = 1.0; 

Wie immer dann, wenn die App im Hintergrund geht der Motionmanager in diesem Fall der Bereitstellung Rückrufe stoppen, benötigen Sie den Motionmanager neu zu starten, wenn die App im Hintergrund geht oder im Vordergrund .Um Dazu müssen wir den Prozess unten folgen:

1) we first need to Register for the app transition notification : 

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appDidEnterBackground) name:UIApplicationDidEnterBackgroundNotification object:nil]; 

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appDidBecomeActive) name:UIApplicationDidBecomeActiveNotification object:nil]; 


2)Notification callback functions, in which you will restart the motion manager 

- (void) {appDidEnterBackground

[self restartMotionUpdates]; 
} 

-(void)appDidBecomeActive{ 
    [self restartMotionUpdates]; 
} 


3)This function which will restart the motion manager 

-(void)restartMotionUpdates{ 
[motionManager stopDeviceMotionUpdates]; 
[motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMDeviceMotion *motion, NSError *error) { 
    NSLog(@"x=%f y=%f z=%f",fabs(motion.userAcceleration.x),fabs(motion.userAcceleration.y),fabs(motion.userAcceleration.z)); 
    }]; 
}