2014-02-10 8 views
2

Я разработал собственный метод ввода и теперь хотел бы разработать настройку, которая зарегистрировала бы ее как клавиатуру в iOS.Создание пользовательской клавиатуры Jailbreak для iOS

В Cydia (в основном, китайские разработчики) есть много различных клавиатур, таких как TouchPal и Baidu Input, которые отображаются в настройках в виде клавиатуры, поэтому это определенно возможно.

Я попытался, глядя на следующие варианты (едва 4 дня в IDA, Xcode с Теос и консоли):

  • ввода текста пучков, расположенных в/System/Library/TextInput - кажется, нет ничего для решения проблемы с самими клавиатурами? Некоторые заголовки суперкласса отсутствуют (т. Е. Классы TIZephyr ...), поэтому я не мог понять это. Однако родная интеграция была бы удивительной.
  • TextInput частная структура - также, кажется, только для словаря и так далее
  • UIKB UIKit в .. и UIKeyboard .. классы - UIKeyboardImpl, кажется, что-то связанное с работой клавиатуры и UIKeyboardLayout является то, что вам опереться.

Я попытался закреплять UIKeyboardDictationLayout просто дать простой экземпляр UIKeyboardLayout при инициализации - и когда я нажал на кнопку микрофона на клавиатуре, клавиатура потемнела! Подобная реализация тоже была бы хороша (даже если функция диктовки убийства нежелательна). Однако я не могу найти, куда я могу отправить события ввода.

Так пункты:

  • Что отвечает за регистрацию класса в качестве метода ввода?
  • Что несет ответственность за получение событий ввода?

Я прошу об этом в надежде, что есть разработчики, которым уже приходилось делать что-то подобное, потому что я не мог найти ни статей, ни чего-нибудь, что дало бы мне подсказку в заголовочных файлах и пакетах.

Заранее спасибо.

+0

Я нашел интересное репо здесь: http://networkpx.googlecode.com/svn/trunk/hk.kennytm.iKeyEx3/src/ - будет держать вас в курсе прогресса –

ответ

1

Я правильно понял этот февраль, хотя у меня не было времени ответить, и теперь не обязательно, что 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, как хорошо! Возможно, я опубликую весь проект в один прекрасный день, но пока это слишком велико, чтобы описать здесь. Однако этого должно быть достаточно, чтобы вы могли работать.

Смежные вопросы