Вместо того, чтобы полагаться на значение applicationState, как насчет размещения пользовательских уведомлений в конце фоновой задачи?
Настройка в качестве наблюдателя для настраиваемого уведомления:
- (void)viewDidLoad
{
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(backgroundTaskDidFinish:) name:@"BackgroundTaskDidFinish" object:<either nil or the object that will post the notification>];
}
сообщение пользовательское уведомление, когда фоновая задача завершает
if ([[UIDevice currentDevice] isMultitaskingSupported]) {
[[UIApplication sharedApplication] endBackgroundTask:backgroundTaskID];
backgroundTaskID = UIBackgroundTaskInvalid;
[[NSNotificationCenter defaultCenter] postNotificationName:@"BackgroundTaskDidFinish" object:self]
}
Ответить на уведомление, что ваше приложение должно получить, когда он на самом деле возвращается в активное состояние
- (void)backgroundTaskDidFinish:(NSNotification *)notification
{
//OpenGL operations
}
В качестве альтернативы вы можете найти одно из других уведомлений, которое указывает, что ваше приложение действительно находится в активном состоянии.
Например, добавьте свой объект в качестве наблюдателя для UIApplicationWillEnterForeground. Установите значение BOOL, когда вы получите это уведомление. Затем найдите это значение BOOL вместе со значением UIApplicationState.
Конечно, в какой-то момент вам придется очистить BOOL - скажем, когда вы начинаете эту фоновое задание, поэтому это будет НЕТ, если приложение действительно не активировалось.
Нет, это не работает, у меня уже есть это. Проблема в том, что applicationWillResignActive: не вызывается перед завершением фоновой задачи. –
Чтобы лучше проиллюстрировать проблему, мне нужно проверить, действительно ли приложение находится в состоянии UIApplicationStateActive и делать некоторые средства рендеринга OpenGLES. Проблема в том, что статус приложения остается UIApplicationStateActive, даже когда приложение выполняется в фоновом режиме, если я использую startBackgroundTaskWithApplicationHandler:^{} даже после выполнения endBackgroundTask. Вы можете увидеть фрагмент кода в сообщении. –