2010-12-12 85 views
0

Dans mon application, je veux enregistrer les données de l'accéléromètre lorsque l'application entre en arrière-plan (le temps d'expiration accordé par le système sera suffisant). J'ai codé cela comme suit:Accélérer ne pas être appelé lorsque l'accéléromètre est initialisé dans beginBackgroundTaskWithExpirationHandler?

- (void)applicationDidEnterBackground:(UIApplication *)application { 
    UIDevice* device = [UIDevice currentDevice]; 
    BOOL backgroundSupported = NO; 

    if ([device respondsToSelector:@selector(isMultitaskingSupported)]) 
     backgroundSupported = device.multitaskingSupported; 


    if (backgroundSupported) { 
     UIApplication* app = [UIApplication sharedApplication]; 

     bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ 
      [app endBackgroundTask:bgTask]; 
      bgTask = UIBackgroundTaskInvalid; 
     }]; 

     // Start the long-running task and return immediately. 
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), 
      ^{ 
      // Do the work associated with the task. 
      if ([application backgroundTimeRemaining] > 1.0) { 
       UIAccelerometer *accel = [UIAccelerometer sharedAccelerometer]; 
       accel.delegate = self; 
       accel.updateInterval = kUpdateInterval; 
      }   
     }); 

Dans le délégué comme je l'ai mentionné:

- (void) accelerometer:(UIAccelerometer *)accelerometer 
    didAccelerate:(UIAcceleration *)acceleration { 

    if (acceleration.x > kAccelerationThreshold || 
     acceleration.y > kAccelerationThreshold || 
     acceleration.z > kAccelerationThreshold) { 

     NSLog(@"Sensed acceleration"); 
     UILocalNotification *localNotif = [[UILocalNotification alloc] init]; 

Cependant, didAccelerate ne se déclenche pas lorsque l'application entre fond, plutôt est appelée après applicationWillEnterForeground. Après que l'application soit relancée (de fond), didAccelerate semble être tiré plusieurs fois (probablement, le nombre de fois que la valeur de l'accéléromètre a changé en arrière-plan). La requête semble s'empiler et s'exécuter lorsque l'application arrive au premier plan.

Est-il possible que je peux enregistrer la valeur de l'accéléromètre lorsque l'application est dans l'état d'arrière-plan ( intérieur beginBackgroundTaskWithExpirationHandler)

S'il vous plaît aider.

+0

Une correction: Je viens de vérifier les données de l'accéléromètre, il semble capturer seulement les valeurs après applicationDidEnterForeground. – CyberKnight

Répondre

1

Votre code s'exécute comme et la sortie de l'application continue normalement. En d'autres termes, votre code associé à l'accéléromètre n'est pas synchrone et donc ne bloquera pas le processus de sortie.

Relisez le commentaire:

// Start the long-running task and return immediately. 

Votre tâche n'est pas une « longue durée » un, malheureusement.

+0

Est-il possible de capturer les données de l'accéléromètre de manière synchrone? – CyberKnight