iOSのキーボードを作っています。しかしBluetoothキーボードの入力を取得出来ません。

目的としては、Keyboard Extentionにてキーボードを押下したことをシステムから横取り(例えば文字キーを押した時に画面に文字キーの入力が直接されずに,ソフト側で取得して,ソフトで生成した文字列を入力する)して取得することです。

下記コードを実行し、Bluetoothキーボードを接続すると、iOS画面のキーボードエリアが消え、func performCommandにBreakを張っていても、ここのコードが実行されません。

Keybord Extentionでなく、ViewControllerにて同様のコードを実行すると、”Q””W””E”の物理キーを押下すると、DebugAreaにそれぞれのキーが押されたことをPrintにて出力します。

下記のコードは最低限と思う部分を切り出しています。

また、テスト時にoverride var canBecomeFirstResponder: Bool { get { return true } }というコードが必要かと思い、追加しましたが、キーボードの入力が拾えません。

一応 https://developer.apple.com/reference/uikit/uiinputviewcontroller を参照しています。

※もしかすると,下記のサイトを解読すると,出来るのしょうか?(エラーになってしまうのですがNSEventとか・・・CocoaはmacOSのみだった)
https://developer.apple.com/reference/appkit/nsevent/1533943-keyevent

直すべきところや、改善するためのヒントとなるものなど、何でもいいので教えていただけないでしょうか。
よろしくお願いいたします。

import UIKit

class KeyboardViewController: UIInputViewController {

    @IBOutlet var nextKeyboardButton: UIButton!

    private enum InputKey: String {
        case Key_Q = "Q"
        case Key_W = "W"
        case KEY_E = "E"
    }

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

    override var keyCommands: [UIKeyCommand]? {
        return [
            UIKeyCommand(input: InputKey.Key_W.rawValue,
                     modifierFlags: .init(rawValue: 0),
                     action: #selector(self.performCommand(sender:))),

            UIKeyCommand(input: InputKey.Key_Q.rawValue,
                     modifierFlags: .init(rawValue: 0),
                     action: #selector(self.performCommand(sender:))),

            UIKeyCommand(input: InputKey.KEY_E.rawValue,
                     modifierFlags: .init(rawValue: 0),
                     action: #selector(self.performCommand(sender:)))
        ]
    }

    func performCommand(sender: UIKeyCommand) {
        guard let key = InputKey(rawValue: sender.input) else {
            return
        }
        switch key {
        case .Key_Q:
            print ("Q")
            return
        case .Key_W:
            print ("W")
            return
        case .KEY_E:
            print ("E")
            return
        }
    }
}