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 键在硬件上(蓝牙)键盘不起作用:

详尽的密钥配置支持。有 箭头 键(通过弹出窗口或工具栏)。 ctrlaltesctabshiftFn 键 (1-10)、` 键、PgUpPgDown 以及未列出的那些键提供多种添加方式。

蓝牙键盘支持 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:如何检测硬件蓝牙键盘上的转义/控制键?的主要内容,如果未能解决你的问题,请参考以下文章

Javascript - 带蓝牙键盘的 iPad Tab 键检测

如何在控制中心检测蓝牙真正关闭(或蓝牙开关按钮关闭)

如何检测单个控制键盘事件而不是键组合?

如何在Mac上使用鼠标键来控制指针?技巧来啦

VBA如何使用上下左右键控制焦点

iOS蓝牙(BLE4.0低功耗)详细渗透讲解