Tengo una aplicación Cocoa que registra las fechas en los eventos. Necesito saber cuándo se restablece el tiempo del sistema y cuánto, pero parece que no puedo enviar una notificación a ninguna parte que me diga que algo así ha sucedido. Este cambio podría ocurrir debido a que NTP reinicia el reloj o porque el usuario reinicia (por ejemplo, desde las Preferencias del sistema). Sería genial si hubiera una NSNotification que pudiera registrar para recibir, pero estoy abierto a cualquier sugerencia.¿Cómo puedo recibir notificaciones sobre un cambio de horario del sistema en mi aplicación Cocoa?
Respuesta
Apple agregado en NSSystemClockDidChangeNotification, parte de NSDate, en Snow Leopard (10.6). No parece haber una manera de hacerlo en Leopard (10.5) o anterior. Por el Apple NSDate docs:
Publicado cada vez que se cambia el reloj del sistema. Esto puede iniciarse mediante una llamada a settimeofday() o al usuario que cambia los valores en el panel Preferencia de fecha y hora. El objeto de notificación es nulo. Esta notificación no contiene un diccionario userInfo.
Esto no parece indicar "cuánto" ha cambiado el tiempo. Posiblemente podría calcular eso periódicamente (por ejemplo, cada 5 segundos en un NSTimer) capturando la hora del sistema con [NSDate date], guardándola en una variable, y luego después de que se active NSSystemClockDidChangeNotification, tome la nueva fecha y compare las dos juntas usando NSDate's timeIntervalSinceDate: método para obtener la diferencia.
Sin precisión de milisegundos o incluso segundos, pero bastante cerca.
EDITAR: Ver this post. Posiblemente pueda usar el comando UpTime()
C para capturar el tiempo de actividad del sistema en tics de CPU (que luego puede convertir a segundos). Puede usar esto para calcular cuánto tiempo ha cambiado (suponiendo que el sistema no se reinicie o no duerma). Esto funciona incluso si el reloj del sistema es cambiado por el usuario o el protocolo de tiempo de la red.
El tiempo se mueve constantemente. Una notificación cada vez que se cambie la hora actual sería una corriente de notificaciones constante y saturada de CPU.
Lo que debe hacer es obtener la hora actual en su controlador de eventos, el que recibe los eventos que marca la fecha. Obtenga la hora actual llamando al [NSDate date]
.
Bueno, ¿no es obvio que el OP significa un cambio inusual de tiempo y no el avance normal del reloj :) – phlebotinum
No creo que haya una sola forma de hacerlo debido a los diferentes mecanismos por los que el tiempo podría cambiar. Pero no sería muy caro (¿es demasiado caro? No lo sé, ¿ya lo ha perfilado? ;-) para configurar un NSTimer
una vez por segundo para comprobar el tiempo y compararlo con el valor anterior. Si no avanza en alrededor de un segundo, sucedió algo interesante y puede notificar a su objeto de auditoría.
Si algunos en busca de solución saben sistema de eventos fecha de cambio de cambio de 10,4
OSStatus DateChangeEventHandler(EventHandlerCallRef nextHandler, EventRef theEvent, void *userData)
{
NSLog(@"Event received!\n");
return 0;
}
- (void)SystemTimeChangeHandler
{
EventTypeSpec eventType;
eventType.eventClass = kEventClassSystem;
eventType.eventKind = kEventSystemTimeDateChanged;
EventHandlerUPP eventHandlerUPP =
NewEventHandlerUPP(DateChangeEventHandler);
EventHandlerRef eventHandlerRef = NULL;
(void)InstallApplicationEventHandler(
eventHandlerUPP,
1,
&eventType,
self,
&eventHandlerRef);
}
- 1. Recibir notificaciones cuando la aplicación actual cambie en Cocoa
- 2. SWT: Recibir notificaciones de un cambio de dispositivo del sistema (conexión/desconexión del dispositivo USB)
- 3. ¿Cómo recibir notificaciones automáticas de mi cuenta de Gmail?
- 4. ¿cómo recibir notificaciones de cambio de volumen de medios?
- 5. ¿Cómo recibir notificaciones sobre el cambio de estado de la red wifi?
- 6. ¿Cómo recibir notificaciones de MonoTouch sobre mi solicitud cerrada/enviada a segundo plano?
- 7. Objetivo C: recibir notificaciones sobre el estado inactivo de un usuario
- 8. Recibir notificaciones con la aplicación en el modo de fondo
- 9. iOS: cómo registrarse para recibir notificaciones push?
- 10. ¿Cómo cambio las Vistas en una aplicación Cocoa?
- 11. En Cocoa, ¿necesito eliminar un Objeto de recibir notificaciones KVO al desasignarlo?
- 12. ¿Cómo puedo recibir notificaciones cuando se visualice UIView?
- 13. ¿Cómo agregar un "gancho de Windows" del sistema para recibir notificaciones de la creación/activación de ventanas?
- 14. Solr: ¿cómo puedo recibir notificaciones de importaciones fallidas desde mi DataImportHandler?
- 15. ¿Evitar "reanudar" para mi aplicación Cocoa?
- 16. ¿Cómo recibir notificaciones sobre la implementación de EJB (para configurar un temporizador)?
- 17. ¿Cómo recibir notificaciones de una vista emergente en UINavigationController?
- 18. Aplicación PHP + notificaciones basadas en WebSocket sobre Socket.IO
- 19. ¿Puedo borrar de forma programática las notificaciones de mi aplicación del Centro de notificaciones de iOS 5?
- 20. Recibir notificaciones push en PhoneGap para iOS
- 21. Algunas preguntas sobre notificaciones push?
- 22. Cómo recibir UIAccessibilityNotifications en la aplicación de iPhone
- 23. ¿Cómo puedo usar los iconos del sistema en mi aplicación de Android?
- 24. Recibir notificaciones cuando se reproduce un sonido en OpenAL
- 25. Cómo puedo obtener el menú de la aplicación en Cocoa
- 26. ¿Cómo puedo recibir eventos del sistema de archivos de Windows en Java?
- 27. Mac/Cocoa: incrustar una ventana de terminal en mi aplicación
- 28. ¿Cómo puedo decirle a mi aplicación Cocoa que cierre desde la propia aplicación?
- 29. ¿Cómo hacer que una aplicación swing sea consciente del cambio en el tamaño de la pantalla?
- 30. ¿Qué permiso debe recibir mi Receptor de manejo de SMS entrante del sistema?
Qué quiere decir cuando cambia el reloj, por ejemplo, mediante una sincronización NTP, o cambiando la zona horaria o configurando manualmente la hora en Preferencias del Sistema? –
Sí, eso es lo que quiero decir. Lamento no haber tenido muy claro para empezar. Espero haber dejado esto más claro ahora. –