LiveContainer
iOS アプリランチャー — ゲスト IPA をホストプロセス内で実行し、1 つの App ID で複数アプリ・複数データコンテナを運用する sideload 基盤。
LiveContainer(LiveContainer/LiveContainer)は、iOS アプリを端末へ個別インストールせず、ランチャー本体の中で起動する sideload ツール。エミュレータやハイパーバイザではなく、Mach-O の改変と dlopen によるゲスト実行環境を構築する。
無料開発者アカウントの 3/10 アプリ制限は LiveContainer 内のゲストには適用されない。同一アプリの複数バージョン・複数データコンテナも共存できる。配布は Standalone と LiveContainer+SideStore の 2 系統(Stable / Nightly)。
| 要件 | 内容 |
|---|---|
| OS | iOS / iPadOS 15+(マルチタスクは 16.0+) |
| インストーラ | AltStore 2.0+ または SideStore 0.6.0+ |
| ビルド | Xcode。Debug 用 DEVELOPMENT_TEAM を xcconfigs/Global.xcconfig に設定 |
LiveContainer/ # メイン実行体 — ゲスト環境セットアップ・ロード
LiveContainerSwiftUI/ # SwiftUI ランチャー UI(未選択時に表示)
MultitaskSupport/ # 仮想ウィンドウ・PiP・iPad ネイティブウィンドウ
SideStore/ # SideStore 更新連携(XPC)
TweakLoader/ # CydiaSubstrate + tweak 注入(全ゲスト)
ZSign/ # 同梱署名(Feather 派生 zsign)
LaunchAppExtension/ # ホーム画面ショートカット用
LiveProcess/ # SideStore 連携プロセスハンドラ
| モジュール | 役割 |
|---|---|
LiveContainer(main) | LCBootstrap.m / dyld_bypass_validation 等でゲスト Mach-O をパッチし dlopen 起動 |
LiveContainerSwiftUI | IPA 追加・選択・設定 UI。Localizable.xcstrings で多言語 |
MultitaskSupport | FrontBoardAppLauncher ベースの in-app マルチタスク |
TweakLoader | ゲストごとに tweak フォルダを読み込み、UIKit フック等を注入 |
ZSign | JIT-less 時は LiveContainer と同証明書でゲストを再署名 |
SideStore | アプリ更新(refresh)統合用 XPC サーバー |
README の「How does it work?」に沿った流れ。ホスト(LiveContainer)がゲスト実行ファイルを動的ライブラリ化し、パスと Bundle を差し替えてからエントリポイントへジャンプする。
flowchart TD A[IPA インストール] --> B[Mach-O パッチ] B --> B1["__PAGEZERO を 0xFFFFC000 / 0x4000 に変更"] B --> B2["MH_EXECUTE → MH_DYLIB"] B --> B3["TweakLoader.dylib を load command 注入"] B --> C["@executable_path フック
_NSGetExecutablePath"] C --> D["NSBundle.mainBundle をゲストに差替"] D --> E{JIT 利用?} E -->|Yes iOS26未満| F[Library Validation バイパス] E -->|JIT-less| G[ZSign で再署名] F --> H[dlopen ゲスト実行体] G --> H H --> I[TweakLoader が tweak 読込] I --> J[エントリポイント → UIApplicationMain]
Mach-O パッチの要点
__PAGEZEROのvmaddr/vmsizeを固定値へ書き換え、ゲストがホストアドレス空間に載る余地を確保- ファイルタイプを
MH_DYLIBに変更し、通常の実行ファイルではなく動的ライブラリとしてロード可能にする TweakLoader.dylibを load command で注入 — 以降すべてのゲストに tweak 基盤が載る
実行パスと Bundle の偽装
dyld4::APIs::_NSGetExecutablePathをフックし、config.process.mainExecutablePathを書き換え可能な領域へ差し替え(builtin_vm_protectまたは TPRO unlock)NSBundle.mainBundleをゲストアプリの bundle に上書き — ゲストから見た「自分自身」のパスが正しく見える
Library Validation バイパス
JIT が使える環境(iOS 26 未満)では codesign を完全に迂回できる。JIT-less では全実行ファイルを署名するためこの経路は使わない。実装は Restoring Dyld Memory Loading 系の手法に由来。
Keychain の半分離
entitlements.xml で 128 個の keychain access group を定義し、同一アプリの各コンテナへランダム割当。最大 128 コンテナで keychain を分離できる(完全サンドボックスではない — 後述の制限参照)。
| 機能 | 操作・条件 |
|---|---|
| IPA インストール | 「+」から IPA 選択 → 次回起動アプリを指定。長押しで管理 |
| ホーム画面追加 | 公式ガイド — LaunchAppExtension 経由 |
| 複数 LiveContainer | 別インスタンス間でデータ移行ほぼシームレス。同時起動に利用 |
| マルチタスク | バナー長押し → Multitask。SideStore/AltStore インストール時は Keep App Extensions 必須。JIT は PID アタッチ対応 enabler(StikDebug 等)が必要 |
| JIT | iOS 26 未満で署名省略。詳細は JIT ガイド |
| Tweak | 外部 tweak フォルダをゲストごとに指定 — TweakLoader が注入 |
| 複数コンテナ | 同一アプリのデータコンテナを複数保持。外部コンテナも可 |
| アプリ非表示 | ロック / 非表示設定(README の Hiding Apps 参照) |
| Fix File Picker / 通知 | ゲスト個別設定でファイルピッカー・ローカル通知の互換修正 |
| Open In App | URL 入力または iCloud ショートカット共有で対応アプリを起動 |
全アプリが動くわけではない。compatibility ラベル付き Issue で既知問題を確認。リストに無ければ多くは動作するが、動かない場合は Issue テンプレートから報告。
| 項目 | 影響 |
|---|---|
| ゲスト entitlements | ホストへは適用されない(sideload では基本 entitlements で足りる想定) |
| App Permissions | 端末全体でグローバルに適用 — ゲスト単位の分離なし |
| サンドボックス | ゲストコンテナは相互アクセス可能 — 他ゲストのデータを読める |
| App Extensions | 未対応(LiveContainer は sandbox 内、SpringBoard がゲストを認識しない、App ID 消費) |
| マルチタスク + iPhone Mirroring | iPad 物理キーボードは修正済みだが、Mirroring は別チェックで未解決 |
| Push 通知 | リモート push は動作しない |
| Custom URL scheme 照会 | 動作しない可能性(README は ? 付き) |
- GitHub: LiveContainer/LiveContainer — 本体リポジトリ
- LiveContainer 公式ドキュメント
- インストールガイド
- FAQ
- Crowdin — 翻訳プロジェクト
- docs-site: PakePlus-iOS 解説 — Web を iOS ネイティブ化する別系統(WKWebView ラッパー)