IOS: idleTimerDisabled = YES работает только до тех пор, пока не будет использован ImagePicker

У меня есть инструмент поиска iPad в качестве внутреннего корпоративного приложения. Я запрещаю блокировку экрана с установкой [[UIApplication sharedApplication] setIdleTimerDisabled: YES]; в didFinishLaunchingWithOptions делегата приложения.

Это работает нормально, пока я не использую imagePicker для получения изображения. После этого снова активируется idleTimer. Я попытался отключить его после того, как изображение было снято, но это не работает.

Здесь я нашел подсказку о том, что установка необходимых возможностей устройства в info.plist может помочь. Но пока это не так. Я только что добавил все флаги для конкретной камеры.

Любые идеи?

Большое спасибо!

Марк

Ответ 1

Я смог reset UIpplication idleTimerDisabled следующим образом:

- (void)resetIdleTimerDisabled
{
    [[UIApplication sharedApplication] setIdleTimerDisabled:YES];
}

#pragma mark - UIImagePickerControllerDelegate

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    [self dismissViewControllerAnimated:YES completion:^{
        [self performSelector:@selector(resetIdleTimerDisabled) withObject:nil afterDelay:1.0];
    }];
}

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
    [self dismissViewControllerAnimated:YES completion:^{
        [self performSelector:@selector(resetIdleTimerDisabled) withObject:nil afterDelay:1.0];
    }];
}

То, что я подозреваю, заключается в том, что внутри UIImagePickerController устанавливает UIApplication.idleTimerDisabled в YES, чтобы камера не спала. Когда закончите (после вызова методов делегата и, по-видимому, даже после выполнения блока завершения анимации), UIImagePickerController устанавливает UIApplication.idleTimerDisabled обратно на NO. Вместо этого он должен делать это только в том случае, если ранее было значение NO.

Я подал отчет об ошибке с Apple. См. образец проекта UIImageViewControllerBug.

Ответ 2

Решение Jamie выглядит хорошо! Я просто не большой поклонник методов afterDelay::)

Проблема заключается в структуре PhotoLibrary: она отключает idleTimer перед началом потока предварительного просмотра с камеры и снова включает ее при разрыве, независимо от предыдущего значения.

Если вы чувствуете больше приключений и хотите решения, которые работают во всем приложении, вот один из них включает swizzling: https://gist.github.com/zats/1a4aece697075478b44a

Протестировано для обоих случаев, когда idleTimer отключен или включен до отображения выбора изображения. Мое решение не замечает idleTimerDisabled, когда представлен выборщик изображений.

P.S. такая же проблема возникает при использовании функции диктовки (ошибка в UIDictationController) (@jamie-mcdaniel, если вы так любезны, чтобы обновить отчет об ошибке)