2010-12-12 3 views
0

In meiner App möchte ich die Beschleunigungsmesserdaten aufzeichnen, wenn die App in den Hintergrund tritt (die vom System gewährte Ablaufzeit reicht aus). Ich habe dies wie folgt codiert:Beschleunigung wird nicht aufgerufen, wenn der Beschleunigungssensor in beginBackgroundTaskWithExpirationHandler initialisiert wird?

- (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; 
      }   
     }); 

In den Delegierten ich wie erwähnt:

- (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]; 

Allerdings ist didAccelerate nicht ausgelöst werden, wenn die App Hintergrund tritt, sondern es nach applicationWillEnterForeground aufgerufen wird. Nachdem die App neu gestartet wurde (vom Hintergrund), scheint didAccelerate mehrmals ausgelöst zu werden (möglicherweise die Anzahl, wie oft sich der Beschleunigungsmesser im Hintergrund geändert hat). Die Anfrage scheint angehäuft zu werden und ausgeführt zu werden, wenn die App in den Vordergrund tritt.

Gibt es eine Möglichkeit, den Beschleunigungs-Wert aufzeichnen kann, wenn die App im Hintergrund Zustand ( innen beginBackgroundTaskWithExpirationHandler) ist

Bitte helfen.

+0

Eine Korrektur: Ich habe gerade die Beschleunigungsmesserdaten verifiziert, es scheint nur die Werte nach applicationDidEnterForeground zu erfassen. – CyberKnight

Antwort

1

Ihr Code wird unverändert ausgeführt und dann wird der Anwendungsexit normal fortgesetzt. Mit anderen Worten, Ihr Accelerometer-Code ist nicht synchron und wird daher den Exit-Prozess nicht blockieren.

wieder den Kommentar lesen:

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

Ihre Aufgabe ist es nicht eine „lang andauernde“ ein, leider.

+0

Gibt es eine Möglichkeit, Beschleunigungsmesserdaten synchron zu erfassen? – CyberKnight

Verwandte Themen