iOS:如何检测硬件蓝牙键盘上的转义/控制键?
Posted
技术标签:
【中文标题】iOS:如何检测硬件蓝牙键盘上的转义/控制键?【英文标题】:iOS: How to detect the escape/control keys on a hardware bluetooth keyboard? 【发布时间】:2013-02-09 20:10:22 【问题描述】:我试图弄清楚如何检测在连接到 ios 设备的蓝牙键盘上是否按下了 Escape(以及其他组合键,如 Ctrl 和 alt)。
一些答案似乎表明这是不可能的。但是,Appstore 中有一些应用程序可以执行此操作(例如 iSSH),因此我认为可以以某种方式使用公共 API。
我尝试过创建自己的 UITextInput,但是当按下 Escape 键时它什么也没有收到。我可以看到 iPad 可能响应的 API 的唯一部分是启用 VoiceOver 时(Escape 就像在 Safari 中一样工作),所以我想知道是否可以通过辅助功能 API 进入?
我还尝试查看是否可以从 NSNotificationCenter 观察到一些可能有帮助的信息,但还没有找到任何东西。
欢迎提出建议,我已经研究了一天,现在有点不知所措。
【问题讨论】:
我提交了一份关于文档不明确或缺少功能的雷达错误报告,它被标记为 7649186 的副本,被标记为已关闭。 【参考方案1】:您现在可以在 iOS 7 中执行此操作。例如,要实现转义键,请覆盖 UITextView 并将以下方法放入您的类中:
- (NSArray *) keyCommands
UIKeyCommand *esc = [UIKeyCommand keyCommandWithInput: UIKeyInputEscape modifierFlags: 0 action: @selector(esc:)];
return [[NSArray alloc] initWithObjects: esc, nil];
- (void) esc: (UIKeyCommand *) keyCommand
// Your custom code goes here.
您无需检查以确保您使用的是 iOS 7,因为早期版本的操作系统不会调用 keyCommands 方法。
【讨论】:
【参考方案2】:对于您打算完成的工作没有公共 API,因此这可能会导致拒绝。
如果你愿意冒险,可以试试this。 Wich 基本上通过在您的UIApplication
中覆盖sendEvent:
来拦截发送到您的应用程序的所有事件。
【讨论】:
所以是的,就我而言,它确实导致了拒绝。我仍然想知道 AppStore 中的应用程序是如何做到的。 有时候,你的 App 能否进入 AppStore 只取决于审阅者……也许那个 App 的开发者运气更好。 是的,不过我还是很好奇。他们实际上拒绝了它使用 _gsEvent 这让我认为它是基于某种静态分析。我觉得奇怪的是,IainSmith 在二进制文件中找不到对 _gsEvent 的引用。我已经重新提交了没有 _gsEvent 内容的应用程序,稍后会尝试重新访问。 查看我的上次更新,如果他们使用静态分析器并在二进制文件中搜索私有关键字,您可以伪装它在运行时创建关键字。试一试:-)【参考方案3】:AFAIK 使用公共 API 是不可能的。
我进行了一些搜索,但 esc 键无法识别。
我唯一没有做的就是尝试iSSH
(花费 9 欧元 :-),但是如果您阅读 AppStore 上的说明,很明显 ESC 键在硬件上(蓝牙)键盘不起作用:
详尽的密钥配置支持。有 箭头 键(通过弹出窗口或工具栏)。 ctrl、alt、esc、tab、shift、Fn 键 (1-10)、` 键、PgUp、PgDown 以及未列出的那些键提供多种添加方式。
蓝牙键盘支持 arrow 键、function 键以及通过 @ 中的选项键映射重新映射 ctrl 键987654323@ 服务器或终端。启用后,Option+key 按下映射到等效的 Ctrl+key 按下。
李>如您所见,在第二行中没有提到 ESC 键。 此外,我发现了这个(旧)post。
编辑:
作为您的最后一次更新,我找到了一种在二进制文件中“隐藏”_gsEvent
的方法。但是,我不知道 Apple 静态分析器是否可以找到它。
诀窍很简单...在运行时创建 _gsEvent
选择器(和其他私有选择器)!
-(void)sendEvent:(UIEvent *)event
SEL aSelector = NSSelectorFromString([self theSelector]);
if ([event respondsToSelector:aSelector])
NSLog(@"Event: %@", event.description);
[super sendEvent:event];
-(NSString *)theSelector
// compose the keyword as you prefer
NSString *sel = [NSString stringWithFormat:@"%@g%@%@ent", @"_", @"s", @"Ev"];
return sel;
我尝试在二进制文件中搜索,但没有找到 _gsEvent
关键字,显然是因为它仅在运行时创建。
希望这会有所帮助。
【讨论】:
我已经购买了该应用程序,并且蓝牙键盘上的 Escape 键确实有效。它也适用于提示。我已经看到了 google 组的帖子,但是如果您深入研究该组,您会看到对蓝牙键盘上的 Ctrl 和 Esc 键的引用。 从你的mac,找到iSSH的.app(它在你的iTunes文件夹中,如果不是从AppStore下载的话),右键单击,显示数据包内容,然后用十六进制编辑器打开可执行文件或简单的文本编辑。如果您找到“_gsevent”关键字,他们正在使用私有 api 可执行文件中没有“_gsevent”,但有“_gs”、“_XkbSendNewKeyboardNotify”、“_XkbProcessKeyboardEvent_ProcessKeyboardEvent”、“_ProcGetKeyboardControl”和“-[iX11ViewController setKeyboardTrigger:]”等内容没有太多经验可执行文件显示,但只是想提供帮助。 @IainSmith 谢谢,我相信他的 _XKb 等函数/方法是 X11 服务器支持的一部分。我猜 _gsEvent 可能被掩盖了,但对我来说仍然很奇怪。 看起来这在与“SHMY-OH-SHMESS SHEVEN”押韵的某个 NDA 限制版本中不再有效。以上是关于iOS:如何检测硬件蓝牙键盘上的转义/控制键?的主要内容,如果未能解决你的问题,请参考以下文章