2015-08-10 29 views
25

La mia squadra sta sviluppando un set di SDK per , ID scanning e OCR. Utilizziamo la fotocamera del dispositivo, in particolare, AVCaptureSession, per ottenere fotogrammi video su cui eseguiamo la nostra elaborazione.Come utilizzare AVCaptureSession con Slide Over e Split View in iOS 9?

Stiamo esplorando le nuove funzionalità di multitasking di iOS 9 Slide Over e Split View.


di Apple suggerisce di opting out di queste caratteristiche per le applicazioni della fotocamera-centrica, in cui utilizzando l'intero schermo per l'anteprima e catturare un momento in fretta è una caratteristica primaria (reference). Questo è l'approccio utilizzato nella loro app di esempio AVCam.

Tuttavia, i nostri clienti potrebbero avere app che non rientrano in questa categoria (ad esempio app di mobile banking), quindi non possiamo costringerli a rinunciare, abbiamo invece bisogno di gestire nuove funzionalità nell'SDK. Stiamo esplorando quale sarebbe l'approccio migliore per farlo, dal momento che i doc attualmente non ci dicono veramente cosa fare.


Abbiamo utilizzato la nostra semplice app di esempio Camera per analizzare il caso d'uso. L'app di esempio è disponibile su iOS 9 Beta 5.

Dall'app di esempio, è possibile vedere chiaramente quali eventi di sistema si verificano quando si utilizza Slide Over e quando si utilizza Vista divisa.

  • Quando la nostra applicazione è primario, e scorrere sopra viene utilizzato, otteniamo UIApplicationWillResignActiveNotification e AVCaptureSessionDidStopRunningNotification
  • Quando scorrere sopra viene utilizzato, e la nostra applicazione è secondario, otteniamo UIApplicationWillEnterForegroundNotification e AVCaptureSessionDidStopRunningNotification subito dopo che
  • Quando La vista divisa viene utilizzata, su ogni resistenza del divisore, la nostra app ottiene UIApplicationWillResignActiveNotification.
  • Tuttavia, se la fotocamera viene lanciato quando a Spalato vista, diventa immediatamente AVCaptureSessionDidStopRunningNotification

Quindi, empiricamente, sembra che AVCaptureSession viene immediatamente interrotto quando vengono utilizzati scorrere sopra o Split View.

Ciò che confonde è che lo UIImagePickerController, supportato dalla nostra app di esempio, presenta un comportamento completamente diverso.

UIImagePickerController non viene interrotto quando l'app passa in Vista diapositiva su/divisa, invece, funziona completamente normalmente. Normalmente è possibile scattare una foto in Vista divisa. Infatti, due app, entrambe presenti nello UIImagePickerController, possono funzionare fianco a fianco, con UIImagePickerController dell'attivazione attiva dell'app. (Si può provare che eseguendo la nostra applicazione di esempio e applicazione Contatti -> Nuovo contatto -> Aggiungi foto)


Con tutto questo in mente, le nostre domande sono le seguenti:

  • Se AVCaptureSession viene messo in pausa quando si utilizzano la funzione Scorri e Dividi, è opportuno monitorare AVCaptureSessionDidStopRunningNotification e presentare un messaggio "Fotocamera in pausa" all'utente, in modo che sappia chiaramente che l'app non sta eseguendo la scansione?

  • Perché il comportamento di UIImagePickerController è diverso da AVCaptureSession?

  • Possiamo aspettarci da Apple che nel futuro versioni beta il comportamento delle modifiche AVCaptureSession corrisponda a UIImagePickerController?

+0

Sto lavorando su un app per il quale ho anche bisogno di utilizzare l'anteprima della fotocamera e non è affatto un'applicazione fotocamera centric . Sei riuscito a far funzionare la tua app in modalità SplitView? O semplicemente non è permesso da iOS di usare AVCaptureSession in SplitView? – Joss

risposta

9

Nel caso non l'avessi ancora scoperto. Dopo un po 'di più indagini ora posso rispondere alla tua prima domanda:

Se AVCaptureSession è immediatamente messo in pausa quando si utilizzano scorrere sopra e Spalato View, è una buona idea per monitorare AVCaptureSessionDidStopRunningNotification, e presentare un messaggio "Camera In pausa "per l'utente, in modo che egli sappia chiaramente che l'app non sta effettuando la scansione?

La notifica si vuole realmente osservare è questa: AVCaptureSessionWasInterruptedNotification

e si desidera verificare la recente introduzione in ragione 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) 
} 

You può anche sapere quando l'interruzione è stata interrotta osservando: AVCaptureSessionInterruptionEndedNotification

risposta sulla base di questi due link:

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