2016-11-23 1 views
0

Как видно из названия, я пытаюсь добавить камеру внутри представления на клавиатуре, как камера внутри текущего приложения «Сообщения».Добавление вида камеры внутри пользовательской клавиатуры - Swift 3.0 и IOS 10

С моим текущим кодом клавиатура просто пропускается, когда я пытаюсь изменить ее, и она никогда не запрашивает разрешение на доступ к камере, даже если я установил правильный ключ внутри info.plist (я установил его в info.plist для клавиатуры и основного класса). Я не написал другого кода.

Это мой код внутри моего KeyboardViewController

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 && 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: []) 
} 

}

ответ

0

Вы не имеете доступа к камере из пользовательских расширений клавиатуры. Согласно рекомендациям Apple, некоторые API-интерфейсы недоступны для расширений iOS. Пожалуйста, проверьте Appple Extensions guideline в разделе «Некоторые API недоступны для расширений приложений».

доступ к камере или микрофон на устройстве IOS (Шеззаде приложение, в отличие от других расширений приложения, не имеет доступа к этим ресурсам, а пока он правильно настраивает NSCameraUsageDescription и ключи NSMicrophoneUsageDescription Info.plist)

Однако у приложения iMessage есть доступ.

Смежные вопросы