2009-09-18 2 views
5

私のアプリが正しい時間を得られるようにする必要があります。ユーザーが設定した時間ではありません。設定でユーザーが設定した時間ではなく、iPhoneでリアルタイムを取得するにはどうすればよいですか?

たとえば、ユーザーがアプリを起動すると、タイムスタンプを取得したいと考えています。ユーザーは、毎秒更新される画面上のタイマーの経過時間を見ることになります。ユーザーがアプリを終了し、アプリを再起動した後、タイマーは現在の時刻を取得し、元のタイムスタンプと比較します。だから、基本的に、ちょうどiPhoneのClock.Appのストップウォッチのように。

ここでclock.appの問題は、ユーザーが設定に進み、1時間進めると、これがタイマーに影響することです。明らかに、私はそれが欲しいとは思わない。なぜなら、私のアプリでは、それは不正行為だからだ。

私は、より信頼できるタイムソースを比較する必要があります。

私はインターネットから時間を得ることができました。しかし、問題は私はインターネット接続が必要だということです、インターネット接続がある場合にのみ動作します。私のアプリはオフラインで作業する必要があります。

私はアクセスできる内部クロックはありますか?

ユーザーが[設定]で日付時刻を変更したかどうかを確認する方法はありますか?

他のアイデアはありますか?

おかげ

+0

を誤っIリアルタイム...悪いということでしょうか? –

+0

GPSから時刻を取得することは可能でしょうか? – Maxm007

+1

内部クロックが混乱する可能性があるので、外部ソース(NIST、GPS、携帯電話システム、おそらく適切なデータを持つ他の人のトラフィックのパケットスニッフィングによってさえ)から時間を取得する必要があります。 OTOH、あなたがユーザーを信用しないなら、あなたはクライアントのシステムでこれをしてはいけません。 – BCS

答えて

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

1

私が作ってみた最適なソリューションと最後のiPhoneのブートからの時間単位を数えるマッハタイマーを使用しています。

これは素晴らしいです。唯一の制限は、ユーザーが再起動することができないか、自分の時間を無効にすることです。

私は、最初にマッハタイマーに関連付けられたiphoneタイムスタンプを保存してから、アプリが起動するたびにチェックして、変更されていないことを確認します。これは副作用として、ユーザーがiPhone DateTimeをタイムアウトしている間に変更すると、スコアも無効になりますが、それは問題ありません。再起動や、あなたの得点の時間を無効にするクロックにしている間、iphone時間を変更:

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

私は簡単にこれについての私のユーザーに警告することができます。

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に投入後)、システムクロックを改ざんし、その後onに戻っSet Automaticallyをオンにした場合、マシンは本物(オリジナルを復元することです)時間がかかることはありません。これは、電話の電源を入れ直した後でも機能します。だから、で、デバイスが内部的に管理している耐タンパー時間のようなものだと思われます。しかし、これにアクセスするには?

+0

このメソッドは、デバイスの設定からの日付と時刻のみを設定します –

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]; 
関連する問題