iOS:如何检测硬件蓝牙键盘上的逃生/控制键?

问题描述:

我想弄清楚如何检测Escape(以及其他组合键,如Ctrl和Alt)在连接到iOS设备的蓝牙键盘上被按下。iOS:如何检测硬件蓝牙键盘上的逃生/控制键?

有些答案似乎表明这是不可能的。然而,Appstore中有一些应用程序可以执行此操作(例如iSSH),所以我认为可以以某种方式使用公共API。

我已经尝试过创建自己的UITextInput,但是当按下Esc键时,它没有收到任何东西。 API的唯一部分我可以看到iPad可能响应的地方是启用了VoiceOver(Escape在Safari中的作用),所以我想知道是否有通过无障碍API访问的方法?

我也试着看看是否有什么我可以从NSNotificationCenter观察,可能会有帮助,但还没有找到任何东西。

建议表示欢迎,我一直在黑客入侵这一天,我现在有点亏损。

+0

我提交了一份有关不清楚的文档或缺失的功能的雷达错误报告,它被标记为7649186的副本,标记为关闭。 – new299 2013-02-25 19:00:58

对于您打算完成的任务,没有公共的API,因此这可能会导致拒绝。

如果您愿意承担风险,您可以尝试this。 Wich基本上通过在UIApplication中覆盖sendEvent:来拦截发送到您的应用的所有事件。

+1

所以是的,在我的情况下,它确实导致了拒绝。我仍然想知道AppStore中存在的应用程序是如何做到的。 – new299 2013-04-27 00:08:26

+1

有时,如果您的应用程序进入AppStore,它只取决于评论者......也许该应用程序的开发人员有更多的运气。 – Daniel 2013-04-27 13:09:06

+0

是的,我仍然很好奇。他们实际上拒绝使用_gsEvent,这让我认为它是基于某种静态分析。我发现IainSmith在二进制文件中找不到对_gsEvent的引用是很奇怪的。我已经重新提交没有_gsEvent的应用程序,稍后会尝试重新访问。 – new299 2013-04-28 13:27:35

AFAIK这是不可能使用公共API。 我已经做了一些搜索,并且esc密钥不被识别。 我没有做的唯一的事情就是尝试iSSH(它花费9欧元:-),但如果你阅读AppStore上的描述,看起来很清楚,硬件(蓝牙)键盘上的ESC键没有工作:

  • 详尽的关键配置支持。有箭头键(通过弹出或通过工具栏)。 CTRLALTESC标签FN键(1-10),`键,PgUp键PgDown键并为那些键未列出提供了多种手段来添加它们。

  • 蓝牙键盘支持箭头键,功能键和通过选项键映射在任一X11/VNC服务器或终端的CTRL密钥的重新映射。启用时,选项 + 将地图按至等效键Ctrl + 按。

正如你可以看到,在第二行的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关键字,显然是因为它只是在运行时创建。
希望这会有所帮助。

+0

我已经购买了该应用程序,并且蓝牙键盘上的退出键可以正常工作。它也适用于提示。我已经看到谷歌群组发布,但如果你深入了解群组,你会看到对蓝牙键盘上的Ctrl和Esc键的引用。 – new299 2013-02-18 17:04:11

+1

从你的Mac上,找到iSSH的.app(它在你的iTunes文件夹中,如果不是从AppStore下载的话),右键单击,显示数据包内容,然后用十六进制编辑器打开可执行文件,或者简单地使用textedit。如果您发现“_gsevent”关键字,他们使用私有API – LombaX 2013-02-18 21:33:59

+1

在可执行文件中没有“_gsevent”,但有像“_gs”,“_XkbSendNewKeyboardNotify”,“_XkbProcessKeyboardEvent_ProcessKeyboardEvent”,“_ProcGetKeyboardControl”和“ - [iX11ViewController setKeyboardTrigger:] “对可执行文件显示的内容没有多少经验,只是试图提供帮助。 – 2013-02-24 20:22:29

您可以在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,因为早期版本的OS不会调用keyCommands方法。