我开发了一种自定义输入法,现在想开发一种在iOS中将其注册为键盘的调整。
Cydia中有许多不同的键盘(主要来自中国开发者),如TouchPal和百度输入,它们在设置中显示为键盘,所以它绝对是可能的。
我试过调查以下选项(在IDA中只有4天,使用theos和控制台的Xcode):
我尝试挂钩UIKeyboardDictationLayout只是在初始化时给出一个UIKeyboardLayout的简单实例 - 当我点击键盘上的麦克风按钮时,键盘变成了空白!这种实现方式也很不错(即使杀死听写功能是不受欢迎的)。但是,我找不到在哪里发送打字事件。
所以要点是:
我要求这样做,希望有开发人员必须做类似的事情,因为我找不到任何文章,也没有任何东西可以在头文件和包中给我提示。
提前致谢。
答案 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
!
我可能有一天会发布整个项目,但是现在它太大了,无法在这里描述。不过,这应该足以让你启动并运行。