2012-01-31 12 views
18

Sto sviluppando un'applicazione che può essere utilizzata solo durante una determinata ora del giorno. Non riesco ad ottenere l'ora del dispositivo locale perché l'utente può facilmente modificare l'orario del dispositivo consentendo in tal modo l'accesso all'applicazione per qualsiasi ora del giorno.Ottieni data e ora dal server Apple

C'è un modo per ottenere la data e l'ora correnti da un server Apple (o, in caso contrario,) c'è qualche altro modo?

+1

Se è stata utilizzata l'una o l'altra soluzione, selezionare la risposta preferita ;-) –

+0

Hai considerato il fatto che l'utente potrebbe attivare la modalità aereo e quindi modificare la data e l'ora? – Mahouk

risposta

11

Penso che dovresti utilizzare un server orario di Internet. Stanno usando un protocollo standardizzato chiamato NTP. IOS ha built-in support for reading NTP server time, ma questo non è accessibile come sviluppatore di applicazioni. O lo realizzi tu stesso, oppure potresti usare una libreria open source, come ios-ntp o HS NTP. Non ho usato nessuno di loro me stesso. Probabilmente è una buona idea controllare la posizione del dispositivo e capire il fuso orario, per ottenere una vera soluzione a prova di proiettile.

Qui puoi leggere ulteriori informazioni sui server e roba; NIST Internet Time Service

Idealmente, si dovrebbe avere un elenco di server nell'applicazione. Se uno di questi fallisce, si chiama il prossimo server NTP nell'elenco.

+0

suoni gd grazie mille !! – kraitz

+0

@kraitz Ho trovato un'implementazione open source che forse potresti usare. La risposta viene aggiornata di conseguenza. –

+0

ios-ntp contiene molto codice del fornitore. E i nomi delle classi non sono molto buoni per includerli nel progetto. – 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

grazie shah! fare un tentativo. – kraitz

+0

Di che tipo di server stiamo parlando qui? Hai bisogno di implementare il tuo server? –

+0

Penso che quello che Shah ha menzionato sia per ospitare un file php su un server che stampa l'ora corrente. il codice sopra leggerà il testo e ritornerà come NSDate. se non sbaglio – kraitz

1

è possibile utilizzare che l'open source per ottenere il tempo dal server NTP predefinito, oppure scegli il tuo server: https://github.com/huynguyencong/NHNetworkTime

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

E l'uso:

NSDate *networkDate = [NSDate networkDate]; 
0

risposta di Karan aveva alcuni errori di battitura, e anche fallito per verificare una risposta di "0" anziché solo "nil". (L'ho implementato nella mia app e ho ricevuto diversi falsi positivi da connessioni deboli o reti non autorizzate.)

L'ho adattato di seguito e ho aggiunto il codice server corrispondente per coloro che non sanno cosa si riferiva a Karan a. Questo viene implementato come un metodo categoria in un'estensione NSDate, così si può chiamare 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]; 
    } 
} 

Ed ecco il codice del server, memorizzato nella cartella principale del server come "timestamp.php"

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

Credo che i tuoi requisiti possano essere soddisfatti da alcuni servizi web che restituiscono dati json.

Uno di questi è jsontest.com: http://date.jsontest.com. Qui è quello che ritorna:

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

Il "milliseconds_since_epoch" rappresenta millisecondi dal 1970, quindi è facile da convertire in Data, utilizzando Date.init(timeIntervalSince1970: milliseconds_since_epoch/1000). Quindi possiamo usare la classe Calendar per ottenere l'ora locale.