2014-02-10 88 views
2

我開發了一個自定義輸入法,現在想開發一個可以在iOS中將其註冊爲鍵盤的調整。創建一個自定義iOS越獄鍵盤

Cydia中有很多不同的鍵盤(主要來自中國的開發者),比如TouchPal和百度輸入,它們都以鍵盤的形式出現在設置中,所以絕對有可能。

我試圖尋找到以下選項(僅4天IDA時,Xcode與THEOS和控制檯):

  • 位於/ System文本輸入包/圖書館/的TextInput - 似乎沒有什麼應對用鍵盤本身?有些超類標題丟失(即TIZephyr ...類),所以我無法弄清楚。然而,本地整合將非常棒。
  • 的TextInput私人框架 - 似乎也只是字典等
  • UIKit中的UIKB ..和UIKeyboard ..類 - UIKeyboardImpl似乎有什麼東西與鍵盤功能有關,UIKeyboardLayout是你在建立的東西。

我試圖掛鉤UIKeyboardDictationLayout初始化時只給一個UIKeyboardLayout的普通實例 - 當我敲擊鍵盤上的麥克風按鈕,鍵盤裏一片空白!這種實現方式也不錯(即使殺死聽寫功能也是不希望的)。但是,我無法找到我在哪裏發送打字事件。

所以要點是:

  • 什麼是負責註冊一個類,輸入法?
  • 什麼是負責接收打字事件?

我在問這個問題,希望有開發人員不得不做相似的事情,因爲我找不到任何文章或任何會在頭文件和包中提示的提示。

在此先感謝。

+0

我在這裏發現了一個有趣的回購:http://networkpx.googlecode.com/svn/trunk/hk.kennytm.iKeyEx3/src/ - 會讓你更新進度 –

回答

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以及! 我可能會在一天後發佈整個項目,但現在這裏描述的太大了。雖然這應該足以讓你啓動並運行。