Saltar al contenido principal

Construir aplicaciones de macOS con Flutter

Consideraciones específicas de la plataforma para compilar para macOS con Flutter.

Esta página analiza las consideraciones únicas al compilar aplicaciones macOS con Flutter, incluyendo la integración con el shell y la distribución de aplicaciones macOS a través de la Apple Store.

Integración con la apariencia de macOS

#

Si bien puedes usar cualquier estilo visual o tema que elijas para construir una app de macOS, es posible que desees adaptar tu app para alinearla más completamente con la apariencia de macOS. Flutter incluye el conjunto de Widgets Cupertino, que proporciona un conjunto de Widgets para el lenguaje de diseño actual de iOS. Muchos de estos Widgets, incluyendo sliders, switches y controles segmentados, también son apropiados para su uso en macOS.

Como alternativa, puede que el paquete macos_ui se adapte bien a tus necesidades. Este paquete proporciona widgets y temas que implementan el lenguaje de diseño de macOS, incluyendo un marco y scaffold MacosWindow, barras de herramientas, botones desplegables y emergentes, y diálogos modales.

Compilación de aplicaciones macOS

#

Para distribuir tu aplicación macOS, puedes distribuirla a través de la macOS App Store, o puedes distribuir el archivo .app en sí, tal vez desde tu propio sitio web. Debes notarizar tu aplicación macOS antes de distribuirla fuera de la macOS App Store.

El primer paso en ambos procesos mencionados anteriormente consiste en trabajar con tu aplicación dentro de Xcode. Para poder compilar tu aplicación desde Xcode, primero debes compilar la aplicación para producción utilizando el comando flutter build y luego abrir la aplicación Runner de macOS de Flutter.

bash
flutter build macos
open macos/Runner.xcworkspace

Una vez dentro de Xcode, sigue la documentación de Apple sobre cómo notarizar aplicaciones de macOS o sobre cómo distribuir una aplicación a través de la App Store. También debes leer la sección de soporte específico de macOS a continuación para comprender cómo los entitlements, el App Sandbox y el Hardened Runtime afectan a tu aplicación distribuible.

Compilar y publicar una aplicación macOS proporciona un recorrido paso a paso más detallado sobre cómo publicar una aplicación de Flutter en la App Store.

Entitlements y el App Sandbox

#

Las compilaciones de macOS están configuradas por defecto para estar firmadas y en un entorno seguro con App Sandbox. Esto significa que si deseas otorgar capacidades o servicios específicos a tu aplicación de macOS, como los siguientes:

  • Acceso a internet
  • Capturar películas e imágenes desde la cámara integrada
  • Acceso a archivos

Entonces debes configurar entitlements específicos en Xcode. La siguiente sección te explica cómo hacerlo.

Configuración de entitlements

#

La gestión de la configuración del sandbox se realiza en los archivos macos/Runner/*.entitlements. Al editar estos archivos, no debes eliminar las excepciones originales de Runner-DebugProfile.entitlements (que admiten conexiones de red entrantes y JIT), ya que son necesarias para que los modos debug y profile funcionen correctamente.

Si estás acostumbrado a gestionar archivos de entitlements a través de la interfaz de usuario de capacidades de Xcode, ten en cuenta que el editor de capacidades actualiza solo uno de los dos archivos o, en algunos casos, crea un archivo de entitlements completamente nuevo y cambia el proyecto para usarlo en todas las configuraciones. Ambos escenarios causan problemas. Recomendamos que edites los archivos directamente. A menos que tengas una razón muy específica, siempre debes realizar cambios idénticos en ambos archivos.

Si mantienes habilitado el App Sandbox (lo cual es necesario si planeas distribuir tu aplicación en la App Store), deberás gestionar los entitlements de tu aplicación al añadir ciertos plugins u otra funcionalidad nativa. Por ejemplo, el uso del plugin file_chooser requiere añadir el entitlement com.apple.security.files.user-selected.read-only o com.apple.security.files.user-selected.read-write. Otro entitlement común es com.apple.security.network.client, que debes añadir si realizas alguna solicitud de red.

Sin el entitlement com.apple.security.network.client, por ejemplo, las solicitudes de red fallarán con un mensaje como:

flutter: SocketException: Connection failed
(OS Error: Operation not permitted, errno = 1),
address = example.com, port = 443

Para obtener más información sobre estos temas, consulta App Sandbox y Entitlements en el sitio de Apple Developer.

Hardened Runtime

#

Si eliges distribuir tu aplicación fuera de la App Store, debes notarizar tu aplicación para garantizar la compatibilidad con macOS. Esto requiere habilitar la opción Hardened Runtime. Una vez habilitada, necesitarás un certificado de firma válido para compilar.

Por defecto, el archivo de entitlements permite JIT para compilaciones debug pero, al igual que con el App Sandbox, es posible que debas gestionar otros entitlements. Si tienes habilitados tanto el App Sandbox como el Hardened Runtime, es posible que debas añadir múltiples entitlements para el mismo recurso. Por ejemplo, el acceso al micrófono requeriría tanto com.apple.security.device.audio-input (para Hardened Runtime) como com.apple.security.device.microphone (para App Sandbox).

Para obtener más información sobre este tema, consulta Hardened Runtime en el sitio de Apple Developer.