¿Por qué un cambio en la línea de comando a ~/Library/Preferences/com.apple.LaunchServices.plist no es efectivo de inmediato?

Cuando la ventana de información de Finder se utiliza para asociar archivos de un tipo particular con una aplicación:

  • la preferencia es efectiva inmediatamente.

Cuando Terminal se usa para hacer una adición comparable a~/Library/Preferences/com.apple.LaunchServices.plist

  • la preferencia no es efectiva inmediatamente.

Pregunta

¿Por qué Launch Services no respeta inmediatamente una escritura en el correo electrónico del usuario com.apple.LaunchServices.plist?

Una respuesta ideal podría ser una referencia a una página en el área de desarrolladores de Apple.

Las respuestas no necesitan implicar la ejecución de un comando.

Fondo

¿Agente o demonio?

Preguntándome si un demonio o agente hace efectivos los cambios en ese .plist, ejecuté:

sudo launchctl list

En la lista, bajo el encabezado de la etiqueta , no veo nada que pueda relacionarse con Servicios de lanzamiento .

Referencias

Una respuesta a la pregunta de desbordamiento de pila ¿ Cómo configurar la aplicación predeterminada para tipos de archivos específicos en Mac OS X? sugiere:

… para ser recargado. Puede cerrar la sesión, esperar unos minutos o forzar el reinicio de los servicios de lanzamiento...

En mi caso:

La respuesta aceptada a la pregunta de superusuario ¿Existe una forma más rápida de cambiar las aplicaciones predeterminadas asociadas con los tipos de archivos en OS X? sugiere:

… reiniciar el sistema operativo para aplicar los cambios (cerrar la sesión y volver a iniciarla no es suficiente) …

— si un reinicio es suficiente, probablemente consuma menos tiempo que matar y luego sembrar la base de datos de Launch Services.

lsregister -kill -seedno tarda tanto (unos segundos en mi Air), pero hace que OS X vuelva a mostrar las advertencias sobre la apertura de aplicaciones por primera vez. Es por eso que reiniciar generalmente es una forma menos molesta de aplicar los cambios.

Respuestas (1)

De la Guía de programación de servicios de lanzamiento de Apple (todo el énfasis es mío):

Todas las aplicaciones disponibles en el sistema del usuario deben registrarse para darlas a conocer a Launch Services y copiar su enlace de documentos y otra información en su base de datos. Por lo general, no es necesario realizar esta tarea explícitamente, ya que una variedad de utilidades y servicios integrados en el software del sistema Mac OS X se encargan de ello automáticamente:

  • Una herramienta de fondo incorporada, que se ejecuta cada vez que se inicia el sistema o un nuevo usuario inicia sesión , busca automáticamente las carpetas de aplicaciones en el sistema, la red, los dominios locales y de usuario y registra cualquier aplicación nueva que encuentre allí. (Esta operación es análoga a "reconstruir el escritorio" en versiones anteriores de Mac OS).
  • El Finder registra automáticamente todas las aplicaciones a medida que las detecta , como cuando se arrastran al disco del usuario o cuando el usuario navega a una carpeta que las contiene.
  • Cuando el usuario intenta abrir un documento para el que no se puede encontrar una aplicación preferida en la base de datos de Launch Services, el Finder presenta un cuadro de diálogo que le pide al usuario que seleccione una aplicación con la que abrir el documento. Luego registra esa aplicación antes de ejecutarla.

A pesar de estas utilidades de registro automático, a veces puede ser necesario registrar una aplicación explícitamente con los Servicios de lanzamiento. Por ejemplo, aunque se alienta a los desarrolladores a empaquetar sus aplicaciones para que puedan instalarse simplemente arrastrándolas al disco del usuario, algunas aplicaciones pueden requerir un software de instalación personalizado más elaborado. En tales casos, el instalador debe llamar a una de las funciones de registro de Launch Services LSRegisterFSRefo LSRegisterURLregistrar la aplicación explícitamente.

Tenga en cuenta las llamadas a la API que necesita el único procedimiento de registro manual con nombre ( me temo que la fuente no está disponible en opensource.apple.com ).

Mientras solucionaba un error en el procesamiento de Launch Services en Leopard con FileVault habilitado , noté que ~/Library/Preferences/com.apple.LaunchServices.plistes:

  • procesado solo al iniciar sesión después del arranque, como datos de entrada para la creación de la base de datos de Launch Services propiamente dicha (Leopard habilitado para FileVault a menudo fallaba en realizar este paso, lo que resultaba en configuraciones de usuario aparentemente perdidas); y

  • en caché siempre que la máquina no se reinicie.

En pocas palabras, es la capa de persistencia del dominio de usuario de Launch Services , y las modificaciones a esa capa de persistencia solo se reconocen en el siguiente procesamiento: reinicio o reinicio .

@GrahamPerrin: Por cierto, si necesita una forma de agregar entradas a la base de datos de Launch Services sin la molestia de escribir com.apple.LaunchServices.plisty reiniciar, consulte duti : es lo que solía eludir exactamente el mismo problema en GoodCompany .
Donde duti es una respuesta aceptada , hay una nota con viñetas que indica que se requiere reiniciar/reiniciar . ¿Quizás los requisitos difieren cuando no se usa FileVault 1? Solo una suposición. Me gustaría discutir esto en Ask Different Chat , en su tiempo libre, diríjase a mí y a @bmike si lo desea. Gracias. (Mis comentarios relacionados con esto se distribuyen en varias preguntas en varias pilas, lo que no es necesariamente algo malo, pero me encantaría tener un solo lugar para la discusión).
@GrahamPerrin: Intentaré estar en el chat siempre que sea posible, pero ya puedo informar que no fue necesario reiniciar para cambiar el controlador predeterminado para una txtextensión que se usa dutien mi sistema (Lion, no FileVault).
@GrahamPerrin Quise decir que mi propio script (no duti) requería reiniciar.
@Lri Veo la edición reciente de su respuesta, ¡gracias! Tal vez desde el código abierto dutipueda haber una respuesta adicional a esta pregunta, o una edición de la respuesta aceptada.
@GrahamPerrin: duties básicamente un contenedor CLI alrededor de las funciones LSSetDefaultRoleHandlerForContentTypey LSSetDefaultHandlerForURLScheme, que se declaran Application.hjunto con las LSRegister*funciones, lo que significa que interactúa con los Servicios de lanzamiento en el nivel de API que proporciona Apple, no a través de la capa de persistencia (consulte la fuente duti, específicamente el controlador. c ).