Como cambiar tu Info.plist usando Swfit

Feb/6 By

En un proyecto que estoy trabajando en estos momentos, necesitaba sobre escribir algunas configuraciones de un plist global en los diferentes Info.plist de mis tragets. Nuestro proyecto tiene varios targets en estos momentos y hay algunas configuraciones que queremos que se mantengan igual en todos ellos, pero estar actualizando las listas de información de cada uno cuando necesitamos hacer un cambio, no es la mejor forma de hacerlo. Busqué alguna forma simple de hacer esto y no encontré buenas respuestas o no cubrían exactamente mis necesidades. Así que decidí probar distintas formas y aquí les presento las dos que encontré, una es la forma fácil pero sucia y la otra es la forma más elegante.

Forma fácil – Configuraciones definidas por el usuario

La forma más fácil de hacer esto es usando las User-Defined settings en el proyecto. Después en nuestros Info.plist lo único que tenemos que hacer es definir la configuración de la que vamos a heredar.

Después de eso, selecciona el botón de más en seguida de Levels, y escoge la opción de Add User-Defined Setting en el menú.

Verás que una nueva configuración aparece en la sección de User-Defined, donde podrás escoger el nombre que vas a utilizar en tu plist. No hay ninguna convención sobre como escribir estos nombre pero yo prefiero usar mayúsculas y guiones bajos, por ejemplo vamos a definir BUNDLE_DISPLAY_NAME.

Después, tenemos que ir a nuestro Info.plist que queremos cambiar y definir esta configuración.

Y ya, la próxima vez que corras tu proyecto se utilizará la configuración que se definió en el proyecto.

Esta solución también sirve para cuando quieres utilizar diferentes nombres, versiones o configuraciones dependiendo de tus schemes y targets.

Forma elegante – Script de Swift

Existe otra forma, una forma más elegante de hacerlo. creando un script de Swift que defina estas variables (leyendo de otra lista o hardcodéando los datos) y agregándolo como una fase de ejecución.

De hecho, esta solución se puede hacer con cualquier lenguaje de programación, pero yo quise implementarlo utilizando Swift para mejorar mi conocimiento del lenguaje fuera de iOS. Para este caso utilizaré Swift 4.

Primero necesitamos crear el archivo, prefiero mantenerlo fuera del proyecto en si, porque en realidad no modifica nada del comportamiento de nuestra app.

Si quieres saltar directamente a la solución, aquí está el gist con la solución final de este tutorial.

Lo primero que tenemos que hacer es la configuración del script.

Lo primero es importar el SDK de macOS si estamos trabajando con iOS o Apple Watch. Si tu proyecto es de macOS puedes ignorar esta linea de código. También necesitamos importar Foundation ya que utilizaremos FileManager para leer y escribir las listas.

Vamos a crear una constante llamada relativePlistFilesFolder para definir el directorio donde estarán nuestros archivos de información, recuerda que tienes que usar la ruta real de tu archivo y no la relativa del proyecto.

Por último definimos currentDirectoryPath como una constante para ahorrarnos el estar llamado el método.

Primero vamos a crear el método para leer los archivos Plist.

Vamos a recibir la ruta como un string, leer el archivo y regresar un diccionario con la información de la lista. Tenemos que utilizar Any, ya que la lista utiliza diferentes clases para definir la información. En caso de que no se encuentre el archivo, vamos a regresar un diccionario vacío.

Después, vamos a obtener la información del plist y transformarla en un diccionario. Utilizaremos la clase PropertyListSerialization para leer el archivo. Como este método puede generar un error, tenemos que poner este código dentro de un bloque do-catch (o podríamos forzar el try utilizando el signo de admiración  try! ), y regresar un archivo vacío en caso de que algo haya fallado o la información en caso de que todo haya salido bien.

Ahora vamos a definir nuestro método de escritura.

Este método es bastante simple, vamos a hacer un casting de nuestro diccionario a un  NSDictionary  para poder aprovechar el método de write de esta clase, también vamos a recibir la ruta donde vamos a escribir en forma de string y por último regresar true o false dependiendo de si tuvimos éxito al escribir el archivo o no.

Lo primero que vamos a hacer es revisar si el archivo existe, en caso de que no exista regresamos falso porque entonces algo hicimos mal al definir la ruta de nuestra lista.

Después vamos a llamar el método de escritura de NSDictionary en la ruta que definimos antes para sobre escribir el archivo. Este método hará el trabajo de convertir el diccionario en un archivo de tipo plist.

Por último, vamos a utilizar estos métodos para sobre escribir nuestro archivo.

Si quieres escribir o leer las configuraciones de Xcode (como Bundle name, Bundle version) recuerda utilizar las llaves raw, por ejemplo Bundle Version es en realidad CFBundleVersion. Para ver estas llaves tenemos que ir a nuestro archivo Info.plist en Xcode y dar click secundario para abrir el menú y seleccionar la opción.

También puedes crear tus propias llaves para utilizar después en tu código, éstas serán escritas en tu nuevo archivo.

Ya nada más tenemos que llamar nuestro método de escritura y regresar un error si algo salió mal.

El último paso es añadir este script como una fase de nuestro build para cada target.

Para hacer esto, tenemos que ir a la configuración de nuestro target, seleccionar la pestaña de Build Phases y luego dar click en el botón de más para seleccionar la opción New Run Script Phase.

Después de eso, se creará una nueva fase que debemos subir a la primera posición y después definir la ruta a nuestro archivo Swift.

Y ya, eso es todo. Haz un build de tu proyecto y veras como tu Info.plist cambiará las variables que definimos en el script.

Puedes encontrar el código completo aquí.

 

Espero que el tutorial les sea útil para sus proyectos. Si ven algún error o algo que se pudiera mejorar, por favor díganmelo en los comentarios.

¡Gracias y feliz swifteo!

Nuevos blogs

May/16 By

Acabo de empezar a trabajar en dos nuevos blogs en Medium.

  • Shanghai LivingDonde pienso compartir cosas interesantes sobre mi vida en Shanghai. En septiembre del 2016 decidí mudarme a la oficina en Shanghai de ReignDesign. Hace una semana decidí que quiero empezar a compartir con ustedes mis experiencias e ideas de mi vida diaria en China.
  • Lost Facts. Soy una persona muy curiosa, entonces quise abrir un espacio donde pueda compartir datos curiosos, cosas interesantes, pensamientos sobre cosas nuevas, reseñas de productos que he usado y otras cosas que no sepa bien donde poner.

Escribir siempre ha sido una de mis pasiones más grandes, así que quiero continuar haciéndolo ahora que tal vez tenga cosas de que hablar todos los días. Medium ha sido una gran plataforma para hacer esto y en los últimos meses he tenido esta idea en mi cabeza, así que creo que ahora es la mejor oportunidad para empezar.

Los invito a compartir, dar like, comentar o corregir las historias si encuentran algo interesante.

Agregar tus propios snippets a Xcode

May/8 By

Todos hemos estado ahí. Ese momento en el que por enésima vez buscas ese pedazo de código en tus viejos proyectos para hacer una cosa y que por algún motivo no logras memorizas, así que sólo haces copy paste de lo que tienes en tus otros proyectos y sigues trabajando como si nada. Si tan sólo Xcode tuviera alguna función que hiciera esto por ti sin necesidad de tener que buscar en viejos proyectos.

Bueno aquí es donde la sección de Code Snippets entra en acción. Una de las herramientas más importantes pero menos conocidas de Xcode.

En mi caso siempre me sucede cuando quiero hacer algo en background en Swift, que por algún motivo no ha logrado pegarse en mi memoria como otras cosas en Swift. Por eso cree un snippet que me ayudara con esto, así que ahora lo único que tengo que hacer es empezar a escribir “backgroundThreading” y dar enter para que mi pedazo de código aparezca y seguir trabajando.

Para acceder a librería de snippets tienes que activar la barra lateral derecha en Xcode.

Luego al fondo das click en la segunda opción.

Ésta es la manera más sencilla de hacer tus propios snippets.

Primero tienes que escribir el pedazo de código que quieres en tu snippet, justo como te gustaría que apareciera cada vez. En mi caso es esto:

Hasta donde sé es la manera más simple de realizar algo en el background y después llamar al hilo principal en Swift 3.

Una vez que haces eso sólo tienes que seleccionar tu código y arrastrarlo a la sección de snippets en la barra.

Cuando lo sueltes aparecerá una ventana que te pedirá cierta información.

  • Title El nombre del snippet que estás creando
  • Summary Una descripción breve de que es lo que hace el código
  • Platform Por defecto está seleccionado All, pero puedes escoger entre iOS, macOS, tvOS y watchOS. Dependiendo de la configuración de tu proyecto Xcode mostrará u ocultará los snippets correspondientes.
  • Language Puedes escoger entre una gran variedad de lenguajes, por defecto tomará el del archivo que tengas abierto en ese momento.
  • Completion Shortcut La palabra o palabras que quieres empezar a escribir para que Xcode te autocomplete con tu código.
  • Completion Scopes Esto define en que momento Xcode te mostrará el auto completado o no.

Después de eso sólo das click en Done y listo, ya tienes tu nuevo snippet en la librería. Aparecerá una bandera de “User” para reconocer tus snippets propios. Para utilizarlo sólo das click en él y automáticamente aparecerá en tu código.

Pero la forma más sencilla de utilizarlo es sólo empezar a escribir la palabra clave que definiste y dar click para que aparezca el código.

Y eso es todo, ya estás listo para seguir programando de manera sencilla y menos propenda a errores.

@IBDesignable and @IBInspectable

Nov/29 By

Creo que mucho se ha escrito sobre las propiedades @IBInspectable y @IBDesignable, pero la verdad es que no es tan sencillo encontrar algún ejemplo simple de como usarlas en Swift.

@IBInspectable es una propiedad que puede ser asignada a las variables de UIViews personalizadas para poder editar y asignar estos valores desde el Interface Builder. Cada variable que utilice este prefijo aparecerá en el Storyboard como si fuera uno atributo más, siempre y cuando utilice alguna de las clases disponibles para esto, que son String, Boolean, Numbers, CGSize, CGRect, CGPoint, UIColor UIIMage and NSRange.

Screen Shot 2016-11-22 at 16.39.13

@IBInspectable especifica a Xcode que debe compilar nuestra clase cuando sea utilizada en el Storyboard y de esta manera reflejar los cambios a tiempo real.

Creo que hay bastante documentación e información al respecto en internet, por lo que lo único que quiero hacer es proporcionar una plantilla sencilla de usar que está lista para funcionar y que sirva de base para ustedes para generar sus propias clases más completas. Sin más preámbulo aquí está. La clase sólo asigna valores para el redondeo de esquinas, ancho y color de borde.

El principio de todo

Feb/17 By

Hola.

Bienvenidos a mi página personal. Espero poder actualizar esto de vez en cuando sobre mis nuevas experiencias como Product Manager.

Tengo poco tiempo siendo Product Manager pero en ese poco tiempo he descubierto que es una de las profesiones más interesantes que existen, por lo que estoy seguro que es el camino que quiero tomar como profesionista.

Un poco sobre mi.

Soy egresado del Tecnológico de Monterrey, catalogada como la mejor universidad de México, de la carrera de Ingeniería en Tecnologías de la Información y Comunicaciones con especialidad en Dispositivos Móviles.

Actualmente trabajo en una empresa de desarrollo de software a la medida como administrador de productos llamada Intelectix, ubicada en la ciudad de Chihuahua, Chihuahua, México.

Como desarrollador iOS tengo 2+ años trabajando como freelancer y a este momento tengo dos aplicaciones en la App Store y estoy terminando la tercera.

Me considero un buen geek y en mis tiempos libres me gusta el desarrollo de iOS e investigar sobre nuevas tecnologías.

También me gusta escribir, he mantenido un blog personal de temas varios desde que tengo 15 años y escribo para la revista deportiva digital www.adndeportivo.com, soy editor de las secciones de Tecnología y Videojuegos.

Uno de mis hobbies a los que dedico más tiempo es el teatro, llevo participando en distintas obras en seis diferentes ciudades del país y he tenido la oportunidad de estar en el escenario más de 15 veces.

Voy a tratar de actualizar esta página regularmente con temas que puedan interesarles sobre el Product Management y todo lo que lo rodea.

¡Gracias por su vista!

Simple Business by Nimbus Themes
Powered by WordPress