2015-04-18 4 views
5

У меня есть AVCaptureDevice, чтобы отобразить предварительный просмотр в реальном времени на экране.Touch ID freezes AVCaptureDevice

При просмотре сенсорного ID на предварительном просмотре камеры (с использованием CAContextevaluatePolicy) предварительный просмотр камеры замерзает. Когда отклонение сенсорного идентификатора отменено, предварительный просмотр камеры мигает черным экраном перед повторным запуском.

Проблесковываются как замерзающая, так и черная вспышка. Как сохранить предварительный просмотр камеры в режиме просмотра с сенсорным ID?

+0

Я подозреваю, что Apple действительно захватывает приложение, когда отображается экран Touch ID. Я знаю, что у моего приложения нет методов ротации, и я также знаю, что при просмотре вашего приложения с помощью визуального инспектора, такого как Reveal.app, экран Touch ID не является даже частью иерархии представлений. Надеюсь, это поможет ... –

+1

Вау, я не понимал таких вещей, как Reveal App. Кажется полезным. – Randomblue

+0

Это замечательный продукт. Многое из того, что он делает, может быть сделано в Xcode сейчас, но не на устройстве, и если вы захватываете видео или используете Touch ID, вам нужно реальное устройство. –

ответ

4

Я не уверен, что это возможно. Приложение, похоже, теряет контроль, когда на экране появляется предупреждающее сообщение Touch ID. Я знаю, что наше приложение не получает события поворота, когда диалог завершен, и я знаю, когда просматриваю иерархию представлений с помощью Reveal.app. Я не вижу вид сенсорного ID в своей иерархии.

Можете ли вы запустить камеру в фоновом режиме? Это может сделать трюк, но я не думаю, что использование камеры разрешено в фоновом режиме.

+0

Что именно вы подразумеваете под «потерять контроль»?Поскольку приложение входит в состояние 'applicationWillResignActive' с Touch ID, и обычно в этом состоянии камера продолжает работать (например, если пользователь дважды нажимает кнопку« домой »). – Randomblue

+0

Хорошо, я попытался запустить камеру в фоновом режиме (оба с 'dispatch_async' и' addOperationWithBlock'). Все еще зависает. – Randomblue

+1

applicationDidResignActive - это то, что я имел в виду. Он туда попал? Похоже, что это так, и что камера работает в этом состоянии, если Touch ID не встал. Это воняет для вас. –

1

Я согласен с Полом Сезанном, я не думаю, что вы можете сделать захват, пока процесс TouchID активен. Хотя я не вижу никакой конкретной информации ни в документах, ни в файлах заголовков, через некоторое тестирование вы можете видеть, что происходит.

Во-первых, подсказка TouchID запускается за пределами вашего процесса.
1. Запустите приложение с поддержкой TouchID на устройстве в отладчике.
2. Получите приложение, чтобы отобразить подсказку TouchID.
3. В Xcode приостановите приложение.

Как правило, приложение будет заморожено на устройстве, но в этом случае вы можете использовать свой отпечаток пальца или кнопку отмены, чтобы закрыть диалоговое окно. Когда вы закроете подсказку TouchID, приложение будет приостановлено, как и следовало ожидать.

Задайте точку останова в обратном вызове метода оценкиPolicy. Примите TouchID с отпечатком пальца, и вы увидите, что этот блок вызывается из CoreAuthentication.daemon.

-[ViewController startTouchID:]_block_invoke at .../testTouchIDThreadding/testTouchIDThreadding/ViewController.m:60 
-[LAContext evaluatePolicy:options:reply:]_block_invoke() /*THIS IS MY BLOCK*/ 
... 
-[NSXPCConnection _sendInvocation:withProxy:remoteInterface:withErrorHandler:timeout:userInfo:]_block_invoke310() 
... 
Enqueued from com.apple.NSXPCConnection.m-user.com.apple.CoreAuthentication.daemon (Thread 3)Queue : com.apple.NSXPCConnection.m-user.com.apple.CoreAuthentication.daemon (serial) 
... 

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

Из вашего опыта и тестового приложения я просто бросил вместе, это кажется правдой. Я открыл камеру с помощью UIImagePickerController, и, хотя я открыт, я назвал laContext evaluationPolicy: ... и он приостановил захват камеры.

Таким образом, в итоге, когда вы используете проверку TouchID:
- Ваш процесс по-прежнему является активным приложением, но вы назвали из вашего процесса
- Apple ограничивает доступ к аппаратному устройству для продолжительности

Смежные вопросы