2016-11-18 11 views
4

Я вход (запись в файл) backgroundTimeRemaining значения каждый раз, когда мое приложение будит из спящего режима, прямо перед тем, как начать фоновую задачу UIApplication с обработчиком истечения срока, как это (в моем методе, который делает запрос сети):Почему backgroundTimeRemaining дает DBL_MAX, даже если состояние приложения UIApplicationStateBackground?

if([[UIApplication sharedApplication] applicationState] == UIApplicationStateBackground){ 

     [Logger logIntoFileNamed:@"log" withContent:[NSString stringWithFormat:@" state %ld, background time remaining %.2f",(long)[[UIApplication sharedApplication] applicationState],[[UIApplication sharedApplication] backgroundTimeRemaining ]] andPrettyTime:true]; 

     UIApplication* app = [UIApplication sharedApplication]; 

     __block UIBackgroundTaskIdentifier task = [app beginBackgroundTaskWithExpirationHandler:^{ 

      [app endBackgroundTask:task]; 
      task = UIBackgroundTaskInvalid; 

      [Logger logIntoFileNamed:@"log" withContent:@" expiration handler executed " andPrettyTime:true]; 
     }]; 
    } 

Согласно документации, значение backgroundTimeRemaining может быть большим, если приложение находится на переднем плане:

в то время как приложение работает на переднем плане, значение этого свойства остается достаточно большим.

Но это не случай здесь. Мой метод выполняется, потому что состояние приложения равно UIApplicationStateBackground. Что мне здесь не хватает?

+0

Только что проверено ... Я действительно на 'Thread 1', когда это происходит. Какой должен быть основной поток (также когда я запускаю этот код из 'applicationDidEnterBackground:' он говорит 'Thread 5'). Дело в том, и я не тот, кто написал эту часть кода, и я подумал, что, поскольку я уверен в том, что приложение разбужено из приостановленного режима, я сейчас нахожусь в фоновом потоке, выполняющем все это. ..Иметь больше исследовать и изучать код, но если я нахожусь в основном потоке, то получаю нормальные результаты, не так ли? – Whirlwind

ответ

0

Да Согласно документации:

Значение backgroundTimeRemaining может быть большим, если приложение находится в переднем плане.

applicationDidEnterBackground потребуется некоторое время между состояниями перед предоставлением права backgroundTimeRemaining. Это должно начаться примерно до 180. Запустите его в асинхронном потоке с dispatch_async и отфильтруйте значения Foreground (> 180).

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    if([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)]) 
    { 
     NSLog(@"Multitasking Supported"); 

     __block UIBackgroundTaskIdentifier background_task; 
     background_task = [application beginBackgroundTaskWithExpirationHandler:^ { 

      //Clean up code. Tell the system that we are done. 
      [application endBackgroundTask: background_task]; 
      background_task = UIBackgroundTaskInvalid; 
     }]; 

     //To make the code block asynchronous 
     dispatch_async(dispatch_get_main_queue(), ^{ 

      //### background task starts 
      NSLog(@"Running in the background\n"); 
      while(TRUE) 
      { 
       //#### Filter Foreground Values 
       if ([[UIApplication sharedApplication] backgroundTimeRemaining] < 180) { 
        NSLog(@"Background time Remaining: %f",[[UIApplication sharedApplication] backgroundTimeRemaining]); 
        [NSThread sleepForTimeInterval:1]; //wait for 1 sec 
       } 

      } 

      //#### background task ends 
      //Clean up code. Tell the system that we are done. 
      [application endBackgroundTask: background_task]; 
      background_task = UIBackgroundTaskInvalid; 
     }); 
    } 
    else 
    { 
     NSLog(@"Multitasking Not Supported"); 
    } 

} 
+0

У вас есть ссылка, где это задокументировано (о задержке переключения состояния)? Также я использую dispatch_async при выполнении задачи, я просто оставил это, потому что он вызывается другим методом. В любом случае, я немного протестировал, и если я изолирую код и поставлю его в пустой проект внутри applicationDidEnterBackground: все работает так, как должно. Дело в том, что это отличается от моей текущей настройки. Я запускаю этот код после того, как приложение пробуждается из приостановленного режима. В этом случае я получаю значение DBL_MAX. В противном случае он дает значения <180. – Whirlwind

0

Это может быть связано с тем, как вы регистрируетесь backgroundTimeRemaining. Попробуйте встать после того, как вы получите фоновое задание:

UIApplication *app = [UIApplication sharedApplication]; 
long appState = (long)app.applicationState; 

if (appState == UIApplicationStateBackground) { 
    __block UIBackgroundTaskIdentifier task = [app beginBackgroundTaskWithExpirationHandler:^{ 

    [app endBackgroundTask:task]; 
    task = UIBackgroundTaskInvalid; 
    [Logger logIntoFileNamed:@"log" withContent:@" expiration handler executed " andPrettyTime:true]; 
    }]; 

    NSTimeInterval backgroundTimeRemaining = app.backgroundTimeRemaining; 
    [Logger logIntoFileNamed:@"log" withContent:[NSString stringWithFormat:@" state %ld, background time remaining %.2f", appState, backgroundTimeRemaining] andPrettyTime:true]; 
} 
+0

На самом деле пробовал это, iirc. Но попробуем еще раз. – Whirlwind