2013-02-19 8 views
7

Ho notato che se ho impostato manualmente l'ora del mio dispositivo e disattiva la sincronizzazione automatica dell'orario sul mio dispositivo iOS, [NSDate date] restituisce la data e l'ora presumendo che l'ora del dispositivo sia corretta, il che potrebbe non essere.Come posso ottenere la data e l'ora effettive se la data e l'ora del dispositivo sono imprecise?

Poiché i documenti menzionano che NSDate ha una sorta di sincronizzazione con NTP, mi chiedo se non vi è alcun modo incorporato per ottenere la data e l'ora precise invece di dover assumere la data e l'ora del dispositivo è corretta.

+0

Trovo che un controllo importante sia semplicemente assicurarsi che il valore temporale del telefono sia maggiore della data in cui è stata spedita l'app (o alcuni di essi), in modo da eliminare il caso in cui la data è stata reimpostata a 1 gen. 1970 o qualsiasi altra cosa. In tal caso, lancia un messaggio "Imposta il tuo orologio, idiota!" (O parole in tal senso.) –

+0

@HotLicks questo non garantirà in alcun modo che l'ora sia corretta come chiede l'OP. – twaldron

+0

Vero, ma cattura, soprattutto, un sacco di Tocchi iPad con l'orologio impostato totalmente sbagliato. –

risposta

3

Forse https://github.com/jbenet/ios-ntp può esserti di aiuto? È una libreria che può recuperare la data e l'ora da un server orario.

+0

Sembra che questo sia il modo più semplice per farlo, tra tutte le opzioni disponibili. – Anton

+0

Quali altre opzioni potrebbero esserci per risolvere questo problema? – AppsDev

0

Ho provato ios-ntp ma non ho ottenuto risultati attesi, quindi ho trovato un'altra libreria che funziona bene e davvero facile da implementare.

NHNetworkTime

Baccelli:

pod 'NHNetworkTime' 
pod 'CocoaAsyncSocket' 

Semplice da usare importare questo ogni volta che si desidera ottenere il tempo:

#import "NHNetworkTime.h" 

chiamata sincronizzare in - applicazione: didFinishLaunchingWithOptions: per aggiornare il tempo da server all'avvio dell'app:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    [[NHNetworkClock sharedNetworkClock] synchronize]; 
    return YES; 
} 

allora si può ottenere il tempo di rete quando la sincronizzazione completa in qualsiasi punto del codice sorgente:

NSDate *networkDate = [NSDate networkDate]; 

o aggiungere la notifica di ri-aggiornamento l'interfaccia utente in qualsiasi luogo si vuole quando il tempo viene aggiornato:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkTimeSyncCompleteNotification:) name:kNHNetworkTimeSyncCompleteNotification object:nil]; 

Saluti !!! :)

Problemi correlati