我的团队正在为barcode scanning,ID scanning和OCR开发一套SDK。我们使用设备的相机,特别是AVCaptureSession
来获取我们执行处理的视频帧。
我们正在探索新的iOS 9多任务功能幻灯片和拆分视图。
Apple建议选择退出以相机为中心的应用程序,这些应用程序使用整个屏幕进行预览并快速捕捉片刻是主要功能(reference)。这是他们的示例应用AVCam中使用的方法。但是,我们的客户可能拥有不属于此类别的应用程序(例如移动银行应用程序),因此我们无法强制他们退出,而是需要处理SDK中的新功能。我们正在探索最好的方法,因为目前的文档并没有真正告诉我们该做什么。
我们使用简单的Camera示例应用程序来分析用例。示例应用程序在Github上可用,它是从iOS 9 Beta 5开发的。
从示例应用程序中,可以清楚地看到使用“幻灯片放映”时以及使用“拆分视图”时发生的系统事件。
UIApplicationWillResignActiveNotification
和AVCaptureSessionDidStopRunningNotification
UIApplicationWillEnterForegroundNotification
和AVCaptureSessionDidStopRunningNotification
UIApplicationWillResignActiveNotification
。AVCaptureSessionDidStopRunningNotification
因此,根据经验,当使用“幻灯片放映”或“拆分视图”时,看起来AVCaptureSession
会立即停止。
令人困惑的是,我们的示例应用程序也支持的UIImagePickerController
表现出完全不同的行为。
UIImagePickerController
不会停止,而是完全正常运行。通常可以在Split View中拍照。实际上,两个应用程序(均为UIImagePickerController
)可以并行工作,活动应用程序的UIImagePickerController
处于活动状态。 (您可以通过运行我们的示例应用和联系人应用 - >新联系人 - >添加照片来尝试
考虑到所有这些,我们的问题如下:
如果在使用“幻灯片放映”和“拆分视图”时立即暂停AVCaptureSession
,最好监控AVCaptureSessionDidStopRunningNotification
,并向用户显示“已暂停摄像头”消息,他清楚地知道应用程序没有执行扫描?
为什么UIImagePickerController
的行为与AVCaptureSession
不同?
我们可以期待Apple比将来的AVCaptureSession
更改行为更符合UIImagePickerController
吗?
答案 0 :(得分:12)
如果你还没有发现。经过一些调查,我现在可以回答你的第一个问题:
如果在滑动和拆分时立即暂停AVCaptureSession 使用视图,监控是个好主意 AVCaptureSessionDidStopRunningNotification,并显示一条消息 “相机暂停”给用户,让他清楚地知道应用程序 没有进行扫描?
您实际想要观察的通知是: AVCaptureSessionWasInterruptedNotification
并且您想要检查iOS9中新引入的原因: AVCaptureSessionInterruptionReason.VideoDeviceNotAvailableWithMultipleForegroundApps
override func viewWillAppear(animated: Bool)
{
super.viewWillAppear(animated)
self.addObserverForAVCaptureSessionWasInterrupted()
}
func addObserverForAVCaptureSessionWasInterrupted()
{
let mainQueue = NSOperationQueue.mainQueue()
NSNotificationCenter.defaultCenter().addObserverForName(AVCaptureSessionWasInterruptedNotification, object: nil, queue: mainQueue)
{ (notification: NSNotification) -> Void in
guard let userInfo = notification.userInfo else
{
return
}
// Check if the current system is iOS9+ because AVCaptureSessionInterruptionReasonKey is iOS9+ (relates to Split View / Slide Over)
if #available(iOS 9.0, *)
{
if let interruptionReason = userInfo[AVCaptureSessionInterruptionReasonKey] where Int(interruptionReason as! NSNumber) == AVCaptureSessionInterruptionReason.VideoDeviceNotAvailableWithMultipleForegroundApps.rawValue
{
// Warn the user they need to get back to Full Screen Mode
}
}
else
{
// Fallback on earlier versions. From iOS8 and below Split View and Slide Over don't exist, no need to handle anything then.
}
}
}
override func viewWillDisappear(animated: Bool)
{
super.viewWillDisappear(true)
NSNotificationCenter.defaultCenter().removeObserver(self)
}
您还可以通过观察来了解中断何时结束: 的 AVCaptureSessionInterruptionEndedNotification 强>
基于这两个链接的答案:
http://asciiwwdc.com/2015/sessions/211 https://developer.apple.com/library/ios/samplecode/AVCam/Introduction/Intro.html