Saltar al contenido principal

Integrar un módulo Flutter en tu proyecto iOS (Heredado)

Aprende cómo integrar un módulo Flutter en tu proyecto iOS existente.

Los componentes de la UI de Flutter se pueden añadir de forma gradual a tu aplicación iOS existente como frameworks embebidos. Para embeber Flutter en tu aplicación existente, considera uno de los siguientes tres métodos.

Método de embebidoMetodologíaBeneficio
Usar CocoaPods (Recomendado) Instala y utiliza el SDK de Flutter y CocoaPods. Flutter compila el flutter_module desde el código fuente cada vez que Xcode compila la aplicación iOS. El método menos complicado para embeber Flutter en tu aplicación.
Usar frameworks de iOS Crear frameworks de iOS para los componentes de Flutter, embeberlos en tu aplicación iOS y actualizar los ajustes de compilación (build settings) de tu aplicación existente. No requiere que cada desarrollador instale el SDK de Flutter y CocoaPods en sus máquinas locales.
Usar frameworks de iOS y CocoaPods Embeber los frameworks para tu aplicación iOS y los plugins en Xcode, pero distribuir el motor de Flutter como un podspec de CocoaPods. Proporciona una alternativa a la distribución de la gran biblioteca del motor de Flutter ( Flutter.xcframework ).

Cuando añades Flutter a tu aplicación iOS existente, esto incrementa el tamaño de tu aplicación iOS.

Para ver ejemplos que utilizan una aplicación creada con UIKit, consulta los directorios de iOS en los ejemplos de código de add_to_app. Para ver un ejemplo que utiliza SwiftUI, consulta el directorio de iOS en la aplicación News Feed App.

Requisitos del sistema de desarrollo

#

Flutter requiere la última versión de Xcode y de CocoaPods.

Crear un módulo Flutter

#

Para embeber Flutter en tu aplicación existente con cualquier método, primero crea un módulo Flutter. Utiliza el siguiente comando para crear un módulo Flutter.

cd /path/to/my_flutter
flutter create --template module my_flutter

Flutter crea un proyecto de módulo bajo /path/to/my_flutter/. Si utilizas el método CocoaPods, guarda el módulo en el mismo directorio principal que tu aplicación iOS existente.

Desde el directorio del módulo Flutter, puedes ejecutar los mismos comandos de flutter que en cualquier otro proyecto de Flutter, como flutter run o flutter build ios. También puedes ejecutar el módulo en VS Code o Android Studio/IntelliJ con los plugins de Flutter y Dart. Este proyecto contiene una versión de ejemplo de una sola vista de tu módulo antes de embeberlo en tu aplicación iOS existente. Esto resulta útil al probar las partes de tu código que solo contienen Flutter.

Organizar tu módulo

#

La estructura del directorio del módulo my_flutter se asemeja a una aplicación Flutter típica.

  • my_flutter/
    • .ios/
      • Runner.xcworkspace
      • Flutter/
        • podhelper.rb
    • lib/
      • main.dart
    • test/
    • pubspec.yaml

Tu código Dart debe añadirse al directorio lib/. Tus dependencias, paquetes y plugins de Flutter deben añadirse al archivo pubspec.yaml.

La subcarpeta oculta .ios/ contiene un Xcode workspace donde puedes ejecutar una versión independiente de tu módulo. Este proyecto contenedor prepara tu código Flutter. Contiene scripts de ayuda para facilitar la compilación de frameworks o para embeber el módulo en tu aplicación existente con CocoaPods.

Embeber un módulo Flutter en tu aplicación iOS

#

Una vez que hayas desarrollado tu módulo Flutter, puedes embeberlo utilizando los métodos descritos en la tabla de la parte superior de la página.

Puedes ejecutar en modo Debug en un emulador o un dispositivo real, y en modo Release en un dispositivo real.

Usar CocoaPods y el SDK de Flutter

#

Enfoque

#

Este primer método utiliza CocoaPods para embeber los módulos Flutter. CocoaPods gestiona las dependencias para proyectos de Swift, incluyendo código de Flutter y plugins. Cada vez que Xcode compila la aplicación, CocoaPods embebe los módulos Flutter.

Esto permite una iteración rápida con la versión más actualizada de tu módulo Flutter sin necesidad de ejecutar comandos adicionales fuera de Xcode.

Para obtener más información sobre CocoaPods, consulta la guía de inicio de CocoaPods.

Ver el video

#

Si ver un video te ayuda a aprender, este video cubre cómo añadir Flutter a una aplicación iOS:

Ver en YouTube en una nueva pestaña: "Paso a paso sobre cómo añadir Flutter a una aplicación iOS existente"

Requisitos

#

Cada desarrollador que trabaje en tu proyecto debe tener instalada una versión local del SDK de Flutter y de CocoaPods.

Estructura de proyecto de ejemplo

#

Esta sección asume que tu aplicación existente y el módulo Flutter residen en directorios hermanos. Si tienes una estructura de directorios diferente, ajusta las rutas relativas. La estructura de directorios del ejemplo se asemeja a la siguiente:

  • my_flutter/
    • .ios/
    • Flutter/
      • podhelper.rb
  • MyApp/
    • Podfile

Actualizar tu Podfile

#

Añade tus módulos Flutter a tu archivo de configuración Podfile. Esta sección asume que llamaste a tu aplicación Swift MyApp.

  1. (Opcional) Si tu aplicación existente carece de un archivo de configuración Podfile, navega a la raíz del directorio de tu aplicación. Utiliza el comando pod init para crear el archivo Podfile.

  2. Actualiza tu archivo de configuración Podfile.

    1. Añade las siguientes líneas después de la declaración de la plataforma (platform).

      MyApp/Podfile
      ruby
      flutter_application_path = '../my_flutter'
      load File.join(flutter_application_path, '.ios', 'Flutter', 'podhelper.rb')
      
    2. Para cada target de tu Podfile que necesite embeber Flutter, añade una llamada al método install_all_flutter_pods(flutter_application_path). Añade estas llamadas después de las configuraciones del paso anterior.

      MyApp/Podfile
      ruby
      target 'MyApp' do
        install_all_flutter_pods(flutter_application_path)
      end
      
    3. En el bloque post_install del Podfile, añade una llamada a flutter_post_install(installer). Este bloque debe ser el último bloque en el archivo de configuración Podfile.

      MyApp/Podfile
      ruby
      post_install do |installer|
        flutter_post_install(installer) if defined?(flutter_post_install)
      end
      

Para revisar un ejemplo de Podfile, consulta este ejemplo de Podfile de Flutter.

Embeber tus frameworks

#

En el momento de la compilación, Xcode empaqueta tu código Dart, cada plugin de Flutter, y el motor de Flutter en sus propios paquetes *.xcframework. El script podhelper.rb de CocoaPods embebe estos paquetes *.xcframework en tu proyecto.

  • Flutter.xcframework contiene el motor de Flutter.
  • App.xcframework contiene el código Dart compilado para este proyecto.
  • <plugin>.xcframework contiene un plugin de Flutter.

Para embeber el motor de Flutter, tu código Dart y tus plugins de Flutter en tu aplicación iOS, completa el siguiente procedimiento.

  1. Actualizar tus plugins de Flutter.

    Si cambias las dependencias de Flutter en el archivo pubspec.yaml, ejecuta flutter pub get en el directorio de tu módulo Flutter. Esto actualiza la lista de plugins que lee el script podhelper.rb.

    flutter pub get
    
  2. Embeber los plugins y frameworks con CocoaPods.

    1. Navega al proyecto de tu aplicación iOS en /path/to/MyApp/MyApp.

    2. Utiliza el comando pod install.

      pod install
      

    Las configuraciones de compilación de tu aplicación iOS, Debug y Release, embeben los componentes de Flutter correspondientes para ese modo de compilación.

  3. Compilar el proyecto.

    1. Abre MyApp.xcworkspace en Xcode.

      Verifica que estás abriendo MyApp.xcworkspace y no abriendo MyApp.xcodeproj. El archivo .xcworkspace tiene las dependencias de CocoaPods, el .xcodeproj no las tiene.

    2. Selecciona Product > Build o presiona Cmd + B.

Establecer archivo LLDB Init

#
  1. Generar archivos LLDB de Flutter.

    1. Dentro de tu aplicación Flutter, ejecuta lo siguiente:
    flutter build ios --config-only
    

    Esto generará los archivos LLDB en el directorio .ios/Flutter/ephemeral.

  2. Establecer el archivo LLDB Init.

    1. Ve a Product > Scheme > Edit Scheme.

    2. Selecciona la sección Run en la barra lateral izquierda.

    3. Establece el LLDB Init File utilizando la misma ruta relativa a tu aplicación Flutter que colocaste en tu Podfile en la sección Actualizar tu Podfile.

      $(SRCROOT)/../my_flutter/.ios/Flutter/ephemeral/flutter_lldbinit
      

      Si tu scheme ya tiene un archivo LLDB Init File, puedes añadir el archivo LLDB de Flutter a él. La ruta al archivo LLDB Init de Flutter debe ser relativa a la ubicación del archivo LLDB Init de tu proyecto.

      Por ejemplo, si tu archivo LLDB está ubicado en /path/to/MyApp/.lldbinit, añadirías lo siguiente:

      command source --relative-to-command-file "../my_flutter/.ios/Flutter/ephemeral/flutter_lldbinit"
      

Vincular y embeber frameworks en Xcode

#

Enfoque

#

En este segundo método, edita tu proyecto de Xcode existente, genera los frameworks necesarios y embébelos en tu aplicación. Flutter genera frameworks de iOS para el propio Flutter, para tu código Dart compilado y para cada uno de tus plugins de Flutter. Embebe estos frameworks y actualiza los ajustes de compilación de tu aplicación existente.

Requisitos

#

No se requieren requisitos adicionales de software o hardware para este método. Utiliza este método en los siguientes casos de uso:

  • Los miembros de tu equipo no pueden instalar el SDK de Flutter ni CocoaPods.
  • No deseas usar CocoaPods como gestor de dependencias en aplicaciones iOS existentes.

Limitaciones

#

Flutter no puede manejar dependencias comunes con xcframeworks. Si tanto la aplicación anfitriona como el plugin del módulo Flutter definen la misma dependencia de pod e integras el módulo Flutter utilizando esta opción, se producirán errores. Estos errores incluyen problemas como Multiple commands produce 'CommonDependency.framework'.

Para solucionar este problema, vincula cada origen de plugin en su archivo podspec desde el módulo Flutter al Podfile de la aplicación anfitriona. Vincula el origen en lugar del framework xcframework de los plugins. La siguiente sección explica cómo producir ese framework.

Para evitar el error que ocurre cuando existen dependencias comunes, utiliza flutter build ios-framework con la bandera --no-plugins.

Estructura de proyecto de ejemplo

#

El siguiente ejemplo asume que deseas generar los frameworks en /path/to/MyApp/Flutter/.

flutter build ios-framework --output=/path/to/MyApp/Flutter/

Ejecuta esto cada vez que cambies el código en tu módulo Flutter.

La estructura del proyecto resultante debería asemejarse a este árbol de directorios.

  • /path/to/MyApp/
    • Flutter/
      • Debug/
        • Flutter.xcframework
        • App.xcframework
        • FlutterPluginRegistrant.xcframework(Si tienes plugins con código de la plataforma iOS)
        • example_plugin.xcframework(Un archivo de framework para cada plugin)
      • Profile/
        • Flutter.xcframework
        • App.xcframework
        • FlutterPluginRegistrant.xcframework
        • example_plugin.xcframework
      • Release/
        • Flutter.xcframework
        • App.xcframework
        • FlutterPluginRegistrant.xcframework
        • example_plugin.xcframework

Procedimientos

#

La forma en que vincules, embebas o ambas cosas los frameworks generados en tu aplicación existente en Xcode depende del tipo de framework.

  • Vincular y embeber frameworks dinámicos.
  • Vincula los frameworks estáticos. Nunca los embebas.

Los plugins de Flutter pueden producir frameworks estáticos o dinámicos. Vincula los frameworks estáticos, y nunca los embebas.

Si embebes un framework estático en tu aplicación iOS, no podrás publicar esa aplicación en la App Store. La publicación fallará con un error de archivo Found an unexpected Mach-O header code.

#

Para vincular los frameworks necesarios, sigue este procedimiento.

  1. Elige los frameworks a vincular.

    1. En el Project Navigator, haz clic en tu proyecto.

    2. Haz clic en la pestaña Build Phases.

    3. Expande Link Binary With Libraries.

      Expandir la fase de compilación **Link Binary With Libraries** en Xcode

      Expande la fase de compilación Link Binary With Libraries en Xcode

    4. Haz clic en + (signo más).

    5. Haz clic en Add Other... y luego en Add Files....

    6. En el cuadro de diálogo Choose frameworks and libraries to add:, navega al directorio /path/to/MyApp/Flutter/Release/.

    7. Haz clic con Command en los frameworks de ese directorio, luego haz clic en Open.

      Elegir los frameworks a vincular en el cuadro de diálogo **Choose frameworks and libraries to add:** en Xcode

      Elige los frameworks a vincular en el cuadro de diálogo Choose frameworks and libraries to add: en Xcode

  2. Actualizar las rutas a las bibliotecas para tener en cuenta los modos de compilación.

    1. Lanzar el Finder.

    2. Navega al directorio /path/to/MyApp/.

    3. Haz clic derecho en MyApp.xcodeproj y selecciona Show Package Contents.

    4. Abre project.pbxproj con Xcode. El archivo se abre en el editor de texto de Xcode. Esto también bloquea el Project Navigator hasta que cierres el editor de texto.

      El archivo `project-pbxproj` abierto en el editor de texto de Xcode

      El archivo project-pbxproj abierto en el editor de texto de Xcode

    5. Busca las líneas que se asemejen al siguiente texto en la sección /* Begin PBXFileReference section */.

      312885572C1A441C009F74FF /* Flutter.xcframework */ = {
        isa = PBXFileReference;
        expectedSignature = "AppleDeveloperProgram:S8QB4VV633:FLUTTER.IO LLC";
        lastKnownFileType = wrapper.xcframework;
        name = Flutter.xcframework;
        path = Flutter/Release/Flutter.xcframework;
        sourceTree = "<group>";
      };
      312885582C1A441C009F74FF /* App.xcframework */ = {
        isa = PBXFileReference;
        lastKnownFileType = wrapper.xcframework;
        name = App.xcframework;
        path = Flutter/Release/App.xcframework;
        sourceTree = "<group>";
      };
      
    6. Modifica el texto Release resaltado en el paso anterior y cámbialo a $(CONFIGURATION). También encierra la ruta entre comillas.

      312885572C1A441C009F74FF /* Flutter.xcframework */ = {
        isa = PBXFileReference;
        expectedSignature = "AppleDeveloperProgram:S8QB4VV633:FLUTTER.IO LLC";
        lastKnownFileType = wrapper.xcframework;
        name = Flutter.xcframework;
        path = "Flutter/$(CONFIGURATION)/Flutter.xcframework";
        sourceTree = "<group>";
      };
      312885582C1A441C009F74FF /* App.xcframework */ = {
        isa = PBXFileReference;
        lastKnownFileType = wrapper.xcframework;
        name = App.xcframework;
        path = "Flutter/$(CONFIGURATION)/App.xcframework";
        sourceTree = "<group>";
      };
      
  3. Actualizar las rutas de búsqueda (Search Paths).

    1. Haz clic en la pestaña Build Settings.

    2. Navega a Search Paths

    3. Haz doble clic a la derecha de Framework Search Paths.

    4. En el cuadro combinado, haz clic en + (signo más).

    5. Escribe $(inherited) y presiona Enter.

    6. Haz clic en + (signo más).

    7. Escribe $(PROJECT_DIR)/Flutter/$(CONFIGURATION)/ y presiona Enter.

      Actualizar **Framework Search Paths** en Xcode

      Actualizar Framework Search Paths en Xcode

Después de vincular los frameworks, deberían mostrarse en la sección Frameworks, Libraries, and Embedded Content de los ajustes General de tu target.

Embeber los frameworks dinámicos
#

Para embeber tus frameworks dinámicos, completa el siguiente procedimiento.

  1. Navega a General > Frameworks, Libraries, and Embedded Content.

  2. Haz clic en cada uno de tus frameworks dinámicos y selecciona Embed & Sign.

    Seleccionar **Embed & Sign** para cada uno de tus frameworks en Xcode

    Selecciona Embed & Sign para cada uno de tus frameworks en Xcode

    No incluyas ningún framework estático, incluyendo FlutterPluginRegistrant.xcframework.

  3. Haz clic en la pestaña Build Phases.

  4. Expande Embed Frameworks. Tus frameworks dinámicos deberían mostrarse en esa sección.

    La fase de compilación **Embed Frameworks** expandida en Xcode

    La fase de compilación Embed Frameworks expandida en Xcode

  5. Compilar el proyecto.

    1. Abre MyApp.xcworkspace en Xcode.

      Verifica que estás abriendo MyApp.xcworkspace y no abriendo MyApp.xcodeproj. El archivo .xcworkspace tiene las dependencias de CocoaPods, el .xcodeproj no las tiene.

    2. Selecciona Product > Build o presiona Cmd + B.

Establecer archivo LLDB Init

#
  1. Generar archivos LLDB de Flutter.

    1. Dentro de tu aplicación flutter, vuelve a ejecutar el comando flutter build ios-framework si no lo has hecho ya:
    flutter build ios-framework --output=/path/to/MyApp/Flutter/
    

    Esto generará los archivos LLDB en el directorio /path/to/MyApp/Flutter/.

  2. Establecer el archivo LLDB Init.

    1. Ve a Product > Scheme > Edit Scheme.

    2. Selecciona la sección Run en la barra lateral izquierda.

    3. Establece el LLDB Init File en lo siguiente:

      $(PROJECT_DIR)/Flutter/flutter_lldbinit
      

      Si tu scheme ya tiene un archivo LLDB Init File, puedes añadir el archivo LLDB de Flutter a él. La ruta al archivo LLDB Init de Flutter debe ser relativa a la ubicación del archivo LLDB Init de tu proyecto.

      Por ejemplo, si tu archivo LLDB está ubicado en /path/to/MyApp/.lldbinit, añadirías lo siguiente:

      command source --relative-to-command-file "Flutter/flutter_lldbinit"
      

Usar frameworks en Xcode y el framework de Flutter como podspec

#

Enfoque

#

Este método genera Flutter como un podspec de CocoaPods en vez de distribuir el gran Flutter.xcframework a otros desarrolladores, máquinas o sistemas de integración continua. Flutter sigue generando frameworks de iOS para tu código Dart compilado, y para cada uno de tus plugins de Flutter. Embebe estos frameworks y actualiza los ajustes de compilación de tu aplicación existente.

Requisitos

#

No se requieren requisitos adicionales de software o hardware para este método. Utiliza este método en los siguientes casos de uso:

  • Los miembros de tu equipo no pueden instalar el SDK de Flutter ni CocoaPods.
  • No deseas usar CocoaPods como gestor de dependencias en aplicaciones iOS existentes.

Limitaciones

#

Flutter no puede manejar dependencias comunes con xcframeworks. Si tanto la aplicación anfitriona como el plugin del módulo Flutter definen la misma dependencia de pod e integras el módulo Flutter utilizando esta opción, se producirán errores. Estos errores incluyen problemas como Multiple commands produce 'CommonDependency.framework'.

Para solucionar este problema, vincula cada origen de plugin en su archivo podspec desde el módulo Flutter al Podfile de la aplicación anfitriona. Vincula el origen en lugar del framework xcframework de los plugins. La siguiente sección explica cómo producir ese framework.

Para evitar el error que ocurre cuando existen dependencias comunes, utiliza flutter build ios-framework con la bandera --no-plugins.

Este método solo funciona con los canales de lanzamiento beta o stable.

Estructura de proyecto de ejemplo

#

El siguiente ejemplo asume que deseas generar los frameworks en /path/to/MyApp/Flutter/.

flutter build ios-framework --output=/path/to/MyApp/Flutter/

Ejecuta esto cada vez que cambies el código en tu módulo Flutter.

La estructura del proyecto resultante debería asemejarse a este árbol de directorios.

  • /path/to/MyApp/
    • Flutter/
      • Debug/
        • Flutter.xcframework
        • App.xcframework
        • FlutterPluginRegistrant.xcframework(Si tienes plugins con código de la plataforma iOS)
        • example_plugin.xcframework(Un archivo de framework para cada plugin)
      • Profile/
        • Flutter.xcframework
        • App.xcframework
        • FlutterPluginRegistrant.xcframework
        • example_plugin.xcframework
      • Release/
        • Flutter.xcframework
        • App.xcframework
        • FlutterPluginRegistrant.xcframework
        • example_plugin.xcframework

Añadir el motor de Flutter a tu Podfile

#

Las aplicaciones anfitrionas que utilizan CocoaPods pueden añadir el motor de Flutter a su Podfile.

MyApp/Podfile
ruby
pod 'Flutter', :podspec => '/path/to/MyApp/Flutter/[build mode]/Flutter.podspec'
#

Los plugins de Flutter pueden producir frameworks estáticos o dinámicos. Vincula los frameworks estáticos, y nunca los embebas.

Si embebes un framework estático en tu aplicación iOS, no podrás publicar esa aplicación en la App Store. La publicación fallará con un error de archivo Found an unexpected Mach-O header code.

#

Para vincular los frameworks necesarios, sigue este procedimiento.

  1. Elige los frameworks a vincular.

    1. En el Project Navigator, haz clic en tu proyecto.

    2. Haz clic en la pestaña Build Phases.

    3. Expande Link Binary With Libraries.

      Expandir la fase de compilación **Link Binary With Libraries** en Xcode

      Expande la fase de compilación Link Binary With Libraries en Xcode

    4. Haz clic en + (signo más).

    5. Haz clic en Add Other... y luego en Add Files....

    6. En el cuadro de diálogo Choose frameworks and libraries to add:, navega al directorio /path/to/MyApp/Flutter/Release/.

    7. Haz clic con Command en los frameworks de ese directorio, luego haz clic en Open.

      Elegir los frameworks a vincular en el cuadro de diálogo **Choose frameworks and libraries to add:** en Xcode

      Elige los frameworks a vincular en el cuadro de diálogo Choose frameworks and libraries to add: en Xcode

  2. Actualizar las rutas a las bibliotecas para tener en cuenta los modos de compilación.

    1. Lanzar el Finder.

    2. Navega al directorio /path/to/MyApp/.

    3. Haz clic derecho en MyApp.xcodeproj y selecciona Show Package Contents.

    4. Abre project.pbxproj con Xcode. El archivo se abre en el editor de texto de Xcode. Esto también bloquea el Project Navigator hasta que cierres el editor de texto.

      El archivo `project-pbxproj` abierto en el editor de texto de Xcode

      El archivo project-pbxproj abierto en el editor de texto de Xcode

    5. Busca las líneas que se asemejen al siguiente texto en la sección /* Begin PBXFileReference section */.

      312885572C1A441C009F74FF /* Flutter.xcframework */ = {
        isa = PBXFileReference;
        expectedSignature = "AppleDeveloperProgram:S8QB4VV633:FLUTTER.IO LLC";
        lastKnownFileType = wrapper.xcframework;
        name = Flutter.xcframework;
        path = Flutter/Release/Flutter.xcframework;
        sourceTree = "<group>";
      };
      312885582C1A441C009F74FF /* App.xcframework */ = {
        isa = PBXFileReference;
        lastKnownFileType = wrapper.xcframework;
        name = App.xcframework;
        path = Flutter/Release/App.xcframework;
        sourceTree = "<group>";
      };
      
    6. Modifica el texto Release resaltado en el paso anterior y cámbialo a $(CONFIGURATION). También encierra la ruta entre comillas.

      312885572C1A441C009F74FF /* Flutter.xcframework */ = {
        isa = PBXFileReference;
        expectedSignature = "AppleDeveloperProgram:S8QB4VV633:FLUTTER.IO LLC";
        lastKnownFileType = wrapper.xcframework;
        name = Flutter.xcframework;
        path = "Flutter/$(CONFIGURATION)/Flutter.xcframework";
        sourceTree = "<group>";
      };
      312885582C1A441C009F74FF /* App.xcframework */ = {
        isa = PBXFileReference;
        lastKnownFileType = wrapper.xcframework;
        name = App.xcframework;
        path = "Flutter/$(CONFIGURATION)/App.xcframework";
        sourceTree = "<group>";
      };
      
  3. Actualizar las rutas de búsqueda (Search Paths).

    1. Haz clic en la pestaña Build Settings.

    2. Navega a Search Paths

    3. Haz doble clic a la derecha de Framework Search Paths.

    4. En el cuadro combinado, haz clic en + (signo más).

    5. Escribe $(inherited) y presiona Enter.

    6. Haz clic en + (signo más).

    7. Escribe $(PROJECT_DIR)/Flutter/$(CONFIGURATION)/ y presiona Enter.

      Actualizar **Framework Search Paths** en Xcode

      Actualizar Framework Search Paths en Xcode

Después de vincular los frameworks, deberían mostrarse en la sección Frameworks, Libraries, and Embedded Content de los ajustes General de tu target.

Embeber los frameworks dinámicos
#

Para embeber tus frameworks dinámicos, completa el siguiente procedimiento.

  1. Navega a General > Frameworks, Libraries, and Embedded Content.

  2. Haz clic en cada uno de tus frameworks dinámicos y selecciona Embed & Sign.

    Seleccionar **Embed & Sign** para cada uno de tus frameworks en Xcode

    Selecciona Embed & Sign para cada uno de tus frameworks en Xcode

    No incluyas ningún framework estático, incluyendo FlutterPluginRegistrant.xcframework.

  3. Haz clic en la pestaña Build Phases.

  4. Expande Embed Frameworks. Tus frameworks dinámicos deberían mostrarse en esa sección.

    La fase de compilación **Embed Frameworks** expandida en Xcode

    La fase de compilación Embed Frameworks expandida en Xcode

  5. Compilar el proyecto.

    1. Abre MyApp.xcworkspace en Xcode.

      Verifica que estás abriendo MyApp.xcworkspace y no abriendo MyApp.xcodeproj. El archivo .xcworkspace tiene las dependencias de CocoaPods, el .xcodeproj no las tiene.

    2. Selecciona Product > Build o presiona Cmd + B.

Establecer archivo LLDB Init

#
  1. Generar archivos LLDB de Flutter.

    1. Dentro de tu aplicación flutter, vuelve a ejecutar el comando flutter build ios-framework si no lo has hecho ya:
    flutter build ios-framework --output=/path/to/MyApp/Flutter/
    

    Esto generará los archivos LLDB en el directorio /path/to/MyApp/Flutter/.

  2. Establecer el archivo LLDB Init.

    1. Ve a Product > Scheme > Edit Scheme.

    2. Selecciona la sección Run en la barra lateral izquierda.

    3. Establece el LLDB Init File en lo siguiente:

      $(PROJECT_DIR)/Flutter/flutter_lldbinit
      

      Si tu scheme ya tiene un archivo LLDB Init File, puedes añadir el archivo LLDB de Flutter a él. La ruta al archivo LLDB Init de Flutter debe ser relativa a la ubicación del archivo LLDB Init de tu proyecto.

      Por ejemplo, si tu archivo LLDB está ubicado en /path/to/MyApp/.lldbinit, añadirías lo siguiente:

      command source --relative-to-command-file "Flutter/flutter_lldbinit"
      

Establecer permisos de privacidad de red local

#

En iOS 14 y posterior, habilita el servicio DNS multicast de Dart en la versión de Debug de tu aplicación iOS. Esto añade funcionalidades de depuración como hot-reload y DevTools utilizando flutter attach.

Para establecer permisos de privacidad de red local solo en la versión de Debug de tu aplicación, crea un archivo Info.plist independiente por configuración de compilación. Los proyectos de SwiftUI comienzan sin un archivo Info.plist. Si necesitas crear una lista de propiedades, puedes hacerlo a través de Xcode o de un editor de texto. Las siguientes instrucciones asumen los valores predeterminados Debug y Release. Ajusta los nombres según sea necesario en función de las configuraciones de compilación de tu aplicación.

  1. Crear una nueva lista de propiedades.

    1. Abre tu proyecto en Xcode.

    2. En el Project Navigator, haz clic en el nombre del proyecto.

    3. Desde la lista Targets en el panel del Editor, haz clic en tu aplicación.

    4. Haz clic en la pestaña Info.

    5. Expande Custom iOS Target Properties.

    6. Haz clic derecho en la lista y selecciona Add Row.

    7. Desde el menú desplegable, selecciona Bonjour Services. Esto crea una nueva lista de propiedades en el directorio del proyecto llamada Info. Esta se muestra como Info.plist en el Finder.

  2. Cambia el nombre de Info.plist a Info-Debug.plist

    1. Haz clic en el archivo Info en la lista de proyectos a la izquierda.

    2. En el panel de la derecha Identity and Type, cambia el Name de Info.plist a Info-Debug.plist.

  3. Crear una lista de propiedades de lanzamiento.

    1. En el Project Navigator, haz clic en Info-Debug.plist.

    2. Selecciona File > Duplicate.... También puedes presionar Cmd + Shift + S.

    3. En el cuadro de diálogo, establece el campo Save As: como Info-Release.plist y haz clic en Save.

  4. Añade las propiedades necesarias a la lista de propiedades de Debug.

    1. En el Project Navigator, haz clic en Info-Debug.plist.

    2. Añade el valor String _dartVmService._tcp al array Bonjour Services.

    3. (Opcional) Para establecer el texto de diálogo de permiso personalizado deseado, añade la clave Privacy - Local Network Usage Description.

      La lista de propiedades `Info-Debug` con las claves **Bonjour Services** y **Privacy - Local Network Usage Description** agregadas.

      La lista de propiedades Info-Debug con las claves Bonjour Services y Privacy - Local Network Usage Description agregadas

  5. Target para usar diferentes listas de propiedades para diferentes modos de compilación.

    1. En el Project Navigator, haz clic en tu proyecto.

    2. Haz clic en la pestaña Build Settings.

    3. Haz clic en las subpestañas All y Combined.

    4. En la casilla de búsqueda, escribe plist. Esto limita los ajustes a aquellos que incluyen listas de propiedades.

    5. Desplázate por la lista hasta que veas Packaging.

    6. Haz clic en el ajuste Info.plist File.

    7. Cambia el valor de Info.plist File de path/to/Info.plist a path/to/Info-$(CONFIGURATION).plist.

      Actualizar la configuración de compilación de `Info.plist` para usar listas de propiedades específicas del modo de compilación.

      Actualizar la configuración de compilación de Info.plist para usar listas de propiedades específicas del modo de compilación

      Esto se resuelve como la ruta Info-Debug.plist en Debug e Info-Release.plist en Release.

      La configuración de compilación **Info.plist File** actualizada que muestra las variaciones de configuración.

      La configuración de compilación de Info.plist File actualizada que muestra las variaciones de configuración

  6. Elimina la lista de propiedades de Release de las Build Phases.

    1. En el Project Navigator, haz clic en tu proyecto.

    2. Haz clic en la pestaña Build Phases.

    3. Expande Copy Bundle Resources.

    4. Si esta lista incluye Info-Release.plist, haz clic en ella y luego haz clic en el signo - (menos) debajo de ella para eliminar la lista de propiedades de la lista de recursos.

      La fase de compilación **Copy Bundle** mostrando el ajuste **Info-Release.plist**. Elimina este ajuste.

      La fase de compilación Copy Bundle mostrando el ajuste Info-Release.plist. Elimina este ajuste.

  7. La primera pantalla de Flutter que carga tu aplicación en modo Debug te solicitará permiso para acceder a la red local.

    Haz clic en OK.

    (Opcional) Para otorgar el permiso antes de que se cargue la aplicación, habilita Settings > Privacy > Local Network > Tu aplicación.

Mitigar un problema conocido con Macs con Apple Silicon

#

En Macs con Apple Silicon, la aplicación anfitriona compila para un emulador de arm64. Aunque Flutter admite emuladores de arm64, algunos plugins podrían no hacerlo. Si usas uno de estos plugins, podrías ver un error de compilación como Undefined symbols for architecture arm64. Si esto ocurre, excluye arm64 de las arquitecturas de emulador en tu aplicación anfitriona.

  1. En el Project Navigator, haz clic en tu proyecto.

  2. Haz clic en la pestaña Build Settings.

  3. Haz clic en las subpestañas All y Combined.

  4. Bajo Architectures, haz clic en Excluded Architectures.

  5. Expandir para ver las configuraciones de compilación disponibles.

  6. Haz clic en Debug.

  7. Haz clic en el signo + (más).

  8. Selecciona iOS Simulator.

  9. Haz doble clic en la columna de valor para Any iOS Simulator SDK.

  10. Haz clic en el signo + (más).

  11. Escribe arm64 en el cuadro de diálogo Debug > Any iOS Simulator SDK.

    Añadir `arm64` como una arquitectura excluida para tu aplicación

    Añadir arm64 como una arquitectura excluida para tu aplicación

  12. Presiona Esc para cerrar este cuadro de diálogo.

  13. Repite estos pasos para el modo de compilación Release.

  14. Repetir para cualquier target de pruebas unitarias de iOS.

Próximos pasos

#

Ahora puedes añadir una pantalla de Flutter a tu aplicación iOS existente.