¿Hay un reloj en iOS que se pueda usar y que el usuario no pueda cambiar?

Estoy tratando de diseñar un sistema donde ocurran eventos en tiempo real y quiero sincronizarlos con un reloj. [NSDate date] normalmente estaría bien, pero el usuario podría cambiar esto y engañar al sistema. Todo lo que necesito es un reloj que pueda tomar de tiempos relativos (por ejemplo, un contador de 64 bits). No necesito tiempo absoluto (ni la hora del día, etc.).

¿Hay tal API que pueda usar?

EDITAR: También me gustaría añadir que este reloj debe ser persistente durante las sesiones de la aplicación.

Si todo lo que necesita es un reloj para medir los eventos de forma monótona, puede obtener el tiempo de actividad del sistema actual ala clock_gettime(CLOCK_MONOTONIC) . Si reiniciar el dispositivo es un problema, simplemente guarde el último valor utilizado y en el próximo lanzamiento use el último valor guardado como un desplazamiento. El problema aquí puede ser que si cierran el dispositivo, no contará ese tiempo. Pero si te preocupa que el usuario acelere el tiempo, no pueden hacerlo, solo ralentizarlo.

El mejor número monotónicamente creciente en un iPhone es mach_absolute_time() que es un recuento de tics de la CPU desde el último reinicio. Si lo desea en segundos por cualquier motivo, es más fácil CACurrentMediaTime() a CACurrentMediaTime() .

Usar esto para crear un “incremento constante” es bastante fácil. En el primer lanzamiento, almacene el valor actual donde lo desee. Cuando salga, y periódicamente, guarde el desplazamiento desde ese valor. Cuando reinicie, verifique el valor actual; si es inferior a su valor base anterior, reemplace su valor base (se ha reiniciado).

Por supuesto, todo esto se puede borrar al eliminar su aplicación, a menos que almacene algo en el servidor.

Tenga en cuenta que esto no se puede usar como una medida de seguridad sólida. No hay forma de evitar que un usuario autorizado falsifique solicitudes. Entonces, dependiendo de lo que quiere decir con “engañar al sistema”, puede que no sea un problema solucionable. Lo mejor que puedes hacer es tener una diligencia constante buscando hacks y lidiando con ellos.

Estoy usando esto en nuestra aplicación

 + (NSDate *) getAWSDate { NSDate *today = nil; NSString *dateString = nil; NSString *awsURL = @"http://s3.amazonaws.com"; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:awsURL]]; [request setHTTPMethod:@"HEAD"]; NSHTTPURLResponse *response; [NSURLConnection sendSynchronousRequest:request returningResponse:&response error: NULL]; if ([response respondsToSelector:@selector(allHeaderFields)]) { dateString = [[response allHeaderFields] objectForKey:@"Date"]; dateString = [dateString stringByReplacingOccurrencesOfString:@"GMT" withString:@"+0000"]; NSDateFormatter *df = [[NSDateFormatter alloc] init]; df.dateFormat = @"EEE, dd MMM yyyy HH:mm:ss z"; df.locale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]; df.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"]; today = [df dateFromString:dateString]; [df release]; } return today; } 

Creo que mach_absolute_time() puede ser lo que quieras. Hay bastante información aquí: http://developer.apple.com/library/mac/#qa/qa1398/_index.html

Básicamente es un contador de la cantidad de tics desde que comenzó el dispositivo. Esto se restablecerá al reiniciar, pero aparte de eso, es un contador monótonamente creciente.

Puedes mantener el último valor del contador y lidiar con él si el contador ha disminuido desde la última vez (el dispositivo se reinició). En este caso, puede agregar el último valor conocido al valor actual para obtener un límite inferior del tiempo que ha transcurrido, todo lo que perdería sería el tiempo transcurrido entre la última sesión y el dispositivo apagado, usted mantendría el tiempo entre el reinicio y la próxima sesión sin embargo.

Lo que sé es que no hay ningún otro método para obtener la hora correcta. Yo usaría NTP.

Network Time Protocol (NTP) es un protocolo de red para sincronizar los relojes de los sistemas informáticos a través de redes de datos de latencia variable con conmutación de paquetes. Más: http://en.wikipedia.org/wiki/Network_Time_Protocol

En un proyecto, voy a usar NTP (mañana me pregunto), pero ya investigué un poco:

Biblioteca de iOS: https://github.com/jbenet/ios-ntp – Notas del autor: la implementación no es rigurosa, como se describe en los RFC, ya que el objective era mejorar la precisión del tiempo en un segundo, no en fracciones de milisegundos. .

Para proyectos no comerciales, busque en: http://www.packages.ubuntu.com/source/lucid/ntp

Biblioteca C: http://www.hillstone-software.com/hs_ntp_details.htm

Documentación: http://www.nist.gov/pml/div688/grp40/its.cfm

La única idea que puedo pensar es usar un servidor NTP para obtener el reloj, pero eso requeriría conectividad de red.