変態辞書アプリ「辞書絶一門」の仕組み妄想
@TeamMOSA2 さんがリリースした「辞書絶一門」というアプリが、iOS 5内蔵の辞書からデータを抜き出してたり、さらに加工して単語にリンク貼ってたり、コピーしたテキストの意味をバックグラウンドで通知してくれたりと色々変態すごいので、仕組みを妄想してみました。
どうやって辞書データを抜き出しているか妄想
- iOS 5で辞書を表示するには UIReferenceLibraryViewController を使う
- リファレンス見てもわかるように中身はまったくのブラックボックス
- でもどうせ UIWebView で loadHTMLString:baseURL: か loadRequest: してるに決まってる
- じゃあそれをフックしたら辞書データのHTML抜けるんじゃね?
実験
こんな感じで UIWebView の loadHTMLString:baseURL: をmethod swizzlingしてみたら、string に単語の意味がHTMLで格納されてました\(^o^)/
@interface UIWebView (reference) - (void)loadReferenceHTMLString:(NSString *)string baseURL:(NSURL *)baseURL; @end @implementation UIWebView (reference) - (void)loadReferenceHTMLString:(NSString *)string baseURL:(NSURL *)baseURL { NSLog(@"loadReferenceHTMLString:%@ baseURL:%@", string, baseURL); [self loadReferenceHTMLString:string baseURL:baseURL]; } @end ... Class class = [UIWebView class]; Method originalMethod = class_getInstanceMethod(class, @selector(loadHTMLString:baseURL:)); Method newMethod = class_getInstanceMethod(class, @selector(loadReferenceHTMLString:baseURL:)); method_exchangeImplementations(originalMethod, newMethod);
サンプルプロジェクト
入力された文字列を逐一辞書検索して、取得したHTMLデータを UIWebView に表示するサンプルを作ってみました。検索ボタンを押さなくても意味がインクリメンタルサーチみたいに表示されるので結構便利!
プロジェクト一式はgithubにアップしてあります。自由に改変して使って下さい。
まとめ
この方法で申請が通るかわかりませんが、非公開な情報を使わないとなるとこんな方法しか思いつきませんでした。実際のところどうやってるのでしょう。
「辞書」や「辞書絶一門」をきっかけにいろんな工夫を凝らした辞書アプリが開発され、そのうちちゃんとしたAPIで辞書データを使えるようになる日がくるといいですね!
追記
なんと作者である @TeamMOSA2 さんから、直々にコメントを頂きました!
@ooba ゆとりプログラミング推進派の私が教材を作る過程でこさえたのが絶一門です。審査でいちゃもんつけられたくなかったので method swizzlingは一切していないっす。
— もっさりさん (@TeamMOSA2) January 13, 2012
見事にはずれた\(^o^)/
というわけで、別の方法も妄想してみます!