File: README.md
English [简体中文](http://www.pakeplus.com/) [日本语](https://github.com/Sjj1024/PakePlus/discussions/108)
PakePlus-iOS
PakePlus supports Mac, Windows, Linux, and Android & iOS. There’s no need to install complex dependencies locally— all you need is a Github Token. Plus, PakePlus is only about 10MB in size. For the latest version, please see the release page. or visit: PakePlus Web. Check the README for information on popular packages and custom development. Feel free to share your suggestions in the discussion area.
https://github.com/user-attachments/assets/b88bf541-0b26-4020-9eec-da79e1734fc9
Sponsors
PakePlus is an MIT-licensed open source project with its ongoing development made possible entirely by the support of these awesome backers. If you'd like to join them, please consider sponsoring PakePlus's development.
| FineVoice
Create Every Voice You Imagine | Tauri
Create cross-platform applications | Cursor
Cursor is the best way to code with AI. | JetBrains
The Leading IDE for Professional Development |
| --- | --- | --- | --- |
Features
- 🎐 Approximately 20 times smaller than Electron (less than 5MB!) and 10 times faster.
- 🚀 Built with Rust Tauri, PakePlus is lighter and faster than JavaScript-based frameworks.
- 📦 Comes with rich built-in features — supports shortcuts, immersive windows, and minimalist customization.
- 👻 PakePlus is a minimalist tool that replaces traditional packaging with Tauri for cross-platform desktop apps.
- 📲 Uses native frameworks to package Android and iOS apps — smaller and faster than Tauri2.
- 🤗 Easy to use — just one GitHub Token is all you need to get a desktop app.
- 🌹 No need to install complex dependencies locally — use GitHub Actions for cloud-based automatic packaging.
- 🧑🤝🧑 Internationalization support — automatically follows your system language.
- 💡 Supports custom JavaScript injection — write your own JS to inject into the page.
- 🎨 Beautiful and user-friendly UI — better experience for beginners, supports Chinese names for packaging.
- 📡 Usable directly via the web, but the client offers stronger functionality and is recommended.
- 🔐 Data security — your token is stored only locally, and your project stays safely in your own Git repo.
- 🍀 Supports static file packaging — drop in a compiled dist folder or index.html from Vue/React to create a client app.
- 🐞 Debug mode supported — find and eliminate bugs during preview or release.
- 💬 If you run into any issues, feel free to join our technical community for help.
Use Cases
- Have a website? Instantly turn it into a app and elevate its appearance.
- Have a Vue/React project and don’t want to buy a server? Package it as a desktop app.
- Want your Cocos game to run as a cross-platform client? No problem.
- Need to build your Unity project as a cross-platform client? Also no problem.
- Hide your website address from casual sharing or bots scraping your content.
- For internal company platforms — restrict access to your site via a dedicated client only.
- Turn any website into your custom client — inject JS for automation and custom features.
- Annoyed by website ads? Hide them with powerful JS.
- Want to use Tauri2 but the environment is too heavy? Use PakePlus instead!
Getting Started
Download the app from the release page:https://github.com/Sjj1024/PakePlus/releases,
double-click to install, and run the app. or visit web: PakePlus WebConfigure a Github Token, create a new project, and set up the configurations. get token guide:
English 简体中文日本语
Explanation of Github Token permissions:
1. For the beta version, token permissions required:
All repositories: Fork an original template repository
Actions: Manage GitHub actions
Administration: Fork and manage files in the repository
Contents: Add, delete, modify, and find repository contents
Issues: Submit issues to PakePlus
1. For the classic version, token permissions required:
repo: Fork and manage template code
workflow: Compile and release your software- You can preview the app in a new window and click the publish button to package the app.
- You can download the app from the release page.
FAQ
- Mac users may see an “App is damaged” warning on installation. click cancel and Run the following command, then reopen the app:(This is because the application requires an official signature to avoid the prompt of "The application is damaged" popping up after installation. However, the cost of the official signature is $99 per year... Therefore, it is necessary to manually bypass the signature to use it normally)
sudo xattr -r -d com.apple.quarantine /Applications/PakePlus.app- When you package the app, Mac users may see an “App is damaged” warning on installation. click cancel and Run the following command, then reopen the app:
sudo xattr -r -d com.apple.quarantine /Applications/YourAppName.appIf you encounter any issues while using the program, please download the latest version, as versions developed before 2025 were based on Tauri v1.0. In 2025, Tauri was upgraded to v2.0. If the latest version still has issues, please submit an issue with detailed information so that we can update and resolve it more quickly.
After you add the GitHub Token, PakePlus will fork a PakePlus repository into your own repository. All your future projects will rely on this repository for creation and compilation, so please do not delete your PakePlus repository.
Developing PakePlus
If you want to develop PakePlus locally, ensure your environment is prepared beforehand. Make sure Rust >=1.63 and Node >=16 (e.g., 16.18.1) are installed on your computer. For installation guidance, please refer to the Tauri Documentation.
If you’re unfamiliar with these, it’s best to try the one-click packaging tool above.
# Install dependencies
pnpm i
# Local development [Right-click to open debug mode.]
pnpm run dev
# Package the app
pnpm run buildSupport
wechat and group,my wechat is lanxingme,welcome to join the wechat group.
💖If PakePlus has brought joy to your life, feel free to support it.
File: package.json
{
"name": "pakeplus-ios",
"private": true,
"version": "1.0.0",
"type": "module",
"scripts": {
"pp:worker": "node ./scripts/ppworker.cjs",
"restore": "git restore .",
"icon": "appicon app-icon.png --output-path ./PakePlus/Assets.xcassets/AppIcon.appiconset",
"merge:main": "git checkout main && git merge web3 && git push",
"build:ipa": "make package FINALPACKAGE=1 PACKAGE_FORMAT=ipa"
},
"keywords": [
"pakeplus",
"pakeplus-android"
],
"author": "1024小神",
"license": "ISC",
"dependencies": {
"commander": "^13.1.0",
"fs-extra": "^11.3.0",
"plist": "^3.1.0",
"sharp": "^0.34.1"
},
"pnpm": {
"onlyBuiltDependencies": [
"sharp"
]
}
}
File: pnpm-lock.yaml
lockfileVersion: '9.0'
settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
importers:
.:
dependencies:
commander:
specifier: ^13.1.0
version: 13.1.0
fs-extra:
specifier: ^11.3.0
version: 11.3.5
plist:
specifier: ^3.1.0
version: 3.1.1
sharp:
specifier: ^0.34.1
version: 0.34.5
packages:
'@emnapi/[email protected]':
resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==}
'@img/[email protected]':
resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==}
engines: {node: '>=18'}
'@img/[email protected]':
resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm64]
os: [darwin]
'@img/[email protected]':
resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [x64]
os: [darwin]
'@img/[email protected]':
resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==}
cpu: [arm64]
os: [darwin]
'@img/[email protected]':
resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==}
cpu: [x64]
os: [darwin]
'@img/[email protected]':
resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==}
cpu: [arm64]
os: [linux]
libc: [glibc]
'@img/[email protected]':
resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==}
cpu: [arm]
os: [linux]
libc: [glibc]
'@img/[email protected]':
resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==}
cpu: [ppc64]
os: [linux]
libc: [glibc]
'@img/[email protected]':
resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==}
cpu: [riscv64]
os: [linux]
libc: [glibc]
'@img/[email protected]':
resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==}
cpu: [s390x]
os: [linux]
libc: [glibc]
'@img/[email protected]':
resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==}
cpu: [x64]
os: [linux]
libc: [glibc]
'@img/[email protected]':
resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==}
cpu: [arm64]
os: [linux]
libc: [musl]
'@img/[email protected]':
resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==}
cpu: [x64]
os: [linux]
libc: [musl]
'@img/[email protected]':
resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm64]
os: [linux]
libc: [glibc]
'@img/[email protected]':
resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm]
os: [linux]
libc: [glibc]
'@img/[email protected]':
resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [ppc64]
os: [linux]
libc: [glibc]
'@img/[email protected]':
resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [riscv64]
os: [linux]
libc: [glibc]
'@img/[email protected]':
resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [s390x]
os: [linux]
libc: [glibc]
'@img/[email protected]':
resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [x64]
os: [linux]
libc: [glibc]
'@img/[email protected]':
resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm64]
os: [linux]
libc: [musl]
'@img/[email protected]':
resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [x64]
os: [linux]
libc: [musl]
'@img/[email protected]':
resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [wasm32]
'@img/[email protected]':
resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm64]
os: [win32]
'@img/[email protected]':
resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [ia32]
os: [win32]
'@img/[email protected]':
resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [x64]
os: [win32]
'@xmldom/[email protected]':
resolution: {integrity: sha512-A9gOqLdi6cV4ibazAjcQufGj0B1y/vDqYrcuP6d/6x8P27gRS8643Dj9o1dEKtB6O7fwxb2FgBmJS2mX7gpvdw==}
engines: {node: '>=14.6'}
[email protected]:
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
[email protected]:
resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==}
engines: {node: '>=18'}
[email protected]:
resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
engines: {node: '>=8'}
[email protected]:
resolution: {integrity: sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==}
engines: {node: '>=14.14'}
[email protected]:
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
[email protected]:
resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==}
[email protected]:
resolution: {integrity: sha512-ZIfcLJC+7E7FBFnDxm9MPmt7D+DidyQ26lewieO75AdhA2ayMtsJSES0iWzqJQbcVRSrTufQoy0DR94xHue0oA==}
engines: {node: '>=10.4.0'}
[email protected]:
resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==}
engines: {node: '>=10'}
hasBin: true
[email protected]:
resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
[email protected]:
resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
[email protected]:
resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
engines: {node: '>= 10.0.0'}
[email protected]:
resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==}
engines: {node: '>=8.0'}
snapshots:
'@emnapi/[email protected]':
dependencies:
tslib: 2.8.1
optional: true
'@img/[email protected]': {}
'@img/[email protected]':
optionalDependencies:
'@img/sharp-libvips-darwin-arm64': 1.2.4
optional: true
'@img/[email protected]':
optionalDependencies:
'@img/sharp-libvips-darwin-x64': 1.2.4
optional: true
'@img/[email protected]':
optional: true
'@img/[email protected]':
optional: true
'@img/[email protected]':
optional: true
'@img/[email protected]':
optional: true
'@img/[email protected]':
optional: true
'@img/[email protected]':
optional: true
'@img/[email protected]':
optional: true
'@img/[email protected]':
optional: true
'@img/[email protected]':
optional: true
'@img/[email protected]':
optional: true
'@img/[email protected]':
optionalDependencies:
'@img/sharp-libvips-linux-arm64': 1.2.4
optional: true
'@img/[email protected]':
optionalDependencies:
'@img/sharp-libvips-linux-arm': 1.2.4
optional: true
'@img/[email protected]':
optionalDependencies:
'@img/sharp-libvips-linux-ppc64': 1.2.4
optional: true
'@img/[email protected]':
optionalDependencies:
'@img/sharp-libvips-linux-riscv64': 1.2.4
optional: true
'@img/[email protected]':
optionalDependencies:
'@img/sharp-libvips-linux-s390x': 1.2.4
optional: true
'@img/[email protected]':
optionalDependencies:
'@img/sharp-libvips-linux-x64': 1.2.4
optional: true
'@img/[email protected]':
optionalDependencies:
'@img/sharp-libvips-linuxmusl-arm64': 1.2.4
optional: true
'@img/[email protected]':
optionalDependencies:
'@img/sharp-libvips-linuxmusl-x64': 1.2.4
optional: true
'@img/[email protected]':
dependencies:
'@emnapi/runtime': 1.10.0
optional: true
'@img/[email protected]':
optional: true
'@img/[email protected]':
optional: true
'@img/[email protected]':
optional: true
'@xmldom/[email protected]': {}
[email protected]:
dependencies:
graceful-fs: 4.2.11
jsonfile: 6.2.1
universalify: 2.0.1
[email protected]:
dependencies:
universalify: 2.0.1
optionalDependencies:
graceful-fs: 4.2.11
[email protected]:
dependencies:
'@xmldom/xmldom': 0.9.10
base64-js: 1.5.1
xmlbuilder: 15.1.1
[email protected]:
dependencies:
'@img/colour': 1.1.0
detect-libc: 2.1.2
semver: 7.7.4
optionalDependencies:
'@img/sharp-darwin-arm64': 0.34.5
'@img/sharp-darwin-x64': 0.34.5
'@img/sharp-libvips-darwin-arm64': 1.2.4
'@img/sharp-libvips-darwin-x64': 1.2.4
'@img/sharp-libvips-linux-arm': 1.2.4
'@img/sharp-libvips-linux-arm64': 1.2.4
'@img/sharp-libvips-linux-ppc64': 1.2.4
'@img/sharp-libvips-linux-riscv64': 1.2.4
'@img/sharp-libvips-linux-s390x': 1.2.4
'@img/sharp-libvips-linux-x64': 1.2.4
'@img/sharp-libvips-linuxmusl-arm64': 1.2.4
'@img/sharp-libvips-linuxmusl-x64': 1.2.4
'@img/sharp-linux-arm': 0.34.5
'@img/sharp-linux-arm64': 0.34.5
'@img/sharp-linux-ppc64': 0.34.5
'@img/sharp-linux-riscv64': 0.34.5
'@img/sharp-linux-s390x': 0.34.5
'@img/sharp-linux-x64': 0.34.5
'@img/sharp-linuxmusl-arm64': 0.34.5
'@img/sharp-linuxmusl-x64': 0.34.5
'@img/sharp-wasm32': 0.34.5
'@img/sharp-win32-arm64': 0.34.5
'@img/sharp-win32-ia32': 0.34.5
'@img/sharp-win32-x64': 0.34.5
[email protected]:
optional: true
File: PakePlus/Assets.xcassets/Contents.json
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
File: PakePlus/Assets.xcassets/AccentColor.colorset/Contents.json
{
"colors" : [
{
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
File: PakePlus/Assets.xcassets/AppIcon.appiconset/Contents.json
{"images":[{"scale":"2x","size":"60x60","filename":"[email protected]","platform":"ios","idiom":"universal"},{"filename":"[email protected]","idiom":"universal","scale":"2x","platform":"ios","size":"20x20"},{"filename":"[email protected]","idiom":"universal","scale":"2x","platform":"ios","size":"40x40"},{"filename":"[email protected]","idiom":"universal","scale":"2x","platform":"ios","size":"76x76"},{"filename":"[email protected]","idiom":"universal","scale":"1x","platform":"ios","size":"1024x1024"},{"filename":"[email protected]","idiom":"universal","scale":"2x","platform":"ios","size":"38x38"},{"filename":"[email protected]","idiom":"universal","scale":"3x","platform":"ios","size":"20x20"},{"filename":"[email protected]","idiom":"universal","scale":"3x","platform":"ios","size":"29x29"},{"filename":"[email protected]","idiom":"universal","scale":"3x","platform":"ios","size":"40x40"},{"filename":"[email protected]","idiom":"universal","scale":"2x","platform":"ios","size":"29x29"},{"filename":"[email protected]","idiom":"universal","scale":"2x","platform":"ios","size":"83.5x83.5"},{"filename":"[email protected]","idiom":"universal","scale":"2x","platform":"ios","size":"64x64"},{"filename":"[email protected]","idiom":"universal","scale":"3x","platform":"ios","size":"38x38"},{"filename":"[email protected]","idiom":"universal","scale":"2x","platform":"ios","size":"68x68"},{"filename":"[email protected]","idiom":"universal","scale":"3x","platform":"ios","size":"60x60"},{"filename":"[email protected]","idiom":"universal","scale":"3x","platform":"ios","size":"64x64"}],"info":{"version":1,"author":"appicon"}}
File: PakePlus/Preview Content/Preview Assets.xcassets/Contents.json
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
File: scripts/ppconfig.json
{
"name": "",
"url": "",
"showName": "",
"appid": "",
"icon": "",
"iconPath": "",
"iconRound": true,
"state": true,
"single": true,
"injectJq": true,
"tauriApi": false,
"devbug": false,
"version": "0.0.1",
"preview": "desktop",
"platform": ["1-1", "1-2", "2-1", "2-2"],
"width": 800,
"height": 600,
"desc": "",
"jsFile": [],
"filterCss": "",
"customJs": "",
"isHtml": false,
"htmlPath": "",
"htmlFiles": [],
"prefix": "",
"pcRepo": "",
"iosRepo": "",
"androidRepo": "",
"win7Repo": "",
"more": {
"windows": {
"label": "",
"title": "",
"url": "",
"userAgent": "",
"width": 800,
"height": 600,
"theme": null,
"resizable": true,
"fullscreen": false,
"maximized": false,
"minWidth": 400,
"minHeight": 300,
"maxWidth": 1920,
"maxHeight": 1080,
"decorations": true,
"transparent": false,
"titleBarStyle": "Visible",
"visible": true,
"focus": true,
"closable": true,
"minimizable": true,
"maximizable": true,
"alwaysOnTop": false,
"alwaysOnBottom": false,
"center": false,
"shadow": true,
"skipTaskbar": false,
"tabbingIdentifier": null,
"parent": null,
"dragDropEnabled": true,
"browserExtensionsEnabled": false,
"devtools": true,
"contentProtected": false,
"hiddenTitle": false,
"incognito": false,
"proxyUrl": null,
"useHttpsScheme": false,
"zoomHotkeysEnabled": false,
"acceptFirstMouse": false,
"create": false,
"backgroundColor": null,
"backgroundThrottling": null,
"javascriptDisabled": false
}
},
"phone": {
"fullScreen": false,
"launchImage": "",
"screenOn": false,
"download": true,
"internet": true,
"position": false,
"direction": "default",
"callPhone": false,
"microphone": false,
"camera": false,
"backgroundPlay": false,
"compress": false,
"appSize": 0,
"videoFull": true,
"author": "pakeplus",
"startMethod": "none",
"startPwd": "123456",
"pwdTitle": "",
"pwdBtn": "",
"pwdPlace": "",
"pwdTip": "",
"pwdError": "",
"endPwd": "123456",
"endPwdTitle": "",
"endPwdTip": "",
"endPwdError": "",
"pwdStyle": "flat",
"pwdTheme": "dark",
"safeArea": {
"top": 0,
"bottom": 0,
"left": 0,
"right": 0
},
"header": {
"show": false,
"title": "",
"backgroundColor": "",
"color": "",
"fontSize": 16,
"fontWeight": "bold",
"loading": false,
"toolBar": false,
"toolBarBackgroundColor": "",
"toolBarColor": "",
"toolBarFontSize": 16,
"toolBarFontWeight": "bold"
},
"siderMenu": {
"show": false,
"width": 0,
"backgroundColor": "",
"color": "",
"fontSize": 16,
"fontWeight": "bold",
"title": "",
"titleColor": "",
"titleFontSize": 16,
"titleFontWeight": "bold"
},
"tabBar": {
"show": false,
"backgroundColor": "",
"color": "",
"activeColor": "",
"fontSize": 16,
"fontWeight": "bold",
"tabBarItem": []
},
"webview": {
"userAgent": "",
"javaScriptEnabled": true,
"domStorageEnabled": true,
"allowFileAccess": false,
"loadWithOverviewMode": true,
"setSupportZoom": false,
"clearCache": false
}
},
"ios": {
"name": "PakePlus",
"showName": "PakePlus",
"version": "0.0.1",
"webUrl": "https://juejin.cn/",
"id": "com.xiaoshen.pakeplus.ios",
"icon": "./app-icon.png",
"desc": "Package for personal use only, please do not use for commercial purposes(打包仅限个人使用,请勿传播或商业用途)",
"pubBody": "Package for personal use only, please do not use for commercial purposes(打包仅限个人使用,请勿传播或商业用途)",
"isHtml": false,
"debug": false,
"safeArea": "all"
},
"android": {
"name": "PakePlus",
"showName": "PakePlus",
"version": "0.0.1",
"webUrl": "https://juejin.cn/",
"id": "com.xiaoshen.pakeplus.android",
"icon": "./app-icon.png",
"input": "./app-icon.png",
"output": "./res",
"rounded": true,
"copyTo": "./app/src/main/res",
"androidResDir": "./app/src/main/res",
"desc": "Package for personal use only, please do not use for commercial purposes(打包仅限个人使用,请勿传播或商业用途)",
"pubBody": "Package for personal use only, please do not use for commercial purposes(打包仅限个人使用,请勿传播或商业用途)",
"isHtml": false,
"debug": false,
"safeArea": "all"
},
"desktop": {
"name": "PakePlus2",
"showName": "xiaoshen",
"version": "0.0.2",
"id": "com.xiaoshen.app",
"desc": "",
"webUrl": "https://juejin.cn/",
"iconPath": "../app-icon.png",
"inputPath": "../app-icon.png",
"tempPath": "./processed-image.png",
"icnsPath": "../src-tauri/icons/icon.icns",
"pubBody": "",
"isHtml": false,
"single": true,
"state": true,
"injectJq": false,
"tauriApi": true,
"buildMethod": "local",
"debug": false,
"pageTitle": true,
"author": "pakeplus",
"startMethod": "none",
"startPwd": "",
"pwdTitle": "",
"pwdBtn": "",
"pwdPlace": "",
"pwdTip": "",
"pwdError": "",
"endPwd": "",
"endPwdTitle": "",
"endPwdTip": "",
"endPwdError": "",
"pwdStyle": "flat",
"pwdTheme": "dark",
"autoStart": false,
"rightClick": false
}
}
File: .github/back/build.yml
name: Build IPA
on:
workflow_dispatch:
# push:
# branches:
# - main
permissions:
contents: write
pages: write
id-token: write
jobs:
build:
runs-on: macos-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Set up Xcode
uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: '16.2.0'
- name: Install Dependencies (Homebrew & Theos)
run: |
echo "Installing Homebrew..."
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
echo "Setting up Homebrew..."
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> $HOME/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"
echo "Installing Theos dependencies..."
brew install ldid dpkg
echo "Cloning Theos..."
git clone --recursive https://github.com/theos/theos.git $HOME/theos
echo 'export THEOS=$HOME/theos' >> $HOME/.zshrc
export THEOS=$HOME/theos
- uses: pnpm/action-setup@v3
with:
version: latest
- name: Sync node version and setup cache
uses: actions/setup-node@v4
with:
node-version: 20
cache: pnpm
- name: Init Project Config
run: |
pnpm install
pnpm pp:worker
- name: Generate AppIcon
run: |
echo "Installing appicon tool..."
brew install Nonchalant/appicon/appicon
echo "Generating AppIcon..."
appicon app-icon.png --output-path ./PakePlus/Assets.xcassets/AppIcon.appiconset
- name: Build IPA Package
run: |
export THEOS=$HOME/theos
echo "Building IPA package..."
make package FINALPACKAGE=1 PACKAGE_FORMAT=ipa
- name: Get IPA File Path
id: find_ipa
run: |
IPA_PATH=$(find ./packages -name "*.ipa" | head -n 1)
echo "IPA File: $IPA_PATH"
echo "ipa_path=$IPA_PATH" >> $GITHUB_ENV
- name: Rename IPA File
run: |
NAME="${{ env.NAME }}"
VERSION="${{ env.VERSION }}"
IPA_PATH="${{ env.ipa_path }}"
DIR=$(dirname "$IPA_PATH")
NEW_NAME="${NAME}-${VERSION}.ipa"
NEW_PATH="${DIR}/${NEW_NAME}"
mv "$IPA_PATH" "$NEW_PATH"
echo "Renamed IPA: $NEW_PATH"
echo "ipa_path=$NEW_PATH" >> $GITHUB_ENV
ls -l $DIR
- name: Upload IPA to GitHub Releases
uses: softprops/action-gh-release@v1
with:
files: ${{ env.ipa_path }}
tag_name: '${{ env.NAME }}'
name: '${{ env.NAME }} v${{ env.VERSION }}'
body: '${{ env.PUBBODY }}'
draft: false
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}File: .github/back/gitai.yml
name: Build Unsigned IPA
on:
workflow_dispatch:
jobs:
build-ipa:
runs-on: macos-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Xcode
uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: '16.4'
- name: Print environment information
run: |
echo "macOS version: $RUNNER_OS"
echo "Runner OS version details:"
sw_vers
echo "Xcode version:"
xcodebuild -version
echo "Xcode path:"
xcode-select -p
- name: Build for Release
run: |
xcodebuild -project PakePlus.xcodeproj -scheme PakePlus -configuration Release -sdk iphoneos \
CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO CODE_SIGNING_ALLOWED=NO
- name: Find .app and package as IPA
run: |
# 查找生成的 .app 目录
APP_PATH=$(find ~/Library/Developer/Xcode/DerivedData -type d -name "PakePlus.app" | grep Release-iphoneos | head -n 1)
echo "APP_PATH is $APP_PATH"
mkdir -p Payload
cp -R "$APP_PATH" Payload/
zip -r PakePlus.ipa Payload
mkdir -p export
mv PakePlus.ipa export/
- name: Upload IPA Artifact
uses: actions/upload-artifact@v4
with:
name: PakePlus-ipa
path: export/PakePlus.ipaFile: .github/workflows/build.yml
name: Build IPA
on:
workflow_dispatch:
# push:
# branches:
# - main
permissions:
contents: write
pages: write
id-token: write
jobs:
build:
runs-on: macos-26
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Set up Xcode
uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: latest-stable
- uses: pnpm/action-setup@v4
with:
version: 10
- name: Sync node version and setup cache
uses: actions/setup-node@v4
with:
node-version: 22.14.0
- name: Init Project Config
run: |
pnpm install --no-frozen-lockfile
pnpm pp:worker
- name: Generate AppIcon
run: |
echo "Installing appicon tool..."
brew install Nonchalant/appicon/appicon
echo "Generating AppIcon..."
appicon app-icon.png --output-path ./PakePlus/Assets.xcassets/AppIcon.appiconset
- name: Build for Release
run: |
xcodebuild -project PakePlus.xcodeproj -scheme PakePlus -configuration Release -sdk iphoneos \
CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO CODE_SIGNING_ALLOWED=NO
- name: Package IPA
run: |
APP_PATH=$(find ~/Library/Developer/Xcode/DerivedData -type d -name "PakePlus.app" | grep Release-iphoneos | head -n 1)
echo "APP_PATH is $APP_PATH"
mkdir -p Payload
cp -R "$APP_PATH" Payload/
NAME="${{ env.NAME }}"
VERSION="${{ env.VERSION }}"
ISHTML="${{ env.ISHTML }}"
${ISHTML} && cp -R ./Scripts/www/* ./Payload/PakePlus.app/
zip -r ${NAME}-${VERSION}.ipa Payload
mkdir -p export
mv ${NAME}-${VERSION}.ipa export/
- name: Publish IPA
uses: softprops/action-gh-release@v1
with:
files: export/${{ env.NAME }}-${{ env.VERSION }}.ipa
tag_name: '${{ env.NAME }}'
name: '${{ env.NAME }} v${{ env.VERSION }}'
body: '${{ env.PUBBODY }}'
draft: false
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}