Cómo usé Swift Script en Electron Browser nativamente – CodesCode

Electron ofrece flexibilidad para mantener una única base de código en JavaScript y crear aplicaciones multiplataforma que admiten Windows, macOS y Linux.

Electron es un marco de trabajo para construir aplicaciones de cliente grueso utilizando tecnologías web como HTML, CSS y JavaScript. Electron proporciona flexibilidad para mantener un único código JavaScript y crear aplicaciones multiplataforma para Windows, macOS y Linux. Básicamente, escribes una vez y ejecutas en cualquier lugar.

JavaScript funciona bien con casi todas las características que se desearían en una aplicación, pero surge un problema cuando se requiere una interacción con API nativas específicas del sistema operativo. Uno de los problemas que enfrenté mientras trabajaba en un navegador basado en Electron fue la necesidad de encontrar una lista de ventanas de aplicaciones abiertas en Mac en intervalos específicos (unos pocos segundos). Node o JavaScript no proporciona ninguna interfaz para acceder a esta información desde la capa del sistema operativo, por lo que tuve que encontrar una solución personalizada.

Solución inicial

Inicialmente, resolví esto escribiendo OSAScript. El OSAScript pudo proporcionar la lista de ventanas abiertas en Mac, pero el problema principal que identificamos durante las pruebas fue el uso de la CPU. Como el OSAScript se estaba ejecutando a intervalos, causaba un aumento del 40-50% en el uso de la CPU; por lo tanto, la solución no fue aceptable.

¿Qué sigue?

Después de buscar, me encontré con varias soluciones como:

  1. Usar Python Cocoa library (PyCocoa): Esto proporciona una interfaz entre Python y Cocoa, que puede ser utilizada en JavaScript
  2. Bibliotecas JsCocoa: Intenté integrarla, pero no funcionó
  3. Servidor Flask personalizado: Había algunos posts sobre cómo ejecutar un servidor Flask personalizado dentro del navegador y consumir la API desde JavaScript

Todos estos enfoques eran demasiado complicados de usar o resultarían en una mayor latencia y aumento en el tamaño de la aplicación.

La solución

Usando SWIFT y child_process.exec(): Finalmente, decidí escribir un script nativo en SWIFT utilizando Cocoa para identificar las ventanas de los procesos y lo probé utilizando Xcode Playground. El script SWIFT generaría un JSON, que se puede consumir y analizar fácilmente. Una vez que las pruebas se completaron, lo compilé para crear un ejecutable utilizando

swiftc sample.swift -o sample

Esto me proporcionó un ejecutable sample que se puede ejecutar utilizando ./sample y producirá un JSON como salida.

El siguiente paso fue agregarlo a Electron y consumirlo en el método child_process.exec(). Para empaquetarlo, coloqué este archivo en una carpeta, digamos executable, y actualicé el script de copia para incluir el contenido de este archivo al empaquetar el código. Una vez que el ejecutable está presente dentro del paquete, proporciono la ruta del ejecutable al comando child_process.exec(). Con el uso del retorno de llamada de este comando, pude recuperar con éxito el JSON de salida del script SWIFT para tomar decisiones en la aplicación de Electron.

Resultado

Esto resultó en una reducción del consumo de CPU generado por OSAScript casi al 0% desde el 40%

Conclusión

  1. Crea ejecutables para cualquier ejecutable específico del sistema operativo, como SWIFT para Mac
  2. Empaqueta este ejecutable en tu aplicación de Electron
  3. Utiliza el comando child_process para ejecutar el ejecutable binario empaquetado
  4. ¡Utiliza la respuesta en tu aplicación de Electron para tomar decisiones!

Leave a Reply

Your email address will not be published. Required fields are marked *