创建自定义iOS越狱键盘

时间:2014-02-10 17:22:12

标签: ios objective-c keyboard jailbreak theos

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

Cydia中有许多不同的键盘(主要来自中国开发者),如TouchPal和百度输入,它们在设置中显示为键盘,所以它绝对是可能的。

我试过调查以下选项(在IDA中只有4天,使用theos和控制台的Xcode):

  • 位于/ System / Library / TextInput中的文本输入包 - 似乎没有什么可以处理键盘本身?一些超类标题丢失了(即TIZephyr ...类)所以我无法弄明白。然而,原生集成将是非常棒的。
  • TextInput私有框架 - 似乎也只是用于字典等等
  • UIKit的UIKB ..和UIKeyboard ..类 - UIKeyboardImpl似乎与键盘功能相关,UIKeyboardLayout就是你构建的东西。

我尝试挂钩UIKeyboardDictationLayout只是在初始化时给出一个UIKeyboardLayout的简单实例 - 当我点击键盘上的麦克风按钮时,键盘变成了空白!这种实现方式也很不错(即使杀死听写功能是不受欢迎的)。但是,我找不到在哪里发送打字事件。

所以要点是:

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

我要求这样做,希望有开发人员必须做类似的事情,因为我找不到任何文章,也没有任何东西可以在头文件和包中给我提示。

提前致谢。

1 个答案:

答案 0 :(得分:1)

即使没有时间回应,我在今年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:中创建自定义视图。

要输入您,请使用[[UIKeyboardImpl activeInstance]insertText:@"\n"];

创建一个地球仪'你使用这个按钮:

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

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