2012-01-31 16 views
18

Estoy desarrollando una aplicación que solo se puede usar durante un cierto momento del día. No puedo obtener la hora del dispositivo local porque el usuario puede cambiar fácilmente el tiempo del dispositivo, lo que permite el acceso a la aplicación en cualquier momento del día.Obtener fecha y hora del servidor de Apple

¿Hay alguna manera de obtener la fecha y hora actual de un servidor Apple (o si no,) hay alguna otra manera?

+1

Si ha utilizado una u otra solución, seleccione la respuesta preferida ;-) –

+0

¿Ha considerado que el usuario puede activar el modo avión y luego cambiar la fecha y la hora? – Mahouk

Respuesta

11

Creo que deberías estar utilizando un servidor de hora de Internet. Están usando un protocolo estandarizado llamado NTP. IOS tiene built-in support for reading NTP server time, pero no puede acceder a este como desarrollador de la aplicación. O implemente esto usted mismo, o tal vez podría usar una biblioteca de código abierto, como ios-ntp o HS NTP. No he usado ninguno de ellos yo mismo. Probablemente sea una buena idea verificar la posición del dispositivo y determinar la zona horaria para obtener una solución real a prueba de balas.

Aquí puede leer más sobre los servidores y esas cosas; NIST Internet Time Service

Idealmente, debe tener una lista de servidores en la aplicación. Si uno de ellos falla, llame al próximo servidor NTP de la lista.

+0

suena gd muchas gracias !! – kraitz

+0

@kraitz Encontré una implementación de código abierto que quizás podría usar. La respuesta se actualiza en consecuencia. –

+0

ios-ntp contiene mucho código de proveedor. Y los nombres de clase no son muy buenos para incluirlos en el proyecto. – kelin

5
- (NSDate *) CurrentDate 
{ 
    if ([self hasInternetConnectivity]) // this tests Internet connectivity based off Apple's Reachability sample code 
    { 
     NSSURL * scriptUrl = [NSURL URLWithString: @"http:// <yoursite>. Com/<the 2 line php script>. Php"]; 
     NSData * data = [NSData dataWithContentsOfURL: scriptUrl]; 

     if (data! = nil) { 
      NSString * tempString = [NSString stringWithUTF8String: [data bytes]]; 
      NSDate * currDate = [NSDate dateWithTimeIntervalSince1970: [tempString doubleValue]]; 
      NSLog (@ "String returned from the site is:% @ and date is:% @", tempString, [currDate description]); 
      return currDate; 
      } 
     else { 
      NSLog (@ "nsdata download failed"); 
      return [NSDate date]; 
     } 
    } 
    else { 
    NSLog (@ "InternetConnectivity failed"); 
     return [NSDate date]; 
    } 
} 
+0

gracias shah! le daría una oportunidad. – kraitz

+0

¿De qué tipo de servidor estamos hablando aquí? ¿Necesitas implementar tu propio servidor? –

+0

Creo que lo que Shah mencionó es alojar un archivo php en un servidor que imprime la hora actual. el código anterior leerá el texto y regresará como NSDate. si no me equivoco. – kraitz

1

puede utilizar ese código abierto para obtener el tiempo de servidor NTP por defecto, o elegir su servidor: https://github.com/huynguyencong/NHNetworkTime

[[NHNetworkClock sharedNetworkClock] syncWithComplete:^{ 
     NSLog(@"%s - Time synced %@", __PRETTY_FUNCTION__, [NSDate networkDate]); 
    }]; 

y uso:

NSDate *networkDate = [NSDate networkDate]; 
0

respuesta de Karan había algunos errores tipográficos, y también falló para comprobar si hay una respuesta de "0" en lugar de simplemente "nula". (Lo implementé en mi aplicación y obtuve varios falsos positivos de conexiones débiles o redes no autorizadas.)

Lo he adaptado a continuación y he agregado el código de servidor correspondiente para aquellos que no saben a qué se refería Karan. a. Esto se implementa como un método de la categoría en una extensión NSDate, por lo que se le puede llamar usando [NSDate verifiedDate];

+(NSDate*)verifiedDate { 
    if([self hasInternetConnectivity]) { 
     NSURL *scriptUrl = [NSURL URLWithString:@"http://[yourwebsite].com/timestamp.php"]; 
     NSData *data = [NSData dataWithContentsOfURL: scriptUrl]; 

     if(data != nil) { 
      NSString *tempString = [NSString stringWithUTF8String:[data bytes]]; 

      if([tempString doubleValue] > 946684800) { // Date is at least later than 2000 AD, or else something went wrong 
       NSDate *currDate = [NSDate dateWithTimeIntervalSince1970:[tempString doubleValue]]; 
       NSLog(@"verifiedDate: String returned from the site is: %@ and date is: %@", tempString, [currDate description]); 
       return currDate; 
      } else { 
       NSLog(@"verifiedDate: Server returned false timestamp (%@)", tempString); 
       return [NSDate date]; 
      } 
     } else { 
      NSLog(@"verifiedDate: NSData download failed"); 
      return [NSDate date]; 
     } 
    } else { 
     NSLog(@"verifiedDate: InternetConnectivity failed"); 
     return [NSDate date]; 
    } 
} 

Y aquí está el código del servidor, almacenado en la carpeta raíz del servidor como "timestamp.php"

<?php 
    echo(time()); 
?> 
0

Creo que su requisito puede cumplirlo algunos servicios web que devuelven datos json.

Uno de ellos es jsontest.com: http://date.jsontest.com. Aquí es lo que devuelve:

{ 
    "time": "02:11:29 AM", 
    "milliseconds_since_epoch": 1513563089492, 
    "date": "12-18-2017" 
} 

El "milliseconds_since_epoch" representa milisegundos desde 1970, por lo que es fácil de convertir a la fecha, mediante el uso de Date.init(timeIntervalSince1970: milliseconds_since_epoch/1000). Entonces podemos usar la clase Calendar para obtener la hora local.

Cuestiones relacionadas