Las listas de propiedades son esencialmente archivos XML con extensión .plist. Así es como editarlos utilizando la línea de comandos en la aplicación Terminal de macOS.
XML es un formato de datos abierto que ganó popularidad a mediados de la década de 1990 cuando Internet se comercializó por primera vez. Es un formato basado en texto que utiliza pares clave/valor para almacenar datos. Las claves proporcionan etiquetas de datos, y los valores almacenan los datos relacionados con cada clave.
Los tipos de datos en XML incluyen booleanos (verdadero/falso), números, fechas, cadenas (texto), matrices, diccionarios y datos simples. Un diccionario es simplemente una tabla combinada de valores también con su propio conjunto de claves, una para cada elemento de datos.
Al combinar e incrustar estos tipos de datos en un archivo XML, puedes almacenar una variedad de datos anidados para casi cualquier cosa. Si bien XML generalmente se almacena como texto plano, también se ha convertido en un estándar para el intercambio de datos de información en Internet, aunque hoy en día ha sido reemplazado en su mayoría por JSON (Notación de Objetos de JavaScript), que es algo similar.
XML en plataformas de Apple
Cuando se lanzó la primera versión de Mac OS X en 2000, Apple dejó en claro que estaba adoptando XML como formato de archivo para gran parte del sistema operativo Mac. Apple utiliza un formato de archivo nativo llamado Listas de Propiedades (.plist), que es XML simple con algo de información de encabezado personalizada de Apple en la parte superior de cada archivo.
Puede que hayas visto archivos .plist en las carpetas de Preferencias de tu macOS en /Library/Preferences, o ~/Library/Preferences. Estos son archivos XML simples que contienen listas de datos XML que pueden ser leídos por aplicaciones o por el propio macOS para almacenar preferencias.
Por ejemplo, el archivo de configuración del Finder de macOS se encuentra en la carpeta Preferencias y se llama com.apple.Finder.plist. La mayoría de los archivos de configuración .plist utilizan este tipo de notación DNS inversa: el segundo componente en el nombre del archivo identifica a la empresa que hace el software, luego el nombre de la aplicación, y luego la extensión .plist.
Puedes abrir un archivo .plist en la aplicación TextEdit de Apple para leerlo como texto sin formato, o puedes abrirlo en el IDE de desarrollo de Apple, Xcode, o en casi cualquier otra aplicación de editor de texto.
Xcode tiene una función de formato especial que muestra un archivo .plist como un editor de tabla con cada tipo de datos en una fila que contiene el tipo de datos y su clave. Al hacer clic en un menú emergente junto a cada elemento en la tabla, puedes cambiar su tipo a cualquier tipo de datos formateados conocidos.
Los datos .plist de tipos genéricos, desconocidos u opacos se tratan como un conjunto de datos, o en el caso de la programación de plataformas de Apple, un tipo de datos de Datos (en Swift) o NSData en Objective-C.
Las aplicaciones también incluyen archivos .plist en macOS, iOS, iPadOS y watchOS tanto para describir aplicaciones como para almacenar contenido. Por ejemplo, el archivo Info.plist describe cada aplicación y sus capacidades al sistema operativo.
Existen API del sistema en los sistemas operativos de Apple para transformar y serializar XML y .plist hacia y desde otros formatos de datos.
Editando listas de propiedades
Como se mencionó, puedes editar archivos .plist directamente abriéndolos en un editor de texto simple o en Xcode.
Si abres un archivo .plist en TextEdit, por ejemplo, verás XML sin formato con etiquetas. Para cambiar los datos de un archivo .plist en un editor de texto, deberás entender las etiquetas XML y cómo funcionan. Las etiquetas XML son muy similares a las etiquetas HTML.
En Xcode, simplemente puedes abrir un archivo .plist, o agregarlo a una ventana de proyecto de Xcode y luego hacer clic único en el Proyecto Navegador a la izquierda. Esto mostrará el contenido del .plist en el panel de la derecha:
Editar un archivo .plist en Xcode.
La ventana anterior muestra el archivo version.plist para la aplicación Chess de Apple: cada fila es un elemento de datos, las claves de cada elemento se enumeran en la columna de la izquierda, cada tipo de datos se muestra en la columna central y el valor de cada clave en la columna de la derecha.
Para cambiar los datos de un archivo .plist en Xcode, puedes hacer clic único en los datos o clave de una fila e ingresar nueva información, o hacer clic en el pequeño menú emergente en la columna central de la fila para cambiar su tipo. En el menú emergente se enumeran solo tipos de datos de .plist conocidos y permitidos.
Una vez que hayas realizado todos los cambios que desees, simplemente Guardar el archivo .plist (o presionar Comando-S en tu teclado).
Una gran ventaja de XML es que puedes editar los archivos en cualquier plataforma, guardarlos y luego copiarlos entre computadoras sin tener que convertirlos. La localización de software a menudo se hace de esta manera, con cadenas de texto almacenadas en archivos .strings para su traducción entre idiomas. Los archivos de cadenas también contienen XML estándar que utiliza pares clave/valor.
Los archivos InfoPlist.strings que se incluyen en las aplicaciones contienen versiones localizadas de las cadenas que se encuentran en la información descriptiva para identificar una aplicación. Este es el texto que aparece, por ejemplo, cuando haces clic en Obtener Información en una aplicación en el Finder.
Más recientemente, un archivo version.plist incluido dentro de cada aplicación puede contener la información de versiones de la aplicación almacenada en formato XML utilizando claves de Apple como CFBundleVersion y CFBundleShortVersionString.
Apple tiene una sección en la documentación para desarrolladores que discute las listas de propiedades de información.
El prefijo “CF” en las claves .plist de Apple representa Core Foundation, una API basada en C utilizada para manipular tipos de datos base y .plists en las plataformas de Apple.
Archivos de cadenas en el desarrollo de plataformas de Apple
En el desarrollo de Apple, las cadenas a menudo se almacenan en un archivo .strings o una tabla de cadenas para la localización. Los desarrolladores pueden subcontratar sus archivos de cadenas para la localización a empresas de traducción para que no tengan que hacer la traducción.
Si miras dentro de un paquete de aplicaciones, es posible que veas varios archivos .strings almacenados en carpetas de idiomas, siendo cada carpeta finalizada en “.lproj” y con un prefijo de dos caracteres estándar de ISO para el nombre del país. Al duplicar y cambiar el contenido de cada versión de archivos de cadenas, los desarrolladores pueden agregar nuevos idiomas a las interfaces de las aplicaciones sin tener que conocer los idiomas.
macOS e iOS son lo suficientemente inteligentes como para cargar el archivo de cadenas localizado correcto para el idioma actual que se esté utilizando en un dispositivo de Apple.
Al utilizar archivos de cadenas y .plist por separado, la interfaz de usuario de una aplicación puede cambiarse en tiempo de ejecución o posteriormente, sin tener que compilar el texto en el código binario de la aplicación. Esto se conoce como Carga Dinámica.
Por eso puedes cambiar el idioma del sistema en Configuración en un dispositivo de Apple y hacer que la misma aplicación actualice su texto de interfaz de usuario para el nuevo idioma seleccionado. En los sistemas operativos más antiguos, los proveedores tenían que distribuir versiones específicas de la aplicación para cada país o idioma.
La Carga Dinámica también reduce la huella de memoria de una aplicación en tiempo de ejecución, ya que las cadenas no se cargan en la memoria hasta que se utilizan realmente.
Puedes obtener más información sobre los formatos y tipos de CF de .plist en Terminal escribiendo “man plist”.
Editando listas de propiedades en Terminal
macOS incluye una aplicación Terminal (shell) (UNIX) que te permite emitir comandos en la línea de comandos para realizar acciones. Uno de los usos más potentes de Terminal es el procesamiento por lotes y la escritura de scripts para automatizar procesos.
Muchos comandos de Terminal incluyen una bandera -r (recursiva) para indicarle al comando que siga procesando todos los archivos que encuentre en una carpeta dada sin importar cuán profundamente estén anidados esos archivos.
Puedes utilizar Terminal tanto para procesar manual como automáticamente archivos .plist y .strings para una edición más rápida.
Esto puede ahorrarte tiempo, por ejemplo, si tienes un conjunto de archivos para múltiples idiomas y deseas reemplazar todos sus valores con nuevos textos localizados de tablas de idiomas u otras entradas. O quizás deseas cambiar todas las claves para un cierto elemento en un conjunto de archivos a la vez sin tener que editar cada archivo manualmente.
No entraremos en la automatización de scripts de shell en este artículo, pero hay muchos buenos libros y tutoriales en línea para escribir scripts de shell para el procesamiento por lotes.
Mac OS solía venir en cajas
Editando una lista de propiedades en Terminal manualmente
Para editar un archivo .plist en Terminal, utiliza el comando integrado defaults. defaults te permite editar y ver archivos .plist, así como configurar ajustes del sistema para archivos .plist del sistema operativo conocidos utilizando nombres.
Para ver el uso completo de los comandos defaults, en Terminal escribe:
man defaults y presiona Enter en tu teclado.
Para salir del sistema man en Terminal, presiona Control-Z.
La opción principal para defaults para cambiar un valor en un archivo .plist existente es la opción de escritura seguida de los nuevos datos que se van a escribir.
Como menciona la página de man, los nuevos datos deben estar en un formato específico (generalmente otro .plist o un diccionario) y deben contener las claves y valores a escribir. El formato de estos datos debe ser exacto o de lo contrario el comando puede fallar o los datos del archivo podrían corromperse.
Por ejemplo, la página de man demuestra cambiar una matriz en un .plist que tiene un nombre de “Color Predeterminado” a un nuevo valor de (255,0,0). Para hacer esto, usarías el comando:
defaults write com.nombreempresa.nombredelaaplicación “Color Predeterminado” ‘(255, 0, 0)’
Donde “nombredelaaplicación” es el nombre de la aplicación para la empresa “nombreempresa”.
También puedes sobrescribir los valores existentes en un archivo .plist con otro .plist. Por ejemplo:
defaults write com.nombreempresa.nombredelaaplicación ‘{ “Color Predeterminado” = (255, 0, 0); “Fuente Predeterminada” = Helvetica; }’;
En este ejemplo, los nuevos datos del .plist están encerrados entre llaves e incluyen dos pares clave/valor: “Color Predeterminado” y “Fuente Predeterminada”.
Ten cuidado al escribir en archivos de ajustes existentes porque si corrompes los datos en un archivo .plist utilizado por macOS, tu Mac puede dejar de funcionar correctamente.
También existen opciones de eliminar para defaults, pero debes tener en cuenta que eliminar es aún más peligroso que la opción de escritura. Algunas de las opciones de eliminación destruyen datos e incluso pueden eliminar todos los datos en un dominio con un solo comando.
Puedes imprimir una lista de todos los dominios en tu Mac utilizando la opción de dominios:
Puedes obtener más información sobre los formatos de .plist en Terminal escribiendo “man plist”.
Editando un archivo de lista de propiedades fuera de un dominio de ajustes
Para editar cualquier archivo .plist arbitrario ubicado en cualquier ubicación escribible en el sistema de archivos, utiliza la opción de ruta del archivo. Esto te permite editar un archivo .plist de la misma manera que lo hiciste anteriormente para archivos de ajustes, pero para cualquier archivo .plist en cualquier ruta dada. filepath también funciona con el comando de lectura.
defaults read ~/Library/Containers/com.apple.TextEdit/Data/Library/Preferences/com.apple.TextEdit.plist
lee el archivo de ajustes de la aplicación TextEdit ubicado en la carpeta Biblioteca del usuario.
Pero la opción de ruta de archivo funciona para cualquier archivo .plist, no solo para archivos de ajustes o archivos pertenecientes a aplicaciones.
Al escribir y combinar comandos de defaults en un archivo de script automatizado, puedes ver lo fácil que sería procesar por lotes archivos .plist sin mucho esfuerzo.
De hecho, mucho software de Apple de terceros está construido de esta manera: por lo general, un ingeniero de compilación escribe scripts de automatización para recuperar un código base de un servidor, procesar por lotes archivos .plist y cadenas localizados, luego ejecutar compilaciones en todos los componentes de software. Las compilaciones normalmente se postprocesan utilizando otro conjunto de archivos de script para ensamblar el software final para su lanzamiento.
El comando defaults también tiene opciones para agregar o reemplazar tipos específicos de datos en un archivo .plist.
El sistema de defaults ha existido en macOS, Mac OS X e iOS durante décadas y de hecho fue una de las tecnologías originales utilizadas en NeXTStep, el precursor de la mayoría de los sistemas operativos de Apple en la actualidad.
Una vez que domines el sistema defaults, descubrirás que lo usarás mucho para inspeccionar y cambiar ajustes de macOS y para editar archivos .plist. Solo asegúrate de estar cómodo y seguro antes de usarlo.
Apple tiene una sección breve en la Guía del Usuario de Terminal que describe cómo utilizar el sistema defaults para editar archivos .plist y ajustes.
Si utilizas una computadora con Windows, echa un vistazo a las herramientas de edición de XML realmente geniales hechas por Altova.