Just to add another note...the system doesn't appear to enumerating through the responder chain in the proper order when validating undo/redo commands. For example if a UITextField has focus/firstResponder status -canPerformAction:withSender: is hitting my responder implementing this workaround first and you could accidentally swallow the UITextField's undo/redos with this workaround if you're not careful...
So you also have to check that a text field is first responder/has focus and if it does call through to super so you don't swallow the text field's undo/redo. Not sure why the system doesn't start validating undo/redo starting from the first responder, then enumerate responders backward until undo/redo validates. The system seems to be starting from the UIWindow and digging through the responder chain in the wrong order.
Note that calling through to super from -canPerformAction:withSender: when the text field has focus will leave you with an Undo/Redo menu item that doesn't have a proper action name (it should say "Undo Typing"). This can be fixed, if you are determined enough to write even more workaround code to get the proper behavior.
This is kind of a nightmare. I'm spending so much time implementing workarounds like this. Not sure if skipping AppKit with this UIKit shortcut is actually saving me anytime at all, but I'm in too deep now though.