Articulo de referencia

Lista de propiedades

.plist "},"uniform type":{"wt":"com.apple.property-list"},"mime":{"wt":"{{code|application/x-plist}}"},"owner":{"wt":"[[Apple Computer]] and [[GNUstep]], formerly [[NeXT]]"},"cr...

En los entornos de programación macOS , iOS , NeXTSTEP y GNUstep , los archivos de lista de propiedades son archivos que almacenan objetos serializados . Los archivos de lista de propiedades utilizan la extensión de archivo .p-list y, por lo tanto, a menudo se les denomina archivos p-list ..plist

Los archivos de lista de propiedades se utilizan a menudo para almacenar la configuración del usuario. También se utilizan para almacenar información sobre paquetes y aplicaciones , una tarea que realizaba la bifurcación de recursos en el antiguo sistema operativo Mac OS.

Las listas de propiedades también se utilizan para cadenas de localización para el desarrollo. Estos archivos utilizan las extensiones .stringso . La primera es una lista de propiedades "reducida" de estilo antiguo que contiene solo un diccionario sin las llaves (ver propertyListFromStringsFileFormat ), [ 1 ] mientras que la segunda es una lista de propiedades completa. Xcode también utiliza una extensión para listas de propiedades de estilo antiguo utilizadas como archivos de proyecto..stringsdict.pbxproj

Representaciones

Dado que los datos representados por las listas de propiedades son algo abstractos , el formato de archivo subyacente puede implementarse de muchas maneras. En concreto, NeXTSTEP utilizó un formato para representar una lista de propiedades, y los posteriores frameworks GNUstep y macOS introdujeron formatos diferentes.

Siguiente paso

En NeXTSTEP , las listas de propiedades se diseñaron para ser legibles por humanos y editadas manualmente, serializadas a ASCII con una sintaxis similar a la de un lenguaje de programación . Este mismo formato fue utilizado por OPENSTEP .

  • Las cadenas se representan en estilo literal de C: "This is a plist string\n"; se permiten cadenas más simples, sin comillas, siempre que consten de caracteres alfanuméricos y uno de _$/:.- .
  • Los datos binarios se representan como: . Los espacios y comentarios entre pares de códigos hexadecimales se ignoran.<[hexadecimal codes in ASCII]>
  • Los arreglos se representan como: ( "1", "2", "3" ). Se toleran las comas finales.
  • Los diccionarios se representan como: { "key" = "value"; ... }. El lado izquierdo debe ser una cadena, pero puede no estar entre comillas.
  • Se permiten comentarios como: /* This is a comment */y // This is a line comment.
  • Al igual que en C, los espacios en blanco generalmente no tienen importancia para la sintaxis. Las sentencias de valor terminan con un punto y coma.

Una limitación del formato original de la lista de propiedades de NeXT es que no podía representar un objeto NSValue (número, booleano, etc.). Como resultado, estos valores debían convertirse a cadena y recuperarse de forma aproximada por la aplicación. [ 2 ] Otra limitación es que no existe una codificación oficial de 8 bits definida. [ 3 ]

La utilidad defaults , introducida en OPENSTEP (1996), permite manipular archivos plist utilizados para almacenar preferencias (conocidos como defaults en NeXTSTEP, de ahí su nombre) desde la línea de comandos a través de su dominio de preferencias. Esta utilidad también permite editar archivos plist arbitrarios. Sustituyó a tres comandos anteriores (dread, dwrite y dremove). [ 4 ]

GNUstep

GNUstep adopta el formato NeXTSTEP, con adiciones para representar los tipos de datos NSValue y NSDate. Las nuevas entradas tipadas tienen la forma < * T ... > , donde T es un código de tipo de una letra. Por ejemplo, un NSValue de booleano YES se representa como < *BY > y los objetos NSDate se representan como . [ 5 ] [ 6 ] Los datos binarios también pueden usar el formato base64 más eficiente como < [ b64... ] > . El problema de 8 bits también se resuelve implícitamente, ya que la mayoría de las implementaciones usan UTF-8.<*DYYYY-MM-DD HH:MM:SS +ZZZZ>

GNUstep también tiene su propio formato binario, NSPropertyListGNUstepBinaryFormat , implementado en NSSerialization . Este formato se define recursivamente como los formatos textuales, con un marcador de tipo de un byte que precede a algunos datos. Se admite una forma de internamiento de cadenas mediante un interruptor shouldBeCompact de la extensión GS . [ 7 ]

En GNUstep se encuentran dos manejadores de plist relativamente independientes: CFPropertyList en libs-core-base (CoreFoundation) y NSPropertyList en libs-base (Foundation Kit). Ambos admiten en cierta medida los formatos binarios y XML utilizados por macOS, pero el segundo es mucho más completo. Por ejemplo, los dos formatos específicos de GNUstep solo se manejan en este último. [ 8 ]

GNUstep proporciona un conjunto de herramientas de línea de comandos plist basadas en NSPropertyList , incluyendo una versión de pl [ 9 ] y defaults . [ 4 ]

macOS

Aunque macOS también puede leer el formato NeXTSTEP, Apple lo deja de lado en favor de dos nuevos formatos propios, uno basado en XML y el otro binario. Apple también cuenta con un formato JSON parcialmente compatible ( NSJSONSerialization ).

Historia

En Mac OS X 10.0 , el formato NeXTSTEP quedó obsoleto y se introdujo un nuevo formato XML , con una DTD pública definida por Apple . El formato XML admite caracteres no ASCII y el almacenamiento de objetos NSValue (que, a diferencia del formato de lista de propiedades ASCII de GNUstep, el formato de lista de propiedades ASCII de Apple no admite). [ 10 ]

Dado que los archivos XML no son el método de almacenamiento más eficiente en cuanto a espacio, Mac OS X 10.2 introdujo un nuevo formato donde los archivos de lista de propiedades se almacenan como archivos binarios. A partir de Mac OS X 10.4 , este es el formato predeterminado para los archivos de preferencias. En Mac OS X 10.7 , se introdujo la compatibilidad con la lectura y escritura de archivos en formato JSON . Sin embargo, JSON y las listas de propiedades no son totalmente compatibles entre sí. Por ejemplo, las listas de propiedades tienen tipos de datos y fechas nativos que el formato JSON no admite. Por el contrario, JSON permite nullvalores nulos, mientras que las listas de propiedades no admiten valores nulos explícitos.

Estampación

La antigua herramienta de configuración predeterminada de NeXTSTEP sigue estando disponible. El comando /usr/libexec/PlistBuddy proporciona un editor interactivo de archivos plist. También se puede automatizar mediante scripts. [ 11 ]

La utilidad plutil (introducida en Mac OS X 10.2 ) permite comprobar la sintaxis de las listas de propiedades o convertir un archivo de lista de propiedades de un formato a otro. También admite la conversión de listas de propiedades a literales de objetos de Objective-C o Swift. [ 12 ] Al igual que la NSPropertyListSerialization de Cocoa en la que se basa, acepta entradas de estilo antiguo, pero no las convierte a este tipo. (La NSSerializer de Cocoa anterior a Mac OS X 10.2 genera una salida de estilo antiguo).

La utilidad pl se introdujo en Mac OS X v10.5. Toma cualquier entrada e intenta generar plists de "estilo antiguo". [ 13 ] [ a ] ​​Al igual que la versión de GNUstep, parece usar la propiedad description de los tipos Foundation que se encuentran en los plists, que Apple ha especificado para producir plists de estilo antiguo válidos. [ b ]

En cuanto a su funcionamiento interno, Apple proporciona un analizador sintáctico de código abierto para formatos antiguos, XML y binarios en su código C Core Foundation, denominado CFPropertyList. Sin embargo, todas las utilidades y la mayor parte del sistema utilizan el analizador sintáctico de código cerrado NSPropertyList del Obj-C Foundation Kit. La reimplementación en Swift es de código abierto, pero no se garantiza que sea idéntica.

Formato

Las listas de propiedades XML y JSON se pueden editar manualmente en cualquier editor de texto. Además, Apple ofrece compatibilidad en Xcode para editar listas de propiedades en un visor/editor jerárquico que puede manejar listas de propiedades con formato binario o XML , pero no JSON . A partir de Mac OS X 10.4 , Apple proporciona una interfaz de AppleScript para leer archivos de listas de propiedades a través de la aplicación Eventos del sistema. A partir de Mac OS X 10.5 , Apple también proporciona una interfaz de AppleScript para editar, crear y escribir archivos de listas de propiedades. [ 14 ]

Para el formato XML, las etiquetas, las clases Foundation relacionadas y los tipos CoreFoundation, así como los formatos de almacenamiento de datos, son los siguientes:

El formato de archivo binario está documentado en un bloque de comentarios en el archivo fuente de código C de Core Foundation ( CF/CFBinaryPList.c ) para la implementación de código abierto de Apple de plists binarios en su biblioteca Foundation. [ 15 ] Apple describe la implementación como opaca en la documentación de su página de manual plist(5), [ 16 ] lo que significa que se desaconseja confiar en el formato. En el formato de archivo binario, el número mágico (los primeros bytes del archivo que indican que es un archivo plist válido) es el texto bplist , seguido de dos bytes que indican la versión del formato.

El archivo binario puede almacenar información que no se puede capturar en los formatos de archivo XML o JSON. Los tipos binarios de array, set y diccionario se componen de punteros (las entradas objref y keyref) que indexan una tabla de objetos en el archivo. Esto significa que los archivos plist binarios pueden capturar el hecho de que, por ejemplo, un array y un diccionario separados serializados en un archivo contienen el mismo elemento de datos. Esto no se puede capturar en un archivo XML. La conversión de un archivo binario de este tipo dará como resultado que se coloque una copia del elemento de datos en el archivo XML. Además, el archivo binario tiene un tipo UID que se utiliza para identificar los elementos de datos cuando se serializan. La lista completa de datos que se pueden almacenar, tomada del archivo fuente de código C, es la siguiente:

Nótese la nota v"1?"+ en muchos tipos. Esto significa que el byte marcador solo se encuentra en archivos con una versión de formato no inferior al número mágico "1?". La forma precisa de analizarlos es más compleja que la de analizar tipos heredados, ya que la implementación de CFBinaryPlist solo admite la versión "0?". En la práctica, estos tipos nunca se encuentran, puesto que NSKeyedArchiver ya es capaz de capturar esta información.

Tras la tabla de objetos, aparece una tabla de desplazamientos, seguida de un pie de página con información sobre el tamaño y la ubicación de ambas tablas.

Serialización a plist

Dado que las listas de propiedades no capturan toda la información y los tipos de datos necesarios para describir un objeto arbitrario, a menudo se realiza una capa adicional de codificación y decodificación. La especificación OpenStep abstrae la operación de serializar cualquier NSObject bajo el protocolo NSCoding . Cualquier clase que implemente este protocolo puede serializar sus instancias mediante una subclase de NSCoder a algún otro formato. [ 18 ] Existen dos codificadores principales para el propósito de serializar objetos a listas de propiedades:

  • NSArchiver convierte un objeto en un bloque de datos binarios, de forma similar a una estructura etiquetada. Esta clase forma parte de OpenStep, aunque no se ha definido un formato concreto. En la práctica, se puede usar para serializar un objeto en un archivo (sin incluir el archivo plist) o para incrustar los datos en un archivo plist. Debe leerse y escribirse en el mismo orden en que se escribió. La introducción de NSKeyedArchiver desaconseja su uso.
  • NSKeyedArchiver , introducido en Mac OS X 10.2, transforma el objeto en un NSDictionary . La principal mejora de este formato para los programadores es que accede a los miembros no por un orden fijo, sino por claves de cadena. Internamente, reproduce en cierta medida el formato plist binario almacenando una matriz de tabla de objetos llamada $objects en el diccionario. Todo lo demás, incluida la información de clase, se referencia mediante un puntero UID. Una entrada $top en el diccionario apunta al objeto de nivel superior que el programador pretendía codificar. [ 17 ]

Entre otras cosas, el uso de un archivador permite codificar nuevos tipos de datos sin modificar el formato plist, y es la forma preferida por Apple para codificar elementos como NSSets y valores nulos. Analizar los formatos resulta un poco más difícil, ya que se debe seguir una capa adicional incluso para algunas clases que se suponía que los plists debían admitir. Al igual que el formato binario, que también tiene una tabla de objetos, es posible crear referencias circulares en NSKeyedArchiver . Dado que no existe un tipo de dato UID en XML, los enteros se almacenan en un diccionario bajo la clave "CF$UID". [ 19 ]

Apple publica un NSKeyedArchiver de código abierto en Swift Corelibs Foundation; [ 20 ] al igual que el Apple Foundation de código cerrado, restringe los formatos de salida a binario y XML solamente. También tiene algunos casos de prueba que muestran los resultados de la serialización. [ 21 ] GNUstep también tiene una implementación compatible, que no limita los formatos de salida. [ 22 ] [ 23 ]

Lenguaje de ruta

No existe un lenguaje de rutas único y estandarizado para las listas de propiedades, como sí lo hace XPath para XML, pero sí existen convenciones informales utilizadas por diversos programas.

  • Una versión con sintaxis de punto se encuentra en el argumento keypath de plutil de Apple . Parece derivar de . [ 12 ](id) -[NSObject(NSKeyValueCoding) valueForKeyPath:]
  • PlistBuddy utiliza un formato diferente , con una sintaxis de dos puntos para la indexación. [ 11 ]

Ninguno de los dos formatos es capaz de expresar una clave que contenga el carácter separador.

Otras plataformas

Windows

Aunque son más conocidos en sistemas Apple o Darwin, como iOS y macOS, los archivos plist también están presentes en ordenadores Windows cuando se instala software de Apple, como iTunes [ 24 ] o Safari [ 25 ] . En Windows, los archivos suelen ser binarios [ 26 ] , aunque algunas aplicaciones pueden generar archivos PLIST en otros formatos.

En Windows, los archivos plist de Apple se almacenan en el directorio personal del usuario, en %USERPROFILE%\AppData\Roaming\Apple Computer . Estos archivos plist en Windows suelen almacenar preferencias y otra información, en lugar de utilizar el registro de Windows.

Las opciones para editar archivos PLIST en Windows no son tan amplias como en macOS. Si el archivo está en formato XML o JSON, se puede usar un editor de texto como Notepad++ . Apple incluye plutil.exe en su paquete "Apple Application Support" (que forma parte de iTunes ), y es idéntico a su equivalente en macOS.

NetBSD

Introducida en 2006 y lanzada por primera vez con NetBSD#4.0 (2007), es una biblioteca proplib que se puede usar para serializar datos entre el kernel y el espacio de usuario. Implementa parte del lenguaje XML plist. [ 27 ]

Uno de los ejemplos de usuarios de proplib es la segunda revisión del marco de trabajo sysmon envsys para la monitorización del sistema .

La biblioteca proplib de NetBSD también se ha portado a DragonFly en 2010 y está disponible desde DragonFly BSD#2.8 . [ 28 ] [ 29 ]

Multiplataforma

  • La reimplementación de código abierto de Facebook de la herramienta de compilación de Xcode , xcbuild , contiene una biblioteca plist, así como plutil y PlistBuddy . Estas utilidades multiplataforma están escritas en C++ . [ 30 ]
  • Python tiene un plistlibmódulo integrado para leer y escribir archivos plist, en XML de Apple o en binario (desde Python 3.4). [ 31 ] ProperTree es un editor multiplataforma que utiliza esta biblioteca. [ 32 ]
    • Una biblioteca de terceros llamada ccl-bplist tiene la capacidad adicional de manejar UID de NSKeyedArchiver . [ 19 ]
  • Go tiene un plistpaquete que admite cuatro tipos de plists: texto OpenStep, texto GNUStep, XML de Apple y binario de Apple. También maneja UIDs en formatos XML y binario. [ 2 ]
  • Dart tiene una biblioteca de terceros llamada propertylistserialization que también maneja UID de NSKeyedArchiver . [ 33 ]

Véase también

  • La página del manual plist(5) en Wayback Machine (archivada el 19 de marzo de 2017)
  • Complemento de Excel para crear archivos plist a partir de hojas de cálculo de Excel (en ruso)
  • API de Java para leer/escribir formatos plist en GitHub
  • Gramática EBNF para los archivos plist de GNUstep en GitHub

Notas

  1. Una peculiaridad de pl de macOS es que coloca un carácter "D" extraviado en la salida estándar si uno escribió manualmente la entrada estándar y la terminó con ^D .
  2. Ladescriptionimplementación en Obj-C FoundationNSDatatiene un error, ya que devuelve una representación en forma de diccionario. La implementación de código abierto Swift Foundation no presenta este problema.

Referencias

  1. "Referencia de la clase NSString: propertyListFromStringsFileFormat" . GNUstep . Consultado el 17 de febrero de 2020 .
  2. 1 2 Howett, Dustin L. "Package plist" . godoc.org . Cuando Unmarshal encuentra una lista de propiedades de OpenStep, entra en un modo de análisis relajado: las listas de propiedades de OpenStep solo pueden almacenar datos simples como cadenas, por lo que intentaremos recuperar valores enteros, de punto flotante, booleanos y de fecha donde sea necesario.
  3. "Listas de propiedades ASCII de estilo antiguo" . Apple Developer (Guía de programación de listas de propiedades) . Consultado el 16 de febrero de 2020 .
  4. 1 2Manual de comandos generales de Linux de ManKier.comdefaults(1)  
  5. Frith-Macdonald, Richard (2004). "Documentación de la clase NSPropertyListSerialization" . GNUstep .
  6. "Listas de propiedades" . GNUstepWiki .
  7. "Documentación de NSSerialization" . GNUstep .código fuente
  8. "Tipos y constantes: NSPropertyListFormat" . gnustep.org .
  9. Manual de comandos generales de Linux de ManKier.compldes(1)  
  10. "appleexaminer.com: "Archivos PLIST"" . Archivado del original el 19 de febrero de 2014 . Consultado el 27 de febrero de 2014 .
  11. 1 2Manual del administrador del sistema Darwin y macOSPlistBuddy(8)  
  12. 1 2Manual de comandos generales de Darwin y macOSplutil(1)  
  13. Manual de comandos generales de Darwin y macOSpl(1)  
  14. "AppleScript: Listas de propiedades" . 24 de abril de 2009. Archivado del original el 24 de abril de 2009.
  15. 1 2 "CF/CFBinaryPList.c" . Apple Open Source . 20 de junio de 2016. Archivado del original el 28 de noviembre de 2023. Recuperado el 6 de enero de 2020 .
  16. Manual de formatos de archivo de Darwin y macOSplist(5)  
  17. 1 2 Caithness, Alex (4 de abril de 2012). "Publicación de Geek: Archivos NSKeyedArchiver: ¿qué son y cómo puedo usarlos?" . Investigación Digital . El tipo de datos CF$UID en el Listado 2 es un diccionario con una sola clave ("CF$UID") seguida de un número entero (este diseño es el que verá cuando la lista de propiedades se represente en XML; en el formato binario sin procesar, el tipo de datos "UID" es una entidad separada que no requiere la estructura de diccionario). Estos tipos de datos representan una referencia a otra entidad en el array "$objects". El número de CF$UID da la posición del array.
  18. "NSCoder.html" . Especificación de OpenStep .
  19. 1 2 CCLForensics Group (15 de enero de 2020). "cclgroupltd/ccl-bplist" . GitHub .
  20. Apple (26 de julio de 2024). "swiftlang/swift-corelibs-foundation: NSKeyedArchiver.swift" . GitHub .
  21. Apple (22 de abril de 2020). "swiftlang/swift-corelibs-foundation: Tests/Foundation/Resources" . GitHub .
  22. GNUstep (9 de febrero de 2026). "Documentación de NSKeyedArchiver" . Documentación de GNUstep . Consultado el 23 de febrero de 2020 .
  23. GNUstep (7 de noviembre de 2024). "gnustep/libs-base: NSKeyedArchiver.m" . GitHub . Consultado el 10 de abril de 2026 .
  24. Hummert, Christian; Humphries, Georgina Louise (2022). «Capítulo 6: Listas de propiedades». En Hummert, Christian; Pawlaszczyk, Dirk (eds.). Mobile Forensics – The File Format Handbook: Common File Formats and File Systems Used in Mobile Devices . Cham: Springer International Publishing. pp. 157–165 . doi : 10.1007/978-3-030-98467-0_6 . ISBN  978-3-030-98467-0.
  25. "¿Cómo guarda el navegador web Safari de Apple su configuración en Windows?" . Super User . 23 de julio de 2012.
  26. "microsoft/NSPlist: NSPlist" . 10 de agosto de 2025. Recuperado el 3 de mayo de 2019 a través de GitHub.
  27. Thorpe, Jason R. "jsonn/src: proplib.3" . NetBSD . Para facilitar el uso de proplib en entornos de kernel, autónomos y de espacio de usuario, el analizador de proplib no es un analizador XML real. Está programado para analizar únicamente la representación externa de la lista de propiedades.
  28. Thorpe, Jason R. "DragonFlyBSD: proplib.3" . DragonFly BSD vía bifurcación de NetBSD . La biblioteca de objetos de contenedor de propiedades proplib apareció por primera vez en NetBSD 4.0.
  29. "proplib — biblioteca de objetos contenedores de propiedades". Páginas del manual en línea de DragonFly . DragonFly BSD . 17 de enero de 2011.
  30. Facebook (21 de noviembre de 2019). "facebook/xcbuild/Libraries/plist" . GitHub . Consultado el 17 de febrero de 2020 .
  31. Python Software Foundation (31 de marzo de 2026). "plistlib — Genera y analiza archivos .plist de Mac OS X" . Documentación de Python 3. Consultado el 6 de enero de 2020 .
  32. CorpNewt (26 de diciembre de 2025). "corpnewt/ProperTree: Editor de plist con interfaz gráfica de usuario multiplataforma escrito en Python" . GitHub . Consultado el 10 de abril de 2026 .
  33. Electric Bolt Limited (15 de enero de 2025). "propertylistserialization | Paquete Dart" . pub.dev . Consultado el 14 de septiembre de 2024 .