title: Adding Camera View Inside Custom Keyboard - Swift 3.0 and IOS 10
body: <p>As the title suggests, I am trying to add a camera inside of a view in my keyboard much like the camera inside of the current Messages app. </p>
  
  <p>With my current code, the keyboard just simply gets skipped over when I try to change to it and it never asks for permission to access the camera even though I set the proper key inside of info.plist (I set it in the info.plist for both the Keyboard and the main class). I have written no other code. </p>
  
  <p>This is my code inside of my KeyboardViewController </p>
  
  <pre><code>import UIKit
  import AVFoundation
  
  class KeyboardViewController: UIInputViewController {
  
  @IBOutlet weak var cameraView: UIView!
  @IBOutlet var nextKeyboardButton: UIButton!
  
  var session : AVCaptureSession?
  var stillImageOutput : AVCaptureStillImageOutput?
  var videoPreviewLayer : AVCaptureVideoPreviewLayer?
  
  var captureDevice : AVCaptureDevice?
  
  override func updateViewConstraints() {
      super.updateViewConstraints()
  
      // Add custom view sizing constraints here
  }
  
  override func viewDidLoad() {
      super.viewDidLoad()
  
      // Perform custom UI setup here
      self.nextKeyboardButton = UIButton(type: .system)
  
      self.nextKeyboardButton.setTitle(NSLocalizedString("Next Keyboard", comment: "Title for 'Next Keyboard' button"), for: [])
      self.nextKeyboardButton.sizeToFit()
      self.nextKeyboardButton.translatesAutoresizingMaskIntoConstraints = false
  
      self.nextKeyboardButton.addTarget(self, action: #selector(handleInputModeList(from:with:)), for: .allTouchEvents)
  
      self.view.addSubview(self.nextKeyboardButton)
  
      self.nextKeyboardButton.leftAnchor.constraint(equalTo: self.view.leftAnchor).isActive = true
      self.nextKeyboardButton.bottomAnchor.constraint(equalTo: self.view.bottomAnchor).isActive = true
  }
  
  override func viewWillAppear(_ animated: Bool) {
  
      session = AVCaptureSession()
      session!.sessionPreset = AVCaptureSessionPresetPhoto
  
      let videoDevices = AVCaptureDevice.devices(withMediaType: AVMediaTypeVideo)
  
      for device in videoDevices! {
  
          let device = device as! AVCaptureDevice
          if device.position == AVCaptureDevicePosition.front {
  
              captureDevice = device
  
          }
  
      }
  
      //We will make a new AVCaptureDeviceInput and attempt to associate it with our backCamera input device.
      //There is a chance that the input device might not be available, so we will set up a try catch to handle any potential errors we might encounter.
      var error : NSError?
      var input : AVCaptureDeviceInput!
      do {
  
          input = try AVCaptureDeviceInput(device: captureDevice)
  
      } catch let error1 as NSError {
  
          error = error1
          input = nil
          print(error!.localizedDescription)
  
      }
  
      if error == nil &amp;&amp; session!.canAddInput(input) {
  
          session!.addInput(input)
  
          // The remainder of the session setup will go here...
  
          stillImageOutput = AVCaptureStillImageOutput()
          stillImageOutput?.outputSettings = [AVVideoCodecKey : AVVideoCodecJPEG]
  
          if session!.canAddOutput(stillImageOutput) {
  
              session!.addOutput(stillImageOutput)
  
              //configure live preview here
  
              videoPreviewLayer = AVCaptureVideoPreviewLayer(session: session)
              videoPreviewLayer!.videoGravity = AVLayerVideoGravityResizeAspect
              videoPreviewLayer!.connection?.videoOrientation = AVCaptureVideoOrientation.portrait
  
              cameraView.layer.addSublayer(videoPreviewLayer!)
  
              session!.startRunning()
  
          }
  
      }
  
  }
  
  override func viewDidAppear(_ animated: Bool) {
      videoPreviewLayer!.frame = cameraView.bounds
  }
  
  override func didReceiveMemoryWarning() {
      super.didReceiveMemoryWarning()
      // Dispose of any resources that can be recreated
  }
  
  override func textWillChange(_ textInput: UITextInput?) {
      // The app is about to change the document's contents. Perform any preparation here.
  }
  
  override func textDidChange(_ textInput: UITextInput?) {
      // The app has just changed the document's contents, the document context has been updated.
  
      var textColor: UIColor
      let proxy = self.textDocumentProxy
      if proxy.keyboardAppearance == UIKeyboardAppearance.dark {
          textColor = UIColor.white
      } else {
          textColor = UIColor.black
      }
      self.nextKeyboardButton.setTitleColor(textColor, for: [])
  }
  </code></pre>
  
  <p>}</p>