vez pantalla over multiventana multitarea mini dividir como aplicaciones abrir ios camera multitasking avcapturesession ios9

ios - pantalla - split view ipad



¿Cómo usar AVCaptureSession con Slide Over y Split View en iOS 9? (1)

En caso de que aún no lo hayas descubierto Después de investigar un poco, ahora puedo responder su primera pregunta:

Si AVCaptureSession se pausa inmediatamente cuando se usan Slide Over y Split View, ¿es una buena idea monitorear AVCaptureSessionDidStopRunningNotification, y presentar un mensaje "Camera Paused" al usuario, para que sepa claramente que la aplicación no está realizando el escaneo?

La notificación que realmente desea observar es esta: AVCaptureSessionWasInterruptedNotification

Y desea verificar el recién introducido en el motivo 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) }

También puede saber cuándo finalizó la interrupción observando: AVCaptureSessionInterruptionEndedNotification

Respuesta basada en estos dos enlaces:

http://asciiwwdc.com/2015/sessions/211 https://developer.apple.com/library/ios/samplecode/AVCam/Introduction/Intro.html

Mi equipo está desarrollando un conjunto de SDK para el escaneo de códigos de barras , escaneo de ID y OCR . Usamos la cámara del dispositivo, específicamente, AVCaptureSession , para obtener marcos de video en los que realizamos nuestro procesamiento.

Estamos explorando las nuevas funciones multitarea de iOS 9 Slide Over y Split View.

Apple sugiere optar por estas funciones para aplicaciones centradas en la cámara, donde usar la pantalla completa para previsualizar y capturar un momento rápidamente es una característica principal ( referencia ). Este es el enfoque del uso en su aplicación de muestra AVCam .

Sin embargo, nuestros clientes pueden tener aplicaciones que no entran en esta categoría (por ejemplo, aplicaciones de banca móvil), por lo que no podemos obligarlos a optar por no participar, en su lugar, tenemos que manejar nuevas funciones en el SDK. Estamos explorando cuál sería el mejor enfoque para hacerlo, ya que los documentos en este momento no nos están diciendo realmente qué hacer.

Usamos nuestra aplicación de muestra Camera simple para analizar el caso de uso. La aplicación de muestra está disponible en Github y está desarrollada a partir de iOS 9 Beta 5.

Desde la aplicación de ejemplo, se puede ver claramente qué eventos del sistema ocurren cuando se usa Slide Over y cuando se usa Split View.

  • Cuando nuestra aplicación es primaria y se usa Slide Over, obtenemos UIApplicationWillResignActiveNotification y AVCaptureSessionDidStopRunningNotification
  • Cuando se usa Slide Over, y nuestra aplicación es secundaria, obtenemos UIApplicationWillEnterForegroundNotification y AVCaptureSessionDidStopRunningNotification inmediatamente después de eso.
  • Cuando se usa Vista dividida, en cada arrastre de divisor, nuestra aplicación obtiene UIApplicationWillResignActiveNotification .
  • Sin embargo, si la cámara se inicia cuando está en vista dividida, inmediatamente obtiene AVCaptureSessionDidStopRunningNotification

Entonces, empíricamente, parece que AVCaptureSession se detiene inmediatamente cuando se utilizan Slide Over o Split View.

Lo que es confuso es que UIImagePickerController , que nuestra aplicación de ejemplo también admite, exhibe un comportamiento completamente diferente.

UIImagePickerController no se detiene cuando la aplicación entra en Slide Over / Split View, en cambio, funciona de manera completamente normal. Uno normalmente puede tomar una foto en Split View. De hecho, dos aplicaciones, las cuales presentan UIImagePickerController , pueden funcionar una al lado de la otra, con UIImagePickerController activo de la aplicación activa. (Puede intentarlo ejecutando nuestra aplicación de muestra, y la aplicación Contactos -> Nuevo contacto -> Agregar foto)

Con todo esto en mente, nuestras preguntas son las siguientes:

  • Si AVCaptureSession se pausa inmediatamente cuando se usan Slide Over y Split View, ¿es una buena idea monitorear AVCaptureSessionDidStopRunningNotification , y presentar un mensaje "Camera Paused" al usuario, para que sepa claramente que la aplicación no está realizando el escaneo?

  • ¿Por qué el comportamiento de UIImagePickerController diferente de AVCaptureSession ?

  • ¿Podemos esperar de Apple que en futuras versiones beta el comportamiento de AVCaptureSession cambie para coincidir con UIImagePickerController ?