2013-02-09 78 views
2

我想將較新版本的bundle加載到目標進程,但是這是不可能的,因爲已經加載了具有相同名稱的bundle。捆綁的更改CFBundleVersionCFBundleShortVersionString不起作用。最簡單的方法是簡單地殺死目標進程並重新啓動它。但我認爲這不是一個最好的辦法。那麼還有另一種方法可以做到嗎?有沒有辦法在mach_inject之後卸載bundle

回答

3

我正面臨與mach_inject相同的問題。沒有修改mach_inject,我看不到一個簡單的解決方案。

我的解決方案是創建兩個捆綁。考慮第一個bundle是真實插件的插件管理器。插件管理器非常簡單,希望永遠不需要升級,它會加載和卸載添加了清理代碼的原始包。

我正在使用Apple的NSBundle類來加載和卸載插件。在卸載之前,我會調用原始插件中的主要類來清理它。

卸載以目標C編寫的捆綁包是危險的。一般來說,這是真實的。

  1. Mach_override不能撤銷,但可以在插件管理器中調用並在實插件中調用代碼。
  2. 類別和協議不安全的插件意味着被卸載。
  3. 你需要不摻雜你攪拌的東西,記住你不能刪除方法,所以當你重新加載插件時,你需要替換(不添加)舊的懸掛方法。你需要檢查你的swizzle代碼。
  4. 您需要使安裝的計時器無效,移除觀察者,並刪除添加到運行循環的其他內容。
相關問題