我必须AVCaptureDevice
在屏幕上显示实时相机预览。
当 Touch ID 视图覆盖在相机预览上时(使用CAContext
's evaluatePolicy
),相机预览会冻结。当 Touch ID 视图关闭时,相机预览会在重新启动前闪烁黑屏。
冻结和黑屏闪烁都是有问题的。如何在覆盖 Touch ID 视图的情况下保持相机预览活跃?
我必须AVCaptureDevice
在屏幕上显示实时相机预览。
当 Touch ID 视图覆盖在相机预览上时(使用CAContext
's evaluatePolicy
),相机预览会冻结。当 Touch ID 视图关闭时,相机预览会在重新启动前闪烁黑屏。
冻结和黑屏闪烁都是有问题的。如何在覆盖 Touch ID 视图的情况下保持相机预览活跃?
我不确定这是可能的。当 Touch ID 警报出现在屏幕上时,该应用程序似乎失去了控制。我知道当对话框启动时我们的应用程序不会获得旋转事件,并且我知道当我使用 Reveal.app 检查视图层次结构时,我在我的层次结构中看不到 Touch ID 视图。
您可以在后台模式下运行相机吗?这可能会奏效,但我认为不允许在后台使用相机。
我同意 Paul Cezanne 的观点,我认为您不能在 TouchID 进程处于活动状态时进行捕获。虽然我在文档或头文件中都没有看到任何具体信息,但通过一些测试你可以看到发生了什么。
首先,TouchID 提示在您的进程之外运行。
1. 在调试器中的设备上运行启用了 TouchID 的应用程序。
2.让app显示TouchID提示。
3. 在 Xcode 中,暂停应用程序。
通常,应用程序会在设备上冻结,但在这种情况下,您仍然可以使用指纹或取消按钮关闭对话框。关闭 TouchID 提示后,应用程序将按预期暂停。
在 evaluatePolicy 回调中设置断点。用你的指纹接受 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 evaluatePolicy:... 并暂停了相机捕捉。
因此,总而言之,当您使用 TouchID 验证时:
-您的进程仍然是活动应用程序,但您已退出进程
-Apple 在此期间限制对设备硬件的访问