Previous to iOS 9, the most reliable method of determining whether an external keyboard is connected was to listen for UIKeyboardWillShowNotification
and make a text field the first responder, as discussed in this question. The notification would fire when using the virtual keyboard, but would not fire when using an external keyboard.
However this behavior has now changed with iOS 9. UIKeyboardWillShowNotification
also fires when an external keyboard is connected, since the new keyboard toolbar is now shown.
It is still possible to detect the keyboard height and make a judgement whether it is the smaller toolbar or the larger virtual keyboard that is being shown. However this method is not reliable since the keyboard height has changed between the various beta and can't be counted on to stay the same over time.
Is there a more reliable method that can be used with iOS 9?
Private API solution: (have to grab the private header file - use RuntimeViewer).
Works nicely for enterprise apps, where you don't have AppStore restrictions.
You can subscribe notification when the external device is connected:
Or just retrieve the list of attached devices:
I am using a variation on Sarah Elan's answer. I was having issues with her approach in certain views. I never quite got to the bottom of what caused the problem. But here is another way to determine if it is an ios9 external keyboard 'undo' bar that you have, rather than the full sized keyboard.
It is probably not very forward compatible since if they change the size of the undo bar, this brakes. But, it got the job done. I welcome criticism as there must be a better way...
You could try checking for peripherals that are advertising services using Core Bluetooth
And you should implement the delegate:
This code supports iOS 8 and iOS 9, inputAccessoryView, has double-protected constant to be ready for new changes in future versions of iOS and to support new devices:
Note, a hardware keyboard may present but not used.
After going back to the original question, I've found a solution that works.
It seems that when the regular virtual keyboard is displayed the keyboard frame is within the dimensions of the screen. However when a physical keyboard is connected and the keyboard toolbar is displayed, the keyboard frame is located offscreen. We can check if the keyboard frame is offscreen to determine if the keyboard toolbar is showing.