2015-08-10 3 views
25

Моя команда разрабатывает набор SDK для barcode scanning, ID scanning и OCR. Мы используем камеру устройства, в частности, AVCaptureSession, для получения видеокадров, на которых мы выполняем нашу обработку.Как использовать AVCaptureSession со слайдом и раздельным просмотром в iOS 9?

Мы изучаем новые функции многозадачности iOS 9. Слайд и разделение.


Apple, предлагает выбор в пользу из этих функций для камер-ориентированных приложений, где используя весь экран для предварительного просмотра и захват момента быстро является основной особенностью (reference). Это подход, используемый в их примере приложения AVCam.

Однако у наших клиентов могут быть приложения, которые не относятся к этой категории (например, приложения для мобильного банкинга), поэтому мы не можем заставить их отказаться, вместо этого нам нужно обрабатывать новые функции в SDK. Мы изучаем, как лучше всего это сделать, поскольку в настоящий момент документы не говорят нам, что делать.


Мы использовали наше приложение для простого примера камеры, чтобы проанализировать прецедент. Пример приложения можно найти на сайте Github, и он разработан на базе iOS 9 Beta 5.

Из примера приложения видно, какие системные события происходят при использовании режима «Слайд» и когда используется Split View.

  • Когда наше приложение является первичным, а скользят используется, мы получаем UIApplicationWillResignActiveNotification и AVCaptureSessionDidStopRunningNotification
  • Когда скользят используется, и наше приложение является вторичным, мы получаем UIApplicationWillEnterForegroundNotification и AVCaptureSessionDidStopRunningNotification сразу же после этого
  • Когда Используется Split View, при каждом перетаскивании разделителя наше приложение получает UIApplicationWillResignActiveNotification.
  • Однако, если камера запускается, когда в Split View, он сразу же получает AVCaptureSessionDidStopRunningNotification

Так, опытным путем, это выглядит как AVCaptureSession немедленно прекращается, когда скользят или Split View используются.

Что сбивает с толку то, что UIImagePickerController, которое также поддерживает наше примерное приложение, демонстрирует совершенно другое поведение.

UIImagePickerController не останавливается, когда приложение переходит в режим слайд-просмотра/разделения, вместо этого он функционирует нормально. Обычно можно сфотографировать в режиме Split View. Фактически, два приложения, оба из которых присутствуют UIImagePickerController, могут работать бок о бок, при активном активном приложении UIImagePickerController. (Вы можете попробовать это, запустив наш пример приложения, и приложение Контакты -> Новый контакт -> Добавить фото)


С учетом всего этого, наши вопросы являются следующие:

  • Если AVCaptureSession сразу же приостанавливается, когда используются функции «Слайд-режим» и «Сплит-просмотр», рекомендуется ли отслеживать AVCaptureSessionDidStopRunningNotification и представлять пользователю сообщение «Camera Paused», чтобы он ясно знал, что приложение не выполняет сканирование?

  • Почему поведение UIImagePickerController отличается от AVCaptureSession?

  • Можно ли ожидать от Apple, чем в будущих версиях бета-версии AVCaptureSession изменений, которые соответствуют UIImagePickerController?

+0

Я работаю над приложением, для которого я также необходимо использовать предварительный просмотр камеры, и это вовсе не приложение камеры центрической , Удалось ли вам заставить приложение работать в режиме SplitView? Или iOS просто не разрешает использовать AVCaptureSession в SplitView? – Joss

ответ

9

В случае, если вы еще не обнаружили. После еще некоторого исследования я теперь могу ответить на ваш первый вопрос:

Если AVCaptureSession сразу остановился, когда скользят и Split View используются, это хорошая идея, чтобы контролировать AVCaptureSessionDidStopRunningNotification и представить сообщение «Camera Paused "для пользователя, так что он ясно знает, что приложение не выполняет сканирование?

Уведомление вы на самом деле хотите, чтобы наблюдать это одна: 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