アプリ起動時に処理を割り込ませる方法
バージョンはLeopard*1。DYLD_FORCE_FLAT_NAMESPACEを使わないといけないのがアレですがまあアレです。
あと不要な手順が結構あるかも。
試すときは自己責任でお願いします。とりあえずsshとかでログインできるようにしておくと良いかも。
- アプリがリンクしているフレームワークを調べ、そのcurrent versionとcompatibility versionを調べる
- XcodeでFuga2という名前のフレームワークを新規作成する。
- 追加>既存のフレームワークでFuga.frameworkを追加
- Fuga2Dummyクラスを追加
- 一応Fuga.frameworkのクラスを参照しておく(仮にFugaViewクラスとする)
- @class FugaView;
- 適当にメソッドを追加して[FugaView class]などと書いておく
- インスペクタのビルドのリンクの現在のライブラリのバージョンと互換バージョンと変更(Fuga.frameworkに合わせる)
- ビルドして/System/Library/Frameworksと/Developer/SDKs/MacOSX10.5.sdk/System/Library/Frameworks/にインストール
- XcodeでFugaという名前のフレームワークを新規作成する
- 追加>既存のフレームワークで(本物の)Fuga.frameworkと上で作ったFuga2.frameworkを追加
- FugaDummyクラスを追加
- FugaDummyクラスに+(void)loadメソッドを作成し、適当に処理(NSLog(@"[FugaDummy] hello!");など)を書く
- Info.plistのNSPrincipalClassでFugaDummyを指定
- インスペクタのビルドのリンクの現在のライブラリのバージョンと互換バージョンと変更(本物のFuga.frameworkに合わせる)
- /System/Library/Frameworks/の下をごちょごちょする
- さっき入れたFuga2.frameworkを削除
- 本物のFuga.frameworkの中身をFuga2.frameworkにコピー
mkdir Fuga2.framework
(cd Fuga.framework;tar cf - .)|(cd Fuga2.framework;tar xvf -)
mv Fuga2.framework/Versions/Current/Fuga{,2}
rm Fuga2.framework/Fuga
ln -s Versions/Current/Fuga2 Fuga2.framework
-
- 本物のFuga.frameworkの中身をバックアップ
mv Fuga.framework{,.bak}
-
- 上で作ったダミーのFuga.frameworkを/System/Library/Frameworks/下にインストール
追記
Mach-oファイルにバイナリパッチ当てて直接LC追加すればtwo-level namespaceのままでも出来そうな気も。
もっとも元のアプリがプラグイン機構持つのが一番いいと思う。折角ローダブルバンドルを気軽に作れる環境なんだし。
*1:Snow Leopardでも出来ればイイナ