Cómo agregar recursos usando SPM

A partir de Xcode 12 podemos agregar recursos a nuestros paquetes de Swift Package Manager.

Sin embargo, hay unas cuantas cosas que debemos tener en cuenta:

  • Tus recursos deben estar dentro del directorio Sources de tu paquete.
  • Si el paquete es un comand-line tool, los archivos requeridos deben instalarse junto con el ejecutable. Si es para aplicaciones no tienes que hacer nada.
  • Archivos conocidos por Xcode como .xcassets, .storyboard, .xib, .xcdatamodel son optimizados por Xcode automáticamente al momento de compilar.
  • Para otros tipos de archivos, por ejemplo .json, .png, debes indicar como deseas que sea manejados, hay dos opciones process y copy.

Más acerca de .process y .copy

process(_:localization:) y copy(_:) son dos métodos estáticos de Resource.

  • process(_:localization:), usará las reglas que existan para la plataforma en cuestión, por ejemplo, comprimir los archivos .xcasset cuando sea posible. También notamos que acepta localization como parámetro, esto nos permite pasar explícitamente que localización queremos para el recurso.
  • copy(_:), no hace ninguna transformación y copia el archivo tal cual. Debes tener en cuenta que si usas copy(_:), no se usarán ninguna de las reglas disponibles para la plataforma. Esto aplica también para directorios completos.
  • Se recomienda usar siempre process(_:localization:), porque en dado casi no haya ninguna optimización disponible se utilizaría copy(_:).

Pasos para agregar recursos

  1. En el manifiesto Package.swift busca el target donde deseas agregar los archivos y agrega el parámetro resources. Este parámetro acepta un arreglo de objetos tipo Resource.
  2. Indicamos en el arreglo todos los archivos usando process(_:localization:) o copy(_:).
  3. Recuerda que también puedes agregar directorios completos, por ejemplo, .copy("Directorio")

Cómo excluir recursos

En caso de querer indicar cuales recursos no deberían estar incluidos, podemos usar exclude. Es otro parámetro de .target al igual que resources, pero en vez de aceptar un arreglo de Resources, acepta un arreglo de Strings. Este también nos permite excluir directorios, por ejemplo: exclude: ["imagen.png", "DirectorioExcluido"]

Aquí estamos excluyendo el archivo imagen.png y todo lo que esté en el directorio DirectorioExcluido.

Cómo usar recursos

Cuando agreguemos recursos a un target, Xcode automáticamente creará una extensión a Bundle para agregar la variable estática module. Esto nos permitirá acceder a nuestros recursos, por ejemplo, para mostrar una imagen: Image("logo", bundle: Bundle.module).

También podemos usar: Bundle.module.url(forResource: "config", withExtension: "plist").

En este caso para obtener un archivo .plist llamado config.

No debes utilizar cosas como Bundle.main para acceder a tus recursos, ya que no está garantizado que funcione. Bundle.module hace la búsqueda en todos los directorios posibles incluyendo Bundle.main.resourceURL y Bundle.main.bundleURL.

Ejemplo de un target con recursos agregados y excluidos

Para recapitular veamos un ejemplo en el que agregamos y excluimos recursos:

.target(
name: "MyPackage",
exclude: ["ExcludedFiles"],
resources: [
.process("Resources"),
.copy("background.png"),
]
)

En este caso indicamos que:

  • Todos los archivos dentro del directorio ExcludedFiles deben ser excluidos.
  • Queremos incluir los recursos dentro del directorio Resources y que estos deben ser procesados utilizando las reglas de Xcode para optimización.
  • Que queremos copiar el archivo background.png sin ninguna optimización.

Comparte este artículo

Subscríbete a nuestro Newsletter

Mantente al día en el mundo de las aplicaciones móviles con nuestro blog especializado.

Artículos semanales

Todas las semanas artículos nuevos sobre el mundo de las aplicaciones móviles.

No spam

No te enviaremos spam, solo contenido de calidad. Puedes darte de baja cuando quieras.

Contenido de calidad

Nada de contenido generado de manera automática usando ChatGPT.

Recomendaciones

Tips indispensables sobre mejores prácticas y metodologías.

© 2024 AsyncLearn