Desarrolladores

Compila tú mismo la app de iOS con Xcode

Compila el IPA de TRS Launcher para iPhone y iPad en un Mac: proyecto de Xcode, biblioteca de Rust, motor de juego, sideload y ejecución con tu propio Apple ID.

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.

Antes de empezar:
  • 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

RutaQué es
scripts/ios-project.shCrea 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.shCompila la biblioteca de Rust y luego un archivo de Xcode sin firma de código, comprimido como IPA
scripts/ios/build-engine.shCompila el motor de juego (Amethyst-iOS en un commit fijo, CMake, MobileGlues, parte de Java)
scripts/ios/package-ipa.shMete el motor en la app y la firma con ldid y los entitlements
src-tauri/tauri.ios.conf.jsonCambios de la configuración de Tauri para iOS (iOS 15, sin actualizador de escritorio)
src-tauri/Info.ios.plistTexto 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

HerramientaVersión / nota
macOS con Xcodecon 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)
Homebrewpara xcodegen (el script lo instala si falta), ldid y cmake
Node.js y pnpmNode 22, pnpm en la versión fijada en package.json (corepack enable)
Ruststable con rustup, target aarch64-apple-ios
JDK 8solo para el motor (CI: Zulu 8). Tiene que ser un JDK 8; build-engine.sh lo comprueba
git, python3, ziplos 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:

  1. cargo build --lib --target aarch64-apple-ios --release --features tauri/custom-protocol, con TAURI_CONFIG igual al contenido de tauri.ios.conf.json. La feature custom-protocol integra la interfaz; sin ella la app busca un servidor de desarrollo en localhost:3000 y se cierra enseguida.
  2. La biblioteca libtrs_launcher_lib.a se copia a src-tauri/gen/apple/Externals/arm64/release/libapp.a.
  3. scripts/ios/disable-rust-phase.py desactiva la fase de build de Xcode «Build Rust Code» (tauri ios xcode-script): solo funciona dentro de un tauri ios build en marcha, y la biblioteca ya está en su sitio.
  4. xcodebuild … archive con CODE_SIGNING_ALLOWED=NO; después la .app se comprime como Payload/ 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.

Cuando AltStore/SideStore vuelven a firmar la app con un Apple ID gratuito, normalmente se pierden los dos entitlements de memoria. La app comprueba en tiempo de ejecución lo que tiene de verdad y elige la memoria de Java según eso, así que el juego recibe menos memoria que con TrollStore.

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.

Los ajustes de firma de Xcode se guardan en el proyecto generado. Si borras 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 identifier en src-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). Un identifier solo para iOS en tauri.ios.conf.json podría funcionar, pero no está probado.
  • Deja como está el ID de la tarea en segundo plano dev.theredstonee.trslauncher.push-poll: aparece en src-tauri/Info.ios.plist y 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

El APK con tu propia clave de firma, en Windows y Linux.

iPhone y iPad

Instala la app oficial con AltStore o SideStore.