2016-11-23 13 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拡張機能では利用できません。 「一部のAPIはアプリ拡張機能で利用できません」のAppple Extensions guidelineを確認してください。

のアクセスは、iOSデバイス上のカメラやマイク(IMessageがアプリ、他のアプリの拡張子とは異なり は、それが正しくNSCameraUsageDescriptionと NSMicrophoneUsageDescriptionのInfo.plistキーを設定する限り として、これらのリソースへのアクセスを持っています)

ただし、iMessageアプリにはアクセス権があります。

関連する問題