2

新しいバージョンのバンドルをターゲット プロセスにロードしたいのですが、同じ名前のバンドルが既にロードされているため、ロードできません。バンドルの変更CFBundleVersionまたは変更CFBundleShortVersionStringが機能しません。最も簡単な方法は、ターゲット プロセスを強制終了して再起動することです。しかし、それが最善の方法だとは思いません。それで、それを行う別の方法はありますか?

4

1 に答える 1

3

私は mach_inject で同じ問題に直面しています。mach_inject を変更しない限り、単純な解決策は見当たりません。

私の解決策は、2 つのバンドルを作成することです。最初のバンドルは、実際のプラグインのプラグイン マネージャーであると考えてください。プラグイン マネージャーは非常にシンプルで、アップグレードする必要がないことを願っています。クリーンアップ コードが追加された元のバンドルをロードおよびアンロードします。

プラグインのロードとアンロードに Apple の NSBundle クラスを使用しています。アンロードする前に、元のプラグインのプリンシパル クラスを呼び出してクリーンアップします。

Objective C で書かれたバンドルのアンロードは危険です。2と4は一般的に当てはまります。

  1. Mach_override は元に戻すことはできませんが、プラグイン マネージャーで呼び出して、実際のプラグインのコードを呼び出すことができます。
  2. カテゴリとプロトコルは、アンロードされることを意図したプラグインで使用するのは安全ではありません。
  3. スウィズルしたものをアンスウィズルする必要があり、メソッドを削除できないことに注意してください。そのため、プラグインをリロードするときに、古いダングリング メソッドを置き換える (追加するのではなく) 必要があります。スウィズル コードを確認する必要があります。
  4. インストールされているタイマーを無効にし、オブザーバーを削除し、実行ループに追加されたものをすべて削除する必要があります。
于 2013-02-22T17:12:32.800 に答える