Cómo la aplicación Portals para Mac, integrada en Swift, utiliza la biblioteca Ockam Rust para compartir servicios de forma privada con tus amigos a través de portales cifrados de extremo a extremo.
integrada en Swift. Es de código abierto y utiliza la biblioteca Rust para compartir de forma privada servicios TCP o HTTP desde su Mac con sus amigos a través de portales Ockam cifrados de extremo a extremo. ¡Aparece un servicio compartido en su host local !
En esta publicación, profundizaremos en cómo interactúa la aplicación SwiftUI macOS con el código Rust.
Si tienes curiosidad por probar Portals para Mac. Puede obtener más información al respecto e instalarlo utilizando Homebrew de la siguiente manera:
brew install build-trust/ockam/portals
Aquí hay un vídeo de 2 minutos de la aplicación en acción:
Rápido <> Óxido
La funcionalidad Portales ya estaba implementada en la biblioteca Ockam Rust. Nos propusimos crear una excelente experiencia nativa de macOS.
Nuestro primer intento de crear la aplicación fue utilizando Tauri. Esto tenía sentido ya que queríamos utilizar la biblioteca de óxido de Ockam y la mayoría de las personas de nuestro equipo se sienten cómodas construyendo cosas en Rust. Esta primera versión fue fácil de construir y tenía todas las funciones básicas que queríamos. Sin embargo, la experiencia de usar la aplicación no fue muy buena. Tauri solo nos dio un control mínimo sobre cómo se representaba el menú y qué sucedía cuando un usuario interactúa con el menú. Esta versión de la aplicación parecía pertenecer a una versión de macOS de hace 10 años en comparación con los elementos de la barra de menú súper fáciles de usar integrados en macOS Sonoma.
Nos dimos cuenta de que para tener la rica experiencia que queremos, debemos crear la aplicación usando SwiftUI.
Desafortunadamente, no pudimos encontrar una solución disponible para integrar Swift y Rust que nos brindara lo mejor de ambos mundos; la seguridad de Rust y la rica experiencia nativa de macOS de SwiftUI. Después de investigar un poco más, nos dimos cuenta de que podemos conectar los dos usando C-89. Rust es compatible con la convención de llamadas de C y Swift es interoperable con Objective-C, que es un superconjunto de C-89.
Escribimos las estructuras de datos de Rust que debían ser visibles para Swift dos veces. Una versión es idiomática en Rust y fácil de usar. La otra versión es compatible con C y utiliza punteros y memoria que se asigna manualmente con malloc. También expusimos algunas API compatibles con C que utilizan punteros sin formato en Rust inseguro para convertir las estructuras de datos idiomáticas a sus versiones compatibles con C. Finalmente generamos automáticamente un encabezado C con la ayuda de la biblioteca cbindgen.
En el lado de Swift, podríamos haber llamado a las API de C directamente, pero las estructuras de datos de C no son ciudadanos de primera clase en Swift. Esto los hace más difíciles de usar idiomáticamente dentro del código SwiftUI. En su lugar, optamos por duplicar las estructuras de datos en Swift y convertirlas entre C y Swift. Esto puede parecer engorroso, pero en la práctica, el estado compartido no cambia muy a menudo. La capacidad de crear rápidamente componentes en SwiftUI utilizando construcciones como if let ... , ForEach , enum , etc. es muy útil y vale la pena el sacrificio.
Aquí hay un ejemplo de la misma estructura en sus 4 formas:
La aplicación Swift está vinculada estáticamente a nuestra biblioteca Rust en el momento de la compilación. El flujo de datos es simple: las interacciones de la interfaz de usuario se envían desde Swift a Rust como acciones llamando a las API de C, los eventos de cambio los emite solo Rust y se notifica a Swift mediante devoluciones de llamada que conducen a actualizaciones de la interfaz de usuario.
La mayor parte del código en las vistas de SwiftUI se parece a cualquier otra aplicación de SwiftUI.
Si tiene curiosidad por obtener más información, consulte el código de la caja y la . El en la carpeta Swift también es un buen lugar para explorar cómo se construye y vincula todo.
Si está interesado en contribuir con el código Swift o Rust de , agregamos nuevos cada semana y nos encanta ayudar a los nuevos contribuyentes. Únase a nosotros en la .