1 votos

Cómo actualizar la caché de las Preferencias del Sistema utilizando Objective-C

Quiero utilizar el defaults write para cambiar una casilla de verificación en las Preferencias del Sistema. Por ejemplo

defaults write ./com.apple.speech.synthesis.general.prefs TimeAnnouncementPrefs -dict-add TimeAnnouncementsEnabled -bool YES

Sin embargo, el sistema operativo almacena en caché los archivos de preferencias, por lo que el comando defaults no tiene efecto hasta que se actualice la caché. La aplicación de Preferencias del Sistema actualiza la caché después de realizar un cambio en su interfaz de usuario, así que es posible. Algunas personas han sugerido sudo killall cfprefsd pero eso no funciona en Big Sur.

En otro lugar, el usuario3439894 ha publicado un buen AppleScript que manipula la interfaz de usuario de las Preferencias del Sistema. Pero dicha manipulación de la UI no funciona cuando el Protector de Pantalla se está ejecutando.

Me gustaría averiguar cómo la aplicación de Preferencias del Sistema consigue actualizar la caché de preferencias. Haciendo strings de la aplicación Preferencias del Sistema (en /System/Applications/System\ Preferences.app/Contents/macOS/System\ Preferences ) muestra un método updateCacheFileWithPrefPane: que podría hacer el trabajo, pero no sé cómo llamar a ese método. El método, sea cual sea, es privado, pero sólo lo necesito para mí (no para una aplicación pública).

¿Es posible utilizar dtrace o dtruss para averiguar qué hace la aplicación de Preferencias del Sistema para indicar al sistema operativo que actualice su caché para una casilla concreta? Quiero escribir un Objetivo-C programa para hacer lo mismo, pero necesito que un experto en dtrace/dtruss me ayude.

1voto

Steve Evans Puntos 155

MacOS utiliza NSUserDefaults para implementar los valores por defecto. Ofrece una interfaz Objective-C y forma parte del marco de trabajo de la Fundación que utilizan las Preferencias del Sistema y la mayoría de las aplicaciones para tratar las preferencias.

El almacenamiento de los valores predeterminados es manejado por el framework y no se espera que la aplicación que llama conozca o manipule el caché. Véase NSUserDefaultsDidChangeNotification y Key Value Observation (KVO) para que las aplicaciones puedan seguir los cambios.

CFPreferencesSynchronize

NSUserDefaults se implementa con el sistema basado en C CFPreferences conjunto de funciones, que se encuentran en el marco de CoreFoundation.

En esta capa, la documentación de la función CFPreferencesSynchronize lee:

Esta función es la mecanismo de sincronización primitivo para la función de preferencia de nivel superior CFPreferencesAppSynchronize escribe las preferencias actualizadas en el almacenamiento permanente, y lee las últimas preferencias del almacenamiento permanente.

Sólo se modifica el dominio exacto especificado. Tenga en cuenta que para modificar las preferencias de "Cualquier usuario" se requieren privilegios de root (o privilegios de administrador antes de OS X v10.6); consulte la Guía de programación de los servicios de autorización.

No utilice esta función directamente a menos que tenga una necesidad específica. Todos los argumentos deben ser no NULL . No utilice nombres de usuario y de host arbitrarios, en su lugar pase las constantes predefinidas.

MacOS 11.2 es en parte de código abierto . Asegúrese de comprobar si defaults forma parte de la sección abierta. Esto puede ser útil para determinar a qué dominios y suites afectan las preferencias.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X