Compila tú mismo la app de iOS con Xcode
La app de iOS es el mismo proyecto de Tauri 2 que el launcher de escritorio, compilado para iPhone y iPad. Esta página es para quien colabora en el proyecto y para jugadores que prefieren compilar el IPA ellos mismos en lugar de usar el nuestro. Si solo quieres jugar, instala la app oficial: mira iPhone/iPad: instalar con AltStore/SideStore.
- Necesitas un Mac con Xcode. El proyecto de Xcode solo se puede generar en macOS, por eso no está en el repositorio: lo crea un script.
- Para jugar a Minecraft hacen falta el motor de juego y JIT, igual que con la app oficial. El motor se añade a la app terminada en un paso aparte (mira Compilar el IPA). Si arrancas la app directamente desde Xcode, no tiene motor: todo lo demás funciona, pero las partidas no arrancan.
- Las apps firmadas con un Apple ID gratuito dejan de abrirse a los 7 días y hay que volver a firmarlas (refrescarlas). Con un Apple ID gratuito solo puedes tener 3 apps instaladas por sideload a la vez.
- Solo se compila para dispositivos reales (arm64); no hay build para el simulador de iOS.
Los comandos de esta página son los que ejecuta la CI (.github/workflows/ci.yml job launcher-ios, release.yml
jobs iOS e iOS engine, .github/workflows/ios-engine.yml). La CI nunca firma la app: compila un IPA sin
firmar, y AltStore/SideStore lo firman con el Apple ID del usuario al instalarlo.
Qué hay en cada sitio
| Ruta | Qué es |
|---|---|
scripts/ios-project.sh | Crea el proyecto de Xcode en src-tauri/gen/apple (tauri ios init) y añade iconos y claves del Info.plist |
scripts/ios-unsigned-ipa.sh | Compila la biblioteca de Rust y luego un archivo de Xcode sin firma de código, comprimido como IPA |
scripts/ios/build-engine.sh | Compila el motor de juego (Amethyst-iOS en un commit fijo, CMake, MobileGlues, parte de Java) |
scripts/ios/package-ipa.sh | Mete el motor en la app y la firma con ldid y los entitlements |
src-tauri/tauri.ios.conf.json | Cambios de la configuración de Tauri para iOS (iOS 15, sin actualizador de escritorio) |
src-tauri/Info.ios.plist | Texto de la cámara (código QR del control remoto del PC) y descarga en segundo plano para las notificaciones |
src-tauri/plugins/tauri-plugin-trs-game/ios/ | Parte en Swift, código del motor, trs-game.entitlements |
Requisitos
| Herramienta | Versión / nota |
|---|---|
| macOS con Xcode | con el SDK de iPhoneOS. El repositorio no fija ninguna versión de Xcode; la CI usa el Xcode por defecto de los runners de GitHub macos-latest (app) y macos-15 (motor) |
| Homebrew | para xcodegen (el script lo instala si falta), ldid y cmake |
| Node.js y pnpm | Node 22, pnpm en la versión fijada en package.json (corepack enable) |
| Rust | stable con rustup, target aarch64-apple-ios |
| JDK 8 | solo para el motor (CI: Zulu 8). Tiene que ser un JDK 8; build-engine.sh lo comprueba |
git, python3, zip | los usan los scripts |
La app necesita iOS 15 (minimumSystemVersion en tauri.ios.conf.json). La CI define
IPHONEOS_DEPLOYMENT_TARGET=15.0 para la app, porque los paquetes Swift de los plugins usan APIs de iOS 14 en adelante;
el motor se compila para 14.0.
Compilar el IPA
Descarga el código y las herramientas
git clone https://github.com/theredstonee/TRS-Launcher.git
cd TRS-Launcher
pnpm install
rustup target add aarch64-apple-ios
brew install ldid cmake
Compila la interfaz
pnpm generate
Crea el proyecto de Xcode
bash scripts/ios-project.sh
Ejecuta pnpm tauri ios init --ci si src-tauri/gen/apple todavía no existe, copia el texto de la cámara y la tarea en
segundo plano de src-tauri/Info.ios.plist al Info.plist de la app y pone los iconos de la app (y los iconos de
evento como iconos alternativos) en el catálogo de recursos.
Compila la app sin firmar
export IPHONEOS_DEPLOYMENT_TARGET=15.0
bash scripts/ios-unsigned-ipa.sh release build/TRS-Launcher-app.ipa
Qué pasa por dentro:
cargo build --lib --target aarch64-apple-ios --release --features tauri/custom-protocol, conTAURI_CONFIGigual al contenido detauri.ios.conf.json. La featurecustom-protocolintegra la interfaz; sin ella la app busca un servidor de desarrollo enlocalhost:3000y se cierra enseguida.- La biblioteca
libtrs_launcher_lib.ase copia asrc-tauri/gen/apple/Externals/arm64/release/libapp.a. scripts/ios/disable-rust-phase.pydesactiva la fase de build de Xcode «Build Rust Code» (tauri ios xcode-script): solo funciona dentro de untauri ios builden marcha, y la biblioteca ya está en su sitio.xcodebuild … archiveconCODE_SIGNING_ALLOWED=NO; después la.appse comprime comoPayload/en el IPA.
Para un build debug usa debug en lugar de release (la biblioteca va entonces a Externals/arm64/debug/). Para
CurseForge, define CURSEFORGE_API_KEY o pon la clave en ~/.tauri/curseforge-api-key; es opcional, sin ella CurseForge
se oculta.
Compila el motor de juego
JAVA8_HOME=$(/usr/libexec/java_home -v 1.8) bash scripts/ios/build-engine.sh build/engine-ios
El script descarga Amethyst-iOS en el commit fijo
9212a1894865e7ac0466029e25ddb0d895544c76, compara con él los archivos incluidos, compila el motor nativo y MobileGlues
con CMake y la parte de Java con el JDK 8. El resultado es una carpeta con Frameworks/, libs/, resources/,
LICENSES/ y engine.json. Los entornos de Java no van dentro: la app los descarga la primera vez que inicias una
partida.
Mete el motor en la app
bash scripts/ios/package-ipa.sh build/TRS-Launcher-app.ipa build/engine-ios build/TRS-Launcher.ipa
Copia el motor en la app, añade las claves del Info.plist para la app Archivos, el modo horizontal, el ratón y los
mandos, y lo firma todo con ldid: la app con los entitlements de
src-tauri/plugins/tauri-plugin-trs-game/ios/trs-game.entitlements (get-task-allow para JIT, el límite de memoria
ampliado y el espacio de direcciones ampliado). Con TRS_IOS_ENTITLEMENTS puedes indicar otro archivo.
Instálalo
Copia build/TRS-Launcher.ipa a tu iPhone o iPad e instálalo en AltStore o SideStore con My Apps → +. Lo firman con
tu Apple ID, igual que la app oficial. Otras herramientas que firman un IPA con tu Apple ID deberían funcionar también,
pero no las hemos probado. Después, activa JIT para jugar.
Ejecutarla desde Xcode con tu propio Apple ID
También puedes arrancar la app directamente desde Xcode en un iPhone conectado y firmarla con tu propio equipo (un Apple ID gratuito sirve como «Personal Team»). Es práctico si trabajas en la interfaz. Dos cosas que debes saber:
- Por este camino la app no tiene motor de juego: al iniciar una instancia avisa de que falta el motor. El inicio de sesión, social, vestuario, modpacks y todo lo demás funcionan.
- La CI nunca firma con un equipo, así que no hemos probado este camino.
Compila la biblioteca de Rust para Debug
Sigue los pasos hasta Crea el proyecto de Xcode y luego:
export IPHONEOS_DEPLOYMENT_TARGET=15.0
bash scripts/ios-unsigned-ipa.sh debug build/TRS-Launcher-debug.ipa
Así la biblioteca queda en src-tauri/gen/apple/Externals/arm64/debug/libapp.a y la fase de build de Rust queda
desactivada en el proyecto, de modo que Xcode puede compilar la app por su cuenta.
Abre el proyecto
open src-tauri/gen/apple/*.xcodeproj
Elige el esquema que termina en _iOS y tu iPhone como destino.
Elige tu equipo y tu bundle ID
En el target de la app, en Signing & Capabilities, elige tu Team y cambia el Bundle Identifier por uno
propio (por ejemplo io.github.tunombre.trslauncher): Apple solo deja usar un bundle ID a un equipo.
Ejecuta
Pulsa Run. Desde iOS 16, el iPhone pide primero el Modo de desarrollador (Ajustes → Privacidad y seguridad → Modo de desarrollador). Con un Apple ID gratuito puede que además tengas que confiar en tu perfil de desarrollador en Ajustes → General → VPN y gestión de dispositivos.
src-tauri/gen/apple y lo vuelves a crear,
se pierden.Hazla tu propia app
- Bundle ID: AltStore/SideStore firman el IPA con tu Apple ID, así que para eso no tienes que cambiar nada. Para Xcode, cambia el bundle ID allí (mira arriba).
- No cambies
identifierensrc-tauri/tauri.conf.json. También se usa para Android, donde el paquete de Kotlin y el código de Rust dependen de él, y el build de Android se detiene (mira Compila tú mismo la app de Android). Unidentifiersolo para iOS entauri.ios.conf.jsonpodría funcionar, pero no está probado. - Deja como está el ID de la tarea en segundo plano
dev.theredstonee.trslauncher.push-poll: aparece ensrc-tauri/Info.ios.plisty en el código Swift del plugin de notificaciones, e iOS solo ejecuta las tareas que figuran en el Info.plist.
Lo que sigue funcionando en tu propio build, según el código:
- El inicio de sesión con Microsoft usa el código de dispositivo (escribes un código en la página de Microsoft); no depende del bundle ID.
- Los servicios de TRS (amigos, chat, capas, API de TRS) hablan con la misma API; no se comprueba ni la app ni su firma.
- Los enlaces como
trs-launcher://pack/<code>usan el mismo esquema en todos los builds. - Actualizaciones: tu build no está ligado a nuestra fuente de AltStore/SideStore. Lo actualizas compilando e instalando de nuevo.
Si algo falla en tu propio build, avísanos.
Ejecutar las comprobaciones
Las mismas comprobaciones que la CI:
pnpm generate
cd src-tauri
IPHONEOS_DEPLOYMENT_TARGET=15.0 cargo clippy --workspace --target aarch64-apple-ios -- -D warnings
# plugin del juego para iOS, Rust y su paquete Swift (job "iOS engine"):
IPHONEOS_DEPLOYMENT_TARGET=14.0 cargo build -p tauri-plugin-trs-game --target aarch64-apple-ios
Problemas
«Build-Phase tauri ios xcode-script nicht gefunden»
scripts/ios-unsigned-ipa.sh desactiva esa fase de build la primera vez que se ejecuta; una segunda ejecución ya no la
encuentra y se detiene con este mensaje. La CI siempre empieza con un proyecto nuevo. En local, borra el proyecto generado
y vuelve a crearlo:
rm -rf src-tauri/gen/apple
bash scripts/ios-project.sh
Errores sobre el deployment target o APIs de iOS 14
Define IPHONEOS_DEPLOYMENT_TARGET=15.0 antes de compilar la app (14.0 para la comprobación del plugin del motor): los
paquetes Swift necesitan al menos iOS 14.
La app se cierra nada más abrirla
Si compilaste la biblioteca de Rust a mano, seguramente falta --features tauri/custom-protocol, y la app espera un
servidor de desarrollo en localhost:3000. Usa scripts/ios-unsigned-ipa.sh, que siempre lo añade.
«JDK 8 fehlt (JAVA8_HOME setzen)» o «JAVA8_HOME ist kein JDK 8»
La parte de Java del motor necesita exactamente un JDK 8. Instala uno y haz que JAVA8_HOME apunte a él.
«ldid fehlt (brew install ldid)»
package-ipa.sh firma con ldid: brew install ldid.
«vendored Datei weicht von Upstream ab»
Un archivo de ios/Engine/vendor/amethyst-ios no coincide con el commit fijo de Amethyst-iOS. Solo pueden diferir los
archivos parcheados que aparecen en el UPSTREAM.md de esa carpeta: deshaz tu cambio o actualiza la lista.
El juego se cierra nada más empezar
Casi siempre es porque JIT no está activo. Mira Activar JIT. El
registro del motor está en la app Archivos, en En mi iPhone → TRS Launcher (trs-engine.log).
Minecraft 26.3 no arranca
26.3 todavía no funciona en iOS (al motor le falta allí la integración con SDL3). Usa 26.2 o anterior.
«No se puede verificar la app» al cabo de una semana
Se acabaron los 7 días del Apple ID gratuito. Refresca la app en AltStore/SideStore o vuelve a ejecutarla desde Xcode.
Licencia y nombre
TRS Launcher es software libre bajo la GNU General Public License v3.0 (LICENSE, avisos de copyright en NOTICE).
Puedes compilar, cambiar y compartir la app. Si compartes un IPA, la GPL exige que sea bajo la misma licencia y que
pongas a disposición el código fuente completo de ese build exacto, con tus cambios. El motor de iOS se basa en
Amethyst-iOS (GPL-3.0) e incluye más partes de terceros; sus textos de licencia se copian dentro de la app
(licenses/engine) y aparecen en NOTICE: déjalos.
El repositorio no tiene reglas propias sobre la marca. Aun así: si repartes tu propio build, dale otro nombre y otro bundle ID para que nadie lo confunda con el TRS Launcher oficial, y remite a tu código fuente, no a nuestro soporte.
Siguientes pasos
Compila tú mismo la app de Android
Compila el APK de TRS Launcher desde el código: SDK y NDK de Android, targets de Rust, builds debug y release, tu propia clave de firma y tu propio ID de app.
TRS Server Rules
Plugin y mod de servidor para bloquear, forzar o limitar funciones del TRS Client en tu servidor: plataformas, configuración, protocolo e IDs de módulos.