1. Instalar los targets de Rust
rustup target add aarch64-apple-ios
rustup target add x86_64-apple-ios
rustup target add aarch64-apple-ios-sim2. Generar bindings Swift
cargo run --bin uniffi-bindgen generate src/lib.udl --language swift3. Compila la lib para iOS
cargo build --target x86_64-apple-ios --release
cargo build --target aarch64-apple-ios --release
cargo build --target aarch64-apple-ios-sim --release4. Dentro de la carpeta raiz-proyecto/target/aarch64-apple-ios-sim copia la lib .a.
5. Para la integración en iOS:
Abre tu proyecto en Xcode
Crea una carpeta "Headers" en la carpeta raiz del proyecto.
Arrastra los archivos .h, .a y .modulemap a la carpeta Headers.
Renombra el archivo tu_lib.modulemap a module.modulemap.
6. Configurar Build Settings (Xcode)
Header Search Paths
Ve a:
TARGET → Build Settings → Search Paths → Header Search Paths
//agrega
$(SRCROOT)/Headers/**Library Search Paths
Ve a:
TARGET → Build Settings → Search Paths → Library Search Paths
//agrega
$(SRCROOT)/HeadersOther Linker Flags
Ve a:
TARGET → Build Settings → Linking → Other Linker Flags
//(Aquí reemplaza rustlib por el nombre real de tu librería, sin el prefijo lib.
//Ejemplo: si tu archivo es librustffi.a, el flag es -lrustffi).
-lrustlibEnable Modules (C and Objective-C)
Ve a:
TARGET → Build Settings → Apple Clang - Language - Modules
Pon Yes
//Esto permite que el module.modulemap funcione y puedas usar import RustLib en Swift.7. Agregamos los bindings (.swift) generados por UniFFI al proyecto de iOS (Punto 2) y llamamos a nuestras funciones.
import tu_lib
let password = generatePassword(
length: UInt64(passwordLength),
includeUppercase: includeUppercase,
includeNumbers: includeNumbers,
includeSymbols: includeSymbols
)
let strength = checkStrength(password: password)Conclusión
En esta cuarta parte dimos un paso clave: llevar nuestra librería escrita en Rust a Xcode utilizando UniFFI.
Ya no solo tenemos nuestro código compilado en Rust, sino que ahora está empaquetado en un .a (static library) junto con sus headers (.h) y modulemap, lo que nos permite integrarlo de manera nativa dentro de cualquier app iOS.
Con esto abrimos la puerta a:
Reutilizar lógica crítica de Rust (seguridad, performance, criptografía, etc.) en aplicaciones iOS.
Reducir duplicación de código al tener la misma librería disponible en múltiples plataformas.
Aprovechar UniFFI para generar bindings automáticos en Swift, lo que simplifica enormemente la integración con nuestro proyecto.
👉 En la siguiente parte de la serie veremos cómo empaquetar nuestra librería en un Swift Package Manager (SPM), exponer los métodos generados y consumirlos fácilmente desde cualquier proyecto SwiftUI o UIKit. Esto nos permitirá distribuir nuestra librería Rust + UniFFI como un paquete Swift estándar, instalable con solo agregar la dependencia en Xcode.
Si te ha gustado este contenido y quieres apoyar la serie, considera dejar tu feedback o unirte como suscriptor. Así podremos seguir profundizando en Rust + UniFFI + iOS/Android con proyectos prácticos y avanzados.
