1

フレームワークインストーラースクリプトに取り組んでいます。スクリプトは、ユーザーのAppDelegateファイルを変更し、applicationDidFinishLaunchingメソッドとapplicationWillTerminatateメソッドの最初または最後に数行のコードを挿入する必要があります。

私が考えたいくつかのオプション:

  • ソースコードを解析し、正しい位置に行を挿入します。(コンパイラを作成するのとほぼ同じように、すべてのコードを正しく処理して機能させるのは難しい場合があります...)
  • AppDelegateファイルをサブクラス化します(これは可能ですか?)
  • カテゴリ??

これらのどれが最良の選択肢ですか?他に何か提案はありますか?

4

2 に答える 2

1

開発者の介入なしにこれを変更するものを本当に作成する必要がありAppDelegate、xcodeprojとnibを変更できるが、ソースは変更できない場合は、それを行う方法があります。

まず、クラスがコンパイルされ、クラスのインスタンスがnibに作成されることを確認します。

さて、これがあなたがすることです:

  • -[AHHackClass applicationDidFinishLaunching]余分なことを行うメソッドを定義してから、を呼び出します[self originalApplicationDidFinishLaunching]
  • では-[AHHackClass awakeFromNib:]、objcランタイム呼び出しを使用して-[AHHackClass applicationDidFinishLaunching]メソッドをアプリケーションデリゲートにコピーし、-[originalApplicationDidFinishLaunching]メソッドスウィズリングを使用して2つのメソッドの実装を交換します。
  • スウィズルする場合も同じようにしapplicationWillTerminateます。

JRSwizzleメソッドのスウィズリングをはるかに簡単にするコードについては、MethodSwizzlingCocoaDevでいくつかの背景を参照してください。

ただし、これを行うにははるかに簡単な方法があるかもしれません。余分なものをアプリのデリゲートapplicationDidFinishLaunchingapplicationWillTerminateメソッドから呼び出す必要が本当にあるのでしょうか。で通知をリッスンし、そこで処理するように設定することはできませんawakeFromNibか?

そして、何らかの理由でそれができない場合は、開発者への指示に行を入れて、開発者のメソッドからメソッドを呼び出すことができますapplicationDidFinishLaunchingか?

于 2013-02-14T20:53:42.077 に答える
0

私が現在検討している1つの解決策:

  1. AppDelegate をサブクラス化する NewAppDelegate.m/h ファイルを追加します。
  2. このサブクラスは、私が望むことを実行してから、スーパー メソッドを呼び出します。
  3. main.m で AppDelegate を検索して NewAppDelegate.mh に置き換えます

これは非常にシンプルで堅牢なようです。これについての考えは?これはすべて/ほとんどのプロジェクトで機能しますか?

于 2013-02-14T21:00:11.617 に答える