2015-08-10 28 views
25

Nhóm của tôi đang phát triển một bộ SDK cho barcode scanning, ID scanningOCR. Chúng tôi sử dụng máy ảnh của thiết bị, cụ thể là AVCaptureSession để có được các khung hình video mà chúng tôi thực hiện quá trình xử lý của mình.Làm thế nào để sử dụng AVCaptureSession với Slide Over và Split View trong iOS 9?

Chúng tôi đang khám phá các tính năng đa nhiệm mới của iOS 9 Trượt qua và Chế độ xem phân tách.


của Apple đề nghị chọn ra các tính năng này cho các ứng dụng máy ảnh trung tâm, nơi sử dụng toàn bộ màn hình để xem trước và chụp một khoảnh khắc một cách nhanh chóng là một tính năng chính (reference). Đây là cách tiếp cận sử dụng trong ứng dụng mẫu của chúng AVCam. Tuy nhiên, khách hàng của chúng tôi có thể có ứng dụng không thuộc danh mục này (ví dụ: ứng dụng ngân hàng di động), vì vậy chúng tôi không thể buộc họ chọn không tham gia, thay vào đó, chúng tôi cần xử lý các tính năng mới trong SDK. Chúng tôi đang khám phá những gì sẽ là cách tiếp cận tốt nhất để làm điều đó, vì các tài liệu tại thời điểm này không thực sự cho chúng tôi biết phải làm gì.


Chúng tôi đã sử dụng ứng dụng mẫu Máy ảnh đơn giản của chúng tôi để phân tích trường hợp sử dụng. Ứng dụng mẫu có sẵn trên Github và được phát triển dưới dạng iOS 9 Beta 5.

Từ ứng dụng mẫu, có thể thấy rõ sự kiện hệ thống nào xảy ra khi sử dụng Slide Over và khi Chế độ xem tách được sử dụng.

  • Khi ứng dụng của chúng tôi là chính, và trượt qua được sử dụng, chúng tôi nhận UIApplicationWillResignActiveNotificationAVCaptureSessionDidStopRunningNotification
  • Khi slide Over được sử dụng, và ứng dụng của chúng tôi chỉ là thứ yếu, chúng tôi nhận UIApplicationWillEnterForegroundNotificationAVCaptureSessionDidStopRunningNotification ngay sau đó
  • Khi Chế độ xem phân tách được sử dụng, trên mỗi lần chia ngăn, ứng dụng của chúng tôi nhận được UIApplicationWillResignActiveNotification.
  • Tuy nhiên, nếu máy ảnh được đưa ra khi tại Split View, nó ngay lập tức được AVCaptureSessionDidStopRunningNotification

Vì vậy, theo kinh nghiệm, có vẻ như AVCaptureSession được ngay lập tức dừng lại khi trượt qua hoặc Split View được sử dụng.

Điều khó hiểu là UIImagePickerController, ứng dụng mẫu của chúng tôi cũng hỗ trợ, thể hiện hành vi hoàn toàn khác.

UIImagePickerController không bị dừng khi ứng dụng chuyển sang chế độ xem trên/phân tách, thay vào đó, nó hoạt động hoàn toàn bình thường. Người ta thường có thể chụp ảnh trong Chế độ xem tách. Trong thực tế, hai ứng dụng, cả hai ứng dụng hiện có UIImagePickerController, có thể hoạt động song song, với UIImagePickerController của ứng dụng đang hoạt động đang hoạt động. (Bạn có thể thử mà bằng cách chạy ứng dụng mẫu của chúng tôi, và Danh bạ ứng dụng -> New Liên hệ -> Thêm ảnh)


Với tất cả điều này trong tâm trí, những câu hỏi của chúng tôi như sau:

  • Nếu AVCaptureSession bị tạm dừng ngay lập tức khi sử dụng Chế độ xem lật và Chế độ xem phân tách, bạn có nên theo dõi AVCaptureSessionDidStopRunningNotification và hiển thị thông báo "Máy ảnh bị tạm dừng" cho người dùng để biết rõ ứng dụng không thực hiện quét không?

  • Tại sao hành vi của UIImagePickerController khác với AVCaptureSession?

  • Chúng ta có thể mong đợi từ Apple so với hành vi phiên bản beta trong tương lai của AVCaptureSession thay đổi cho phù hợp với UIImagePickerController không?

+0

Tôi đang làm việc trên một ứng dụng mà tôi cũng cần phải sử dụng một bản xem trước camera và nó không phải ở tất cả các ứng dụng máy ảnh trung tâm . Bạn có quản lý để làm cho ứng dụng của bạn hoạt động ở chế độ SplitView không? Hay đơn giản là không được iOS cho phép sử dụng AVCaptureSession trong SplitView? – Joss

Trả lời

9

Trong trường hợp bạn chưa phát hiện ra. Sau một cuộc điều tra hơn bây giờ tôi có thể trả lời câu hỏi đầu tiên của bạn:

Nếu AVCaptureSession được ngay lập tức dừng lại khi trượt qua và Split Xem được sử dụng, nó là một ý tưởng tốt để theo dõi AVCaptureSessionDidStopRunningNotification, và trình bày một thông điệp "Camera Tạm dừng "với người dùng, để anh ấy biết rõ ràng rằng ứng dụng không thực hiện quét?

Thông báo bạn thực sự muốn quan sát là một trong những điều này: AVCaptureSessionWasInterruptedNotification

Và bạn muốn kiểm tra sự vừa được giới thiệu trong iOS9 lý do: 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) 
} 

Bạn cũng có thể biết khi nào gián đoạn kết thúc bằng cách quan sát: AVCaptureSessionInterruptionEndedNotification

trả lời dựa trên hai liên kết sau đây:

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

Các vấn đề liên quan