2009-09-18 9 views
5

Muszę się upewnić, że moja aplikacja pobiera prawidłowy czas, a nie czas ustawiony przez użytkownika w ustawieniach.Jak mogę uzyskać w czasie rzeczywistym iPhone'a, a nie czas ustawiony przez użytkownika w Ustawieniach?

Na przykład, gdy użytkownik uruchomi aplikację, chciałbym otrzymać znacznik czasu. Użytkownik będzie na bieżąco sprawdzać upływ czasu na zegarze na ekranie. Gdy użytkownik wyjdzie z aplikacji i po pewnym czasie uruchomi ponownie aplikację, licznik czasu uzyska aktualny czas i porówna go z oryginalnym znacznikiem czasowym, który zatrzymał. Zasadniczo, podobnie jak stoper w Clock.App na iPhone.

Teraz problem z clock.app polega na tym, że jeśli użytkownik pójdzie i zwiększy czas w Ustawieniach o godzinę, wpłynie to na czasomierz. Oczywiście nie chcę tego, ponieważ w mojej aplikacji byłoby to oszukiwanie.

Będę potrzebować bardziej wiarygodnego źródła czasu do porównania.

Mogę uzyskać czas z Internetu. Problem polega jednak na tym, że potrzebuję połączenia z Internetem, więc działa tylko wtedy, gdy jest połączenie internetowe. Moja aplikacja musi działać najlepiej w trybie offline.

Czy jest jakiś wewnętrzny zegar, do którego mogę uzyskać dostęp?

Czy istnieje sposób sprawdzenia, czy użytkownik zmienił datę w Ustawieniach?

Jakieś inne pomysły?

Dzięki

+0

przypadkowo czasie rzeczywistym ... czy to źle? –

+0

Czy byłoby możliwe uzyskanie czasu z GPS? – Maxm007

+1

Musisz uzyskać czas z jakiegoś zewnętrznego źródła (NIST, GPS, system telefonii komórkowej, może nawet przez sniffowanie pakietów dla ruchu innych ludzi, który ma właściwe dane), jak każdy wewnętrzny zegar może być zmyty. OTOH, jeśli nie ufasz użytkownikowi, nie powinieneś nawet robić tego w systemie klienta. – BCS

Odpowiedz

1

uzyskać czas z NIST z Protokołem dzień:

UDP Based Daytime usługi Serwer nasłuchuje datagramów UDP na porcie UDP 13. Po odebraniu datagram, datagram zgłoszeniowy jest wysyłany zawierające aktualną datę i czas jako ciąg znaków ASCII (dane w odebranym datagramie są ignorowane).

NIST Format odpowiedzi: 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

Witam, nie można używać czasu internetowego, ponieważ moja aplikacja musi działać w trybie offline. – Maxm007

1

Najlepszym rozwiązaniem mam wymyślić with używa zegara maszynowego, który liczy jednostki czasu od ostatniego uruchomienia iPhone'a.

Działa to świetnie. Jedynym ograniczeniem jest to, że użytkownik nie może mieć możliwości ponownego uruchomienia komputera lub może to unieważnić jego czas.

Wykrywam ponowne uruchomienie, początkowo przechowując znacznik czasu iphone związany z zegarem machu, a następnie sprawdzając za każdym razem, gdy aplikacja się uruchamia, więc nie zmieniło się. Jest to efekt uboczny, że jeśli użytkownik zmieni iPhone'a w DateTime w czasie, w którym jest on ustawiony na czas, to również unieważni wynik, ale to jest w porządku.

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

mogę łatwo ostrzec swoich użytkowników o tym: restartu lub zmiany czasu iphone gdy jesteś na zegarze będzie unieważnienie zdobył czasu.

0

Właśnie napisali następujące here:

Działa to uzyskać czas GPS:

#import <CoreLocation/CoreLocation.h> 

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

To nie wydają się być odporne na manipulacje chociaż.

Próbowałem tego kodu na iPhone 4 w trybie samolotowym (iOS 6.1), a nawet wtedy daje czas w porządku. Ale niestety ten czas wydaje się zmieniać wraz z zegarem systemowym. Ugh.

Zabawne, że znalazłem (nadal w trybie samolotowym) jest to, że jeśli manipulować przy zegarze systemowym (po włączeniu do off Czas & Data na Set Automatically), a następnie włącz Set Automatically z powrotem do on, urządzenie odtwarza prawdziwe (Original) czas bez żadnych problemów. działa to nawet po wyłączeniu zasilania telefonu. Wygląda więc na to, że istnieje coś w rodzaju czasu zabezpieczenia przez wewnętrznym zabezpieczeniem urządzenia. Ale jak uzyskać dostęp do tego?

+0

Ta metoda ustawi tylko datę i godzinę z ustawień urządzenia –

0

Ta metoda znajdzie rzeczywisty czas aktualny, znajdujący się w nagłówku odpowiedzi na 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]; 
Powiązane problemy