PakePlus-iOS
PakePlus エコシステムの iOS 向けテンプレート — URL または静的 HTML を WKWebView で包み、GitHub Actions 上で IPA を生成する。
PakePlus-iOS(Sjj1024/PakePlus-iOS)は、PakePlus がフォークする iOS ビルド用テンプレートリポジトリ。デスクトップ版が Tauri を使う一方、iOS 版は SwiftUI + WKWebView の薄いネイティブシェルで Web コンテンツを表示する。ユーザーは PakePlus クライアントまたは Web UI で ppconfig.json を書き、GitHub Actions が ppworker で Xcode プロジェクトへ設定を流し込み、署名なしの .ipa を Release に公開する。
親プロジェクト PakePlus は Mac / Windows / Linux / Android / iOS を横断する「Web をアプリ化」ツール群。iOS テンプレート単体では GUI は持たず、設定ファイル + ビルドスクリプト + 最小 Swift アプリ が本体になる。
flowchart TD
subgraph native["SwiftUI シェル"]
App["PakePlusApp"]
CV["ContentView"]
WV["WebView UIViewRepresentable"]
end
subgraph config["Info.plist キー"]
WEBURL["WEBURL"]
DEBUG["DEBUG"]
FULL["FULLSCREEN / LAUNCHIMAGE"]
end
subgraph web["表示対象"]
Remote["リモート URL"]
Local["Bundle 内 index.html"]
Pwd["pppwd.html パスワードゲート"]
end
App --> CV
CV --> WV
config --> CV
config --> WV
WV --> Remote
WV --> Local
WV --> Pwd
PakePlus/ # SwiftUI アプリ本体
PakePlusApp.swift # @main エントリ
ContentView.swift # WebView + 起動画像 ZStack
WebView.swift # WKWebView ラッパー・Coordinator
custom.js # ページ注入用(ビルド時コピー)
scripts/
ppconfig.json # PakePlus が書き込む設定
ppworker.cjs # plist / pbxproj / Swift へ反映
www/ # 静的 HTML パック用
.github/workflows/
build.yml # IPA ビルド・Release 公開
ContentView は Info.plist の WEBURL・DEBUG・FULLSCREEN・LAUNCHIMAGE・SCREENON を読み、WebView のロード完了まで起動画像を重ねる。WebView は UIViewRepresentable で WKWebView を生成し、Coordinator がナビゲーション・ダウンロード・権限・JS ブリッジを担当する。
flowchart LR A["checkout"] --> B["pnpm install"] B --> C["pnpm pp:worker"] C --> D["appicon 生成"] D --> E["xcodebuild Release"] E --> F["Payload + zip → IPA"] F --> G["softprops/action-gh-release"]
- Init:
pnpm installのあとpnpm pp:worker(node scripts/ppworker.cjs)がppconfig.jsonを読み、Bundle ID・表示名・URL・デバッグフラグなどをプロジェクトへ書き込む。 - アイコン: ルートの
app-icon.pngからbrew install appiconで AppIcon.appiconset を生成。 - ビルド:
xcodebuildをCODE_SIGNING_ALLOWED=NOで実行(署名なし)。DerivedData からPakePlus.appを拾う。 - パッケージ:
Payload/PakePlus.appを zip し{NAME}-{VERSION}.ipaに。静的 HTML モード時はScripts/www/*を app バンドルへ追加。 - 公開:
ppworkerがGITHUB_ENVに書いたNAME/VERSION/PUBBODYで GitHub Release を作成。
pnpm pp:worker # 設定反映のみ
pnpm run icon # appicon でアイコン生成
pnpm run build:ipa# make package(Theos / 別経路)
scripts/ppconfig.json は PakePlus クライアントが生成する巨大な設定 JSON。ppworker.cjs がビルド前に以下を更新する。
| 設定領域 | 反映先 | 内容 |
|---|---|---|
showName / appid | Info.plist, project.pbxproj | 表示名・Bundle Identifier・画面向き |
url / isHtml | Info.plist の WEBURL | リモート URL またはダミー pakeplus.com(ローカル HTML 用) |
startMethod | WEBURL + www/ コピー | password 時は password.com + pppwd.html |
devbug | DEBUG, vConsole.js | デバッグ時のみ vConsole 注入・ファイル残置 |
phone.safeArea | ContentView.swift | ignoresSafeArea の edges を文字列置換 |
phone.launchImage | LAUNCHIMAGE, Assets | launch.jpg → LaunchScreen.imageset |
webview.userAgent | USERAGENT, WebView.swift | カスタム UA |
| メタ | GITHUB_ENV | NAME, VERSION, PUBBODY, ISHTML |
表示モードの分岐
- リモート URL:
WEBURLに実 URL を設定し、余分なindex.htmlは削除。 - 静的 HTML:
scripts/www/をPakePlus/へコピーし、WEBURLをhttps://www.pakeplus.com/に。WebView はホスト名で Bundle 内index.htmlをloadFileURLする。 - パスワード起動:
pppwd.htmlを経由し、検証後に本番 URL またはローカル HTML へ遷移。
| 機能 | 実装の要点 |
|---|---|
| ズーム無効 | viewport meta 注入 + viewForZooming で nil |
| スワイプ戻る/進む | 左右スワイプで goBack / goForward |
| ファイルダウンロード | リンククリック時に拡張子判定 → URLSession または blob JS ブリッジ |
| 外部スキーム | tel / mailto / sms 等は UIApplication.open |
| メディア権限 | iOS 15+ requestMediaCapturePermissionFor でシステム許可と連動 |
| 位置情報 | CLLocationManager で事前認可(Web 内 Geolocation 用) |
| カスタム JS | Bundle の custom.js を documentStart で注入 |
| デバッグ | DEBUG 時 vConsole + isInspectable(iOS 16.4+) |
Blob ダウンロードは blobDownload メッセージハンドラでチャンク受信 → 一時ファイル保存 → UIActivityViewController(共有シート)でユーザーに保存先を選ばせる。
- GitHub: Sjj1024/PakePlus-iOS — 本テンプレート
- GitHub: Sjj1024/PakePlus — 親プロジェクト(デスクトップ / Android 含む)
- PakePlus Web — ブラウザ版 UI
- tw93/Pake — オリジナルの Tauri CLI 版
- docs-site: Pake 解説 — デスクトップ版の対比資料