How can I get the actual date and time if the device date and time are inaccurate?
Asked Answered
D

2

9

I noticed that if I set my device time manually, and turn off the automatic time sync on my iOS device, [NSDate date] returns the date and time assuming the device time is correct--which it may not be.

Since the docs mention that NSDate has some sort of sync with NTP, I am wondering if there is any built-in way to get the accurate date and time instead of having to assume the device date and time is correct.

Decentralization answered 19/2, 2013 at 18:2 Comment(5)
I find one valuable check is to simply make sure that the phone's time value is greater than the date you shipped your app (or some such), so that you eliminate the case where the date has reset to Jan 1, 1970 or whatever. In that case throw up a message "Set your clock, you idiot!" (Or words to that effect.)Seine
@HotLicks this will in no way ensure that the time is correct as the OP is asking.Gerry
True, but it catches, especially, a lot of iPad Touches with the clock set totally wrong.Seine
@HotLicks I do see value in having this check, although this whole discussion and answers make me want to re-engineer the whole thing to not need accurate times as there seems to be no solution without 3rd-party code.Decentralization
@HotLicks fair enough :)Gerry
W
3

Perhaps https://github.com/jbenet/ios-ntp can help you? It's a library that can fetch the date and time from a time server.

What answered 19/2, 2013 at 18:6 Comment(1)
It seems this is the easiest way to do it, out of all the available options.Decentralization
E
1

I tried ios-ntp but didn't get expected results, so I found another library which is working fine and really easy to implement.

NHNetworkTime

Pods:

pod 'NHNetworkTime'
pod 'CocoaAsyncSocket'

Simple to use Import this whenever you want to get time:

#import "NHNetworkTime.h"

Call synchronize in - application: didFinishLaunchingWithOptions: to update time from server when you launch app:

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

then you can get network time when sync complete in anywhere in your source code:

NSDate *networkDate = [NSDate networkDate];

or add notification to re-update your UI in anywhere you want when time is updated:

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

Cheers !!! :)

Eudoca answered 15/12, 2017 at 5:19 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.