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, если вы так любезны, чтобы обновить отчет об ошибке)