2009-09-18 28 views
5

我需要確保我的應用獲得正確的時間,而不是用戶在設置中設置的時間。如何在iPhone中獲得實時時間,而不是用戶在設置中設置的時間?

因此,例如,一旦用戶啓動應用程序,我想要得到一個時間戳。用戶會在屏幕上每秒更新一次定時器。當用戶退出應用程序,並在一段時間重新啓動應用程序後,計時器將獲取當前時間並將其與它保留的原始時間戳進行比較。所以基本上,就像iPhone上的Clock.App中的秒錶一樣。

現在clock.app的問題是,如果用戶在設置中前進一個小時,這會影響計時器。很顯然,我不希望這樣,因爲在我的應用程序中,這會是作弊。

我需要得到一個更值得信賴的時間來源比較。

我可以從互聯網上得到時間。但問題是我需要互聯網連接,所以只有在有互聯網連接的情況下才能使用。我的應用需要離線工作。

是否有某種我可以訪問的內部時鐘?

是否有方法檢查用戶是否更改了設置中的日期時間?

還有其他想法嗎?

由於

+0

我不小心實時...是壞? – 2009-09-18 10:26:10

+0

是否有可能從GPS獲得時間? – Maxm007 2009-09-18 13:03:13

+1

因爲任何內部時鐘都可能會混淆,所以您需要從某個外部源(NIST,GPS,手機系統,甚至可以通過數據包嗅探具有正確數據的其他人的流量)獲得時間。 OTOH,如果你不信任用戶,你甚至不應該在客戶端的系統上這樣做。 – BCS 2009-09-18 16:18:56

回答

1

獲得從NIST與白天議定書時間:

UDP基於白天服務 服務器監聽UDP端口13中。當接收到一個數據報上的UDP數據報,應答數據報被髮送包含當前日期和時間作爲ASCII字符串(忽略接收的數據報中的數據)。

響應

NIST格式: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

嗨,不能使用互聯網時間,因爲我的應用程序需要脫機工作。 – Maxm007 2009-09-18 12:42:10

1

最好的解決方案我已經出來正在使用自上次iphone啓動以來的計時單位計時器。

This works great。唯一的限制是用戶不能被允許重新啓動,否則會使他的時間無效。

我通過最初存儲與mach計時器相關的iphone時間戳檢測到重新啓動,然後每次啓動應用程序時都檢查,因此它沒有改變。這有一個副作用,即如果用戶在計時時更改iPhone DateTime,這也會使得分數無效,但這沒關係。

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

我可以很容易地提醒我關於這個用戶:重新啓動或更改iphone的時間,而你的時鐘會取消進球的時間。

0

我只是發表了以下here

此作品獲得GPS時間:

#import <CoreLocation/CoreLocation.h> 

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

這似乎並沒有被防篡改雖然。

我在飛機模式(iOS 6.1)的iPhone 4上試過這段代碼,即使這樣,它也給了一段時間。但不幸的是,這一次似乎隨着系統時鐘而改變。啊。

,我發現(仍處於飛行模式),有趣的是,如果你與系統時鐘篡改(轉向off時間後&日期的Set Automatically),然後轉Set Automaticallyon,機器恢復真正的(原)時間順利。即使在關閉手機的電源之後,這種方式仍然有效所以看起來有類似於設備內部維持的防篡改時間。但如何訪問這個?

+0

此方法將僅從設備設置中設置日期和時間 – 2015-12-09 09:58:50

0

這種方法會發現當前的實際時間,在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]; 
相關問題