想要在iPhone/iPad安裝第三方APP,卻苦於免費Apple開發者帳號只有3個APP的簽名限制嗎?
Duy Tran開發的「LiveContainer」用一種曲折的方式解決這個問題。
它有點類似虛擬機,或說是容器,但其實是APP啟動器,讓你不用真的安裝APP也可以使用APP。雖然APP是暫時執行的,但是資料會保存在同一個資料夾,日後可以持續使用。
LiveContainer最大的好處就是 安裝APP數量無上限! 我們知道不論是SideStore還是AltStore,因為是用免費的個人Apple開發者帳戶側載IPA的,所以會有一個裝置同時只能安裝3個APP的限制。要解鎖就只能花錢買3000台幣的Apple開發者年費帳號。而LiveContainer沒有此限制,在這個APP內部想裝幾個APP就裝幾個,只是需要進行切換程序。不需要花錢買Apple開發者帳號。
另外,LiveContainer也可以當成一種「私密空間」的APP使用,因為安裝的APP只有LiveContainer裡面能見到,所以APP不會顯示在主畫面上,可以增加隱私保護。LiveContainer支援使用FaceID給內部APP上鎖。
對不想花錢的免費仔來說,LiveContainer是一個值得考慮的方案。因為SideStore的簽名額度有限,而LiveContainer能讓你測試更多APP。在分配簽名額度的策略上,LiveContainer能夠靠一個APP換到好幾十個APP。安裝無限數量的這點很像是TrollStore,卻沒有限制iOS版本。
1. LiveContainer原理#
供有興趣的開發者參考,我只是簡略翻譯。
LiveContainer為開源軟體,根據開發者在Github的解釋,LiveContainer透過一連串技巧達成「讓系統以為這個APP是經過認可的」,所以就能直接執行。
首先LiveContainer會拆開IPA,修補二進位Mach-O執行檔的記憶體結構,將
__PAGEZERO
區段的起始記憶體地址調整,避開一些安全機制。把Mach-O標頭的檔案類型從
MH_EXECUTE
改成MH_DYLIB
,這樣系統就會以載入函式庫的方式來處理這個App。接著注入一段新的指令,載入自己的
TweakLoader.dylib
,讓App在啟動時會執行自定義的程式碼。修補
@executable_path
,LiveContainer對_NSGetExecutablePath
傳出空指標,並讓它當掉,產生SIGSEGV
錯誤,再修改@executable_path
上下文。讓載入的 App 以為自己是正統安裝的。修補
NSBundle.mainBundle
,直接改成安裝的IPA的路徑。採用Restoring Dyld Memory Loading方法,繞過iOS的簽名驗證。也可以用JIT來繞過簽名驗證。如果沒有JIT,就透過AltStore或SideStore給APP簽名。
呼叫
dlopen
啟動APP的二進位執行檔。讓
TweakLoader
在指定資料夾裡面載入tweaks。找到程式執行入口,跳到該處。
APP呼叫
UIApplicationMain
,像一般的iOS APP一樣啟動。關於多帳號與Keychain管理:iOS的Keychain可以用「Access Groups」區分不同App的資料。LiveContainer預先建立了128組不同的Access Groups。每次建立一個新的App容器,就隨機分配一組 Access Group,達成資料隔離的效果。這樣至多能安裝到128個APP。
為什麼能不安裝IPA就執行?它是把「安裝APP到系統 → 執行」這兩步拆開,然後用修改記憶體與Mach-O結構的方式,讓iOS誤以為這個App已經是合法可執行的,用動態連結庫注入方式載入執行。因此可以直接執行而不用正式安裝到iOS系統。
2. 系統需求#
LiveContainer需要iOS 15以上版本。
不需要越獄就能使用。
可想而知,LiveContainer沒有在App Store上架,需要用側載的。支援SideStore或AltStore側載。
大部分APP應該都能在LiveContainer裡面啟動,不過根據Github用戶的回報,少部份APP啟動會崩潰。
3. 安裝LiveContainer#
上文講了LiveContainer的原理,因此啟動APP之前都要修補一番。開發者提供JIT與JIT-Less模式來啟動APP。預設不設定的話就是使用JIT。
JIT的好處是能加速一部份模擬器APP的效能,且APP不需要簽名就能啟動。缺點是啟動APP要多一個切換JIT的步驟。
至於JIT-Less模式的話,則是會取用SideStore或AltStore的憑證來幫LiveContainer內部的APP簽名,不會受到免費Apple ID一週10個Bundle ID的限制。
各有利弊,看哪個比較方便就選哪個。
JIT模式#
我系統是iOS 18,為了方便啟用JIT,所以使用SideStore來側載APP。只有初次設定需要用到電腦。
接著再設定StikJIT,就可以免電腦啟用JIT。
到Github下載LiveContainer的IPA。連著SideStore提供的StosVPN,使用SideStore側載。
JIT-Less模式#
我系統是iOS 18,安裝SideStore
到Github下載LiveContainer的IPA安裝。
連著SideStore提供的StosVPN。
開啟LiveContainer APP,點選Settings,按Patch SideStore
之後SideStore會被修補,接著自動重新安裝。
重新開啟SideStore,LiveContainer應該會就會取得憑證。
回到LiveContainer,點選Settings → JIT-Less Mode Diagnose → Test JIT-less Mode,顯示Success即代表成功。
4. LiveContainer內APP啟動方法#
LiveContainer的啟動方法比較曲折一些。首先要知道的是,LiveContainer雖然可以匯入多個APP,但是一次只能啟動一個APP。
到Github之類網站下載想要側載的第三方IPA。
在LiveContainer側載你想要的IPA,可以根據需求匯入多個APP的IPA。嚴格來說APP沒有安裝到iOS系統,只是匯入到LiveContainer,只有該APP內可見。
在LiveContainer主界面,點APP旁邊的Run。如果使用JIT-Less模式,APP會在簽名完成後直接啟動。
反之,使用JIT模式的話LiveContainer APP會跳出,切換到SideStore界面,請手動返回iOS主畫面。連著SideStore提供的StosVPN,開啟StikJIT APP,以JIT啟動LiveContainer,進入要使用的APP。
下次再開啟LiveContainer的時候,會回到LiveContainer選取APP的介面,點選切換APP。
5. 實際操作例子:安裝RetroArch APP#
因為要加速遊戲模擬器效能,我這裡有使用JIT。
1. 以RetroArch模擬器為例,雖然有上架App Store但是JIT加速要用側載的。使用iOS的Safari到官方網站下載IPA。
開啟LiveContainer,點左上角+號,匯入IPA
點選Run
切換到StikJIT APP,以JIT啟動LiveContainer
註:不想要手動切換的,可以在LiveContainer → Settings → JIT,選取StikJIT。並在LiveContainer首頁,長按要啟動的APP設定,勾選Launch with JIT。
然後LiveContainer的畫面就會「變成」RetroArch,功能應可正常使用。
滑掉LiveContainer之後,剛剛啟動的APP也會隨之關閉。之後要重做一次JIT啟用步驟。
對LiveContainer裡面的APP選單長按右鍵,可以將APP的圖示加到iOS主畫面。
6. LiveContainer各個APP資料儲存位置#
LiveContainer能夠匯入多個APP,只要不刪除APP,切換APP之後資料依然會存在。
因為不是真正安裝到iOS系統,所以APP產生的資料只會儲存在LiveContainer內部。
開啟iOS檔案APP → 我的iPhone/iPad → LiveContainer → Data → Application,可以看到各個APP的資料。
7. 多重LiveContainer實例,同時使用不同的APP#
既然LiveContainer一次只能進入一個APP,那安裝兩個LiveContainer APP就解套啦!兩個LiveContainer APP就能同時執行不同的APP。
不過,第二個LiveContainer會佔掉一個位置,如果用SideStore簽名IPA,額度會全部佔滿,導致SideStore不能再安裝其他APP。
點選LiveContainer的Settings → Install Another LiveContainer,產生一個不同Bundle ID的IPA,再用SideStore側載之。