2013-02-19 21 views
7

Zauważyłem, że jeśli ręcznie ustawię czas urządzenia i wyłączę automatyczną synchronizację czasu na urządzeniu z iOS, [NSDate date] zwróci datę i godzinę, zakładając, że czas urządzenia jest prawidłowy - co może nie być.Jak mogę uzyskać aktualną datę i godzinę, jeśli data i godzina urządzenia są niedokładne?

Ponieważ dokumenty mówią, że NSDate ma jakiś rodzaj synchronizacji z NTP, zastanawiam się, czy istnieje jakiś wbudowany sposób na uzyskanie dokładnej daty i godziny, zamiast zakładać, że data i godzina urządzenia są poprawne.

+0

Uważam, że jedną cenną sprawą jest po prostu upewnienie się, że wartość czasu telefonu jest większa niż data wysłania aplikacji (lub niektórych takich), aby wyeliminować przypadek, w którym data została zresetowana do 1 stycznia, 1970 lub cokolwiek innego. W takim przypadku wyślij wiadomość "Ustaw zegar, idioto!" (Lub słowa w tym celu). –

+0

@HotLicks to w żaden sposób nie zapewni, że czas jest prawidłowy, o co pyta OP. – twaldron

+0

To prawda, ale przydaje się, zwłaszcza, dużo iPad Touches z zegarem całkowicie źle. –

Odpowiedz

3

Może ci pomóc https://github.com/jbenet/ios-ntp? Jest to biblioteka, która może pobrać datę i godzinę z serwera czasu.

+0

Wygląda na to, że jest to najprostszy sposób, spośród wszystkich dostępnych opcji. – Anton

+0

Jakie inne opcje można rozwiązać, aby rozwiązać ten problem? – AppsDev

0

Próbowałem ios-ntp, ale nie przyniosłem oczekiwanych wyników, więc znalazłem inną bibliotekę, która działa dobrze i naprawdę łatwa do wdrożenia.

NHNetworkTime

Dozetki

pod 'NHNetworkTime' 
pod 'CocoaAsyncSocket' 

Prosty w użyciu Importuj to, gdy chcesz uzyskać czas:

#import "NHNetworkTime.h" 

połączeń synchronizacji w - zgłoszenie: didFinishLaunchingWithOptions: Aby zaktualizować czas od serwer po uruchomieniu aplikacji:

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

następnie można uzyskać czas sieciowego podczas synchronizacji kompletne w dowolnym miejscu w kodzie źródłowym:

NSDate *networkDate = [NSDate networkDate]; 

lub dodać powiadomienie aby ponownie zaktualizować swoje UI w dowolnym miejscu, kiedy czas jest aktualizowany:

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

Pozdrawiam !!! :)