gpt4 book ai didi

ios - 创建自定义 iOS 越狱键盘

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:36:40 26 4
gpt4 key购买 nike

我已经开发了一个自定义输入法,现在想开发一个调整,将其注册为 iOS 中的键盘。

Cydia 中有很多不同的键盘(主要来自中国开发者),例如触宝和百度输入法都作为键盘出现在设置中,所以这是肯定可以的。

我已经尝试研究以下选项(在 IDA、带有 theos 和控制台的 Xcode 中仅用了 4 天):

  • 位于/System/Library/TextInput 中的文本输入包 — 似乎与键盘本身没有任何关系?缺少一些父类(super class) header (即 TIZephyr... 类),所以我不太明白。然而,原生集成会很棒。
  • TextInput 私有(private)框架——似乎也只是用于字典等
  • UIKit 的 UIKB.. 和 UIKeyboard.. 类 — UIKeyboardImpl 似乎与键盘功能相关,而 UIKeyboardLayout 是您构建的对象。

我尝试 Hook UIKeyboardDictationLayout 以在初始化时提供一个 UIKeyboardLayout 的普通实例——当我点击键盘上的麦克风按钮时,键盘变为空白!这种实现也很好(即使不希望取消听写功能)。但是,我也找不到将输入事件发送到哪里。

所以要点是:

  • 负责将类注册为输入法的是什么?
  • 负责接收打字事件的是什么?

我问这个是希望已经有开发人员不得不做类似的事情,因为我找不到任何文章,也找不到任何可以在头文件和包中给我提示的东西。

提前致谢。

最佳答案

虽然我没有时间回复,但我在今年 2 月做对了,而且现在 iOS 8 已经到来,这也不是很有必要。尽管如此,这仍然是您加载自己的键盘的方式:

%hook UIKeyboardInputMode

+ (id)keyboardInputModeWithIdentifier:(id)arg1 {
id o = %orig;
return o;
}
- (id)primaryLanguage {
if([TegakiLayout isTegaki:[self identifier]]) return @"Tegaki";
return %orig;
}
%end

%hook UIKeyboardImpl
/* This is where the magic is! */
+ (Class)layoutClassForInputMode:(NSString*)arg1 keyboardType:(int)arg2 {
Class sass = %orig;
if ([TegakiLayout isTegaki: arg1]) {
return [TegakiLayout class];
}
return sass;
}
%end



extern "C" NSArray*UIKeyboardGetSupportedInputModes();
extern "C" NSArray*UIKeyboardGetActiveInputModes();
static NSArray* (*orig_modes)();
NSArray* rep_modes() {
NSArray* res = [orig_modes() arrayByAddingObjectsFromArray:@[@"TEGAKI", @"TEGAKI_Graffiti"]];
return res;
}

static NSArray* (*orig_active_modes)();
NSArray* rep_active_modes() {
NSArray* res = orig_active_modes();
return res;
}



%ctor {
%init;
MSHookFunction(UIKeyboardGetSupportedInputModes, rep_modes, &orig_modes);
MSHookFunction(UIKeyboardGetActiveInputModes, rep_active_modes, &orig_active_modes);
}

其中 TegakiLayout 是 UIKeyboardLayout 的子类。

然后您实现 - (BOOL)isAlphabeticPlane 以返回它是否是传统键盘,并在 showKeyboardWithInputTraits:screenTraits:splitTraits: 中创建自定义 View 。

要输入您的内容,然后使用 [[UIKeyboardImpl activeInstance]insertText:@"\n"];

要创建一个“地球”按钮,您可以使用:

Class sw = NSClassFromString(@"UIInputSwitcherView");
[[sw sharedInstance]selectNextInputMode];

不要忘记同时实现 -keyboardName-keyplaneName!我可能有一天会发布整个项目,但现在它太大了,无法在这里描述。不过,这应该足以让您启动并运行。

关于ios - 创建自定义 iOS 越狱键盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21683820/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com