2009-09-18 25 views
5

Necesito asegurarme de que mi aplicación obtenga la hora correcta, no el tiempo establecido por el usuario en la configuración.¿Cómo puedo obtener el tiempo real en iPhone, no el tiempo establecido por el usuario en Configuración?

Así, por ejemplo, una vez que el usuario inicie la aplicación, me gustaría obtener una marca de tiempo. El usuario vería el tiempo transcurrido en un temporizador en la pantalla actualizado cada segundo. Cuando el usuario sale de la aplicación y después de un tiempo reinicia la aplicación, el temporizador simplemente obtiene la hora actual y la compara con la marca de tiempo original que guardó. Así que, básicamente, al igual que el cronómetro en Clock.App en iPhone.

Ahora el problema con la clock.app es que si el usuario va y adelanta el tiempo en Ajustes en una hora, esto influirá en el temporizador. Obviamente no quiero eso, porque en mi aplicación, eso sería hacer trampa.

Necesitaría obtener una fuente de tiempo más confiable para comparar.

Podría obtener el tiempo de Internet. Pero el problema es que necesitaría conexión a Internet, así que solo funciona si hay una conexión a Internet. Mi aplicación necesita trabajar sin conexión de preferencia.

¿Hay algún tipo de reloj interno al que pueda acceder?

¿Hay alguna forma de comprobar si el usuario ha cambiado la hora de la fecha en Configuración?

¿Alguna otra idea?

Gracias

+0

accidentalmente el tiempo real ... es tan malo? –

+0

¿Sería posible obtener tiempo del GPS? – Maxm007

+1

Necesitará obtener el tiempo de alguna fuente externa (NIST, GPS, el sistema del teléfono celular, tal vez incluso mediante el rastreo de paquetes para el tráfico de otras personas que tenga los datos correctos) ya que cualquier reloj interno puede verse afectado. OTOH, si no confías en el usuario, ni siquiera deberías estar haciendo esto en el sistema del cliente. – BCS

Respuesta

1

obtener el tiempo de NIST con el Protocolo durante el día:

UDP basado diurno Servicio Un servidor espera datagramas UDP en el puerto UDP 13. Cuando se recibe un datagrama, un datagrama de respuesta se envía que contiene la fecha y hora actual como una cadena de caracteres ASCII (los datos en el datagrama recibido se ignoran).

NIST formato de la respuesta: JJJJJ YR-MO-DA HH: MM: SS TT LH msADV UTC (NIST) OTM

http://tf.nist.gov/service/its.htm

http://tf.nist.gov/tf-cgi/servers.cgi

+1

Hola, no puedo usar la hora de Internet porque mi aplicación necesita funcionar sin conexión. – Maxm007

1

La mejor solución que he llegado con está usando el temporizador mach que cuenta las unidades de tiempo desde el último arranque de iphone.

Esto funciona genial. La única restricción es que no se le puede permitir al usuario reiniciarse o invalidaría su tiempo.

Detecto un reinicio almacenando inicialmente la marca de tiempo iphone asociada con el temporizador mach y luego comprobando cada vez que se inicia la aplicación, por lo que no ha cambiado. Esto tiene como efecto secundario que si el usuario cambia el iPhone DateTime mientras está siendo sincronizado, eso también invalidará el puntaje, pero eso está bien.

How can I detect whether the iphone has been rebooted since last time app started

puedo advertir fácilmente mis clientes sobre esto: reiniciar o cambiar el tiempo iPhone mientras está en el reloj invalidará su tiempo marcado.

0

Me acaba de publicar la siguiente here:

Esto funciona para obtener la hora del GPS:

#import <CoreLocation/CoreLocation.h> 

CLLocation* gps = [[CLLocation alloc] 
         initWithLatitude:(CLLocationDegrees) 0.0 
         longitude:(CLLocationDegrees) 0.0]; 
NSDate* now = gps.timestamp; 

No parece que sea a prueba de manipulaciones sin embargo.

Probé este código en un iPhone 4 en modo avión (iOS 6.1), e incluso entonces da un buen momento. Pero lamentablemente esta vez parece cambiar con el reloj del sistema. Ugh.

Lo curioso que he encontrado (aún en modo avión) es que si se manipule el reloj del sistema (después de pasar a off Tiempo & Fecha de Set Automatically), y luego gire Set Automatically de nuevo a on, la máquina restaura la verdadera (original) tiempo sin problemas. esto funciona incluso después de encender y apagar el teléfono. Entonces parece que es algo así como un tiempo a prueba de manipulaciones que el dispositivo mantiene internamente. Pero, ¿cómo acceder a esto?

+0

Este método solo configurará la fecha y la hora desde la configuración del dispositivo –

0

Este método va a encontrar el tiempo real actual, que se encuentra en la cabecera de la respuesta de google.com:

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] 
           initWithURL:[NSURL URLWithString:@"http://google.com"]]; 

[request setHTTPMethod:@"GET"]; 

NSHTTPURLResponse *httpResponse = nil; 
[NSURLConnection sendSynchronousRequest:request returningResponse:&httpResponse error:nil]; 
NSString *dateString = [[httpResponse allHeaderFields] objectForKey:@"Date"]; 
NSDate *currentDate = [NSDate dateWithNaturalLanguageString:dateString locale:NSLocale.currentLocale]; 
Cuestiones relacionadas