Guía de problemas de permisos de desarrollo en macOS
Debido a que el LCC Unity SDK usa una biblioteca de decodificación webP de terceros, puedes encontrar el error "Failed to open xxx.bundle" al usar el SDK en macOS. Se trata del mecanismo de seguridad de macOS (Gatekeeper) que bloquea la ejecución de plugins de terceros no certificados, y no tiene nada que ver con Unity ni con el propio SDK.
Esta guía tiene dos partes:
- Parte 1: Resolver temporalmente los problemas de permisos de bibliotecas de terceros en el entorno de desarrollo.
- Parte 2: La solución formal al empaquetar una aplicación (para distribución pública).
Parte 1: Resolver temporalmente los problemas de permisos de bibliotecas de terceros en el entorno de desarrollo
Los siguientes métodos se aplican para eliminar rápidamente la restricción del bundle durante el desarrollo; pruébalos en orden de prioridad.
Método 1: Permitir directamente en Ajustes del sistema (más rápido)
| Paso | Operación |
|---|---|
| 1 | Abre Ajustes del sistema de Mac y busca Privacidad y seguridad a la izquierda |
| 2 | Desplázate hacia abajo para encontrar la sección "Seguridad" |
| 3 | Encuentra el aviso "xxx.bundle was blocked from use" y haz clic en el botón Permitir adyacente |
| 4 | Reinicia Unity y, a continuación, vuelve a importar o ejecutar el SDK |
Método 2: Eliminar el atributo de cuarentena mediante Terminal (más completo)
macOS añade el atributo de cuarentena com.apple.quarantine a los archivos descargados de la red; puedes eliminarlo directamente con un comando de Terminal.
| Paso | Operación |
|---|---|
| 1 | Abre Launchpad → Otros → Terminal |
| 2 | Introduce el comando (mantén un espacio final): sudo xattr -rd com.apple.quarantine |
| 3 | Arrastra el archivo xxx.bundle que informó del error directamente a la ventana de Terminal para autocompletar la ruta |
| 4 | Pulsa Intro e introduce la contraseña de inicio de sesión de Mac (no se muestra mientras escribes, lo cual es normal) |
| 5 | Reinicia Unity después de que el comando finalice |
Consejo:
Este comando requiere privilegios de administrador (
sudo). La pantalla no mostrará nada mientras escribes la contraseña; simplemente termina de escribir y pulsa Intro.
Método 3: Añadir permisos de ejecución (complementario)
Si los Métodos 1 y 2 siguen sin funcionar, añade permisos de ejecución al bundle:
chmod -R 755 /path/to/xxx.bundle
También puedes arrastrar el archivo bundle a Terminal para autocompletar la ruta, pulsar Intro y reiniciar Unity.
Método 4: Comprobar los ajustes de plataforma del plugin de Unity
| Paso | Operación |
|---|---|
| 1 | Encuentra el archivo xxx.bundle en la ventana Proyecto de Unity |
| 2 | Selecciónalo y mira la ventana Inspector |
| 3 | En Platform Settings, marca Any Platform, o marca por separado Standalone / macOS |
| 4 | Asegúrate de que Exclude Platform no está marcado |

Marcar Any Platform o macOS en Platform Settings en el Inspector
Método 5: Desactivar temporalmente Gatekeeper (último recurso)
Advertencia:
Este método reduce la seguridad del sistema. Solo se recomienda para uso temporal en una máquina de desarrollo; asegúrate de volver a activarlo después de que el desarrollo finalice.
Si ninguno de los métodos anteriores funciona, puedes desactivar temporalmente la verificación de seguridad del sistema:
sudo spctl --master-disable
Verifica si está desactivado:
spctl --status
# assessments disabled se muestra cuando se desactiva correctamente
Vuelve a activar la protección de seguridad después de que el desarrollo finalice:
sudo spctl --master-enable
Parte 2: Resolver los problemas de permisos de bibliotecas de terceros al empaquetar una aplicación
Para que los usuarios finales usen una aplicación que contiene un SDK de terceros sin percibir el problema, debes completar la «firma de código profunda + notarización de Apple + vinculación de ticket Staple» en el lado del desarrollador. Esta es la única solución estándar conforme en macOS con cero operaciones del usuario.
Requisitos previos (todos obligatorios)
| N.º | Condición | Descripción |
|---|---|---|
| 1 | Apple Developer Program | 99 USD/año, usado para obtener el certificado Developer ID Application |
| 2 | Habilitar Hardened Runtime | En Player Settings → Other Settings → Mac de Unity, marca Use Hardened Runtime |
| 3 | Configurar un Bundle ID único | Mantenlo coherente con el portal de desarrolladores |
| 4 | Desactivar la firma automática de Unity | Usa Terminal para firmar profundamente de forma manual después del empaquetado |
Flujo de trabajo completo de firma y notarización
Paso 1: Limpiar los atributos extendidos
xattr -cr "YourApp.app"
Paso 2: Firma recursiva profunda
El parámetro --deep recorre automáticamente todos los archivos internos .bundle, .dylib y .framework y los firma uniformemente, resolviendo a fondo el problema de que los bundles de terceros se bloqueen por no estar firmados.
codesign --force --deep --options runtime --sign "Developer ID Application: YourCompany (TeamID)" "YourApp.app"
Punto clave:
Reemplaza
YourCompany (TeamID)por tu Developer ID completo. Usar--deepasegura que todos los bundles internos de terceros estén firmados — esta es la causa raíz del 90 % de los problemas de «sigue dando error después de firmar».
Paso 3: Empaquetar un zip estándar para la notarización
Debes usar el comando ditto para empaquetar; no uses la compresión con clic derecho del sistema (de lo contrario, la verificación de notarización fallará).
ditto -c -k --sequesterRsrc --keepParent "YourApp.app" build.zip
Paso 4: Subir a Apple para la notarización
Usa notarytool (la nueva herramienta oficial) para enviar a notarización; el backend de Apple escanea automáticamente en busca de código malicioso:
xcrun notarytool submit build.zip --apple-id your@apple.com --password app-specific-password --team-id TeamID --wait
Espera a que se devuelva Accepted, lo que significa que la notarización ha pasado.
Paso 5: Vincular el ticket de notarización a la App
Después de la vinculación, los usuarios pueden pasar la verificación incluso al abrir sin conexión:
xcrun stapler staple "YourApp.app"
# Verifica si se realizó correctamente
xcrun stapler validate "YourApp.app"
Pruebas internas / Distribución en intranet empresarial (alternativa)
Si aún no tienes una cuenta de desarrollador de Apple, puedes distribuir dentro de la intranet usando el siguiente enfoque:
| Paso | Operación |
|---|---|
| 1 | Unity empaqueta el .app |
| 2 | En la máquina de compilación, ejecuta: xattr -rd com.apple.quarantine "YourApp.app" |
| 3 | Distribuye mediante herramientas de intranet (scp, nube empresarial, unidad USB), no descargues a través de un navegador |
Limitación:
Este enfoque solo se aplica a la transferencia en intranet. Las descargas del navegador volverán a añadir el atributo de cuarentena, provocando que el error del bundle reaparezca, y no es adecuado para distribución pública.
Errores comunes
| Error común | Enfoque correcto |
|---|---|
Se firmó solo el programa principal, sin --deep | Debes usar --deep para firmar recursivamente todos los bundles / dylibs internos |
| No se habilitó Hardened Runtime | Márcalo en Player Settings antes del empaquetado de Unity, de lo contrario la notarización falla directamente |
| Se olvidó vincular el ticket después de la notarización | Debes ejecutar xcrun stapler staple, de lo contrario la apertura sin conexión sigue mostrando el diálogo |
| No se limpiaron los atributos extendidos antes de firmar | Ejecuta primero xattr -cr para limpiar los atributos residuales de todos los bundles y luego firma |
Se usó la compresión con clic derecho del sistema en lugar de ditto | Debes usar el empaquetado estándar ditto -c -k, de lo contrario la verificación de notarización falla |
Resumen
La única solución estándar para la distribución pública = Apple Developer ID + codesign profundo + notarización notarytool + ticket stapler. Después de completarla, los usuarios descargan y usan la aplicación de inmediato, sin diálogo de seguridad y sin percibir el problema.