25

リアルタイム イベントが発生するシステムを設計しようとしており、それらをクロックに同期させたいと考えています。 [NSDate date]通常は問題ありませんが、ユーザーがこれを変更してシステムをだますことができます。必要なのは、相対時間を取得できるクロック (たとえば、64 ビット カウンター) だけです。絶対時間 (または時刻など) は必要ありません。

私が使用できるそのような API はありますか?

編集:このクロックは、アプリケーションのセッション全体で持続する必要があることも付け加えたいと思います。

4

6 に答える 6

10

iPhoneで単調に増加する最良mach_absolute_time()の数は、最後の再起動以降のCPUティックの数です。なんらかの理由で数秒で取得したい場合は、で最も簡単に取得できますCACurrentMediaTime()

これを使用して「常に増分」を作成するのは非常に簡単です。最初の起動時に、現在の値を好きな場所に保存します。終了するとき、および定期的に、その値からのオフセットを保存します。再起動するときは、現在の値を確認してください。以前の基本値よりも小さい場合は、基本値を置き換えます(再起動があります)。

もちろん、サーバーに何かを保存しない限り、アプリを削除することでこれらすべてをクリアできます。

これは強力なセキュリティ対策としては使用できないことに注意してください。許可されたユーザーがリクエストを偽造するのを防ぐ方法はありません。したがって、「システムをごまかす」という意味によっては、解決可能な問題ではない場合があります。あなたができる最善のことは、ハックを探してそれに対処するために絶え間ない努力をすることです。

于 2012-07-10T13:05:49.687 に答える
8

単調に増加するイベントを測定するためのクロックだけが必要な場合は、現在のシステム稼働時間を ala で取得できますclock_gettime(CLOCK_MONOTONIC)。デバイスの再起動が問題になる場合は、最後に使用した値を保存し、次回の起動時に最後に保存した値をオフセットとして使用します。ここでの問題は、実際にデバイスをシャットダウンした場合、その時間がカウントされないことです。しかし、ユーザーが時間を早めることを心配している場合、彼らはそれを行うことができず、遅くするだけです。

于 2012-07-10T13:08:36.940 に答える
6

アプリでこれを使用しています

+ (NSDate *) getAWSDate
{
    NSDate *today = nil; 
   NSString *dateString = nil;

    NSString *awsURL = @"http://s3.amazonaws.com";
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:awsURL]];  
    [request setHTTPMethod:@"HEAD"];  

    NSHTTPURLResponse *response;  
    [NSURLConnection sendSynchronousRequest:request returningResponse:&response error: NULL];  

    if ([response respondsToSelector:@selector(allHeaderFields)]) {  
        dateString = [[response allHeaderFields] objectForKey:@"Date"];
        dateString = [dateString stringByReplacingOccurrencesOfString:@"GMT" withString:@"+0000"];
        NSDateFormatter *df = [[NSDateFormatter alloc] init];  
    df.dateFormat = @"EEE, dd MMM yyyy HH:mm:ss z";
    df.locale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease];  
    df.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];  
    today = [df dateFromString:dateString];
    [df release];    
    }           
    return today;
}
于 2012-07-10T13:46:17.657 に答える
5

私はmach_absolute_time()あなたが望むものかもしれないと思います。ここにはかなりの情報があります: http://developer.apple.com/library/mac/#qa/qa1398/_index.html

これは基本的に、デバイスが起動してからのティック数のカウンターです。これは再起動時にリセットされますが、それ以外は単調に増加するカウンターです。

カウンターの最後の値を保持して、カウンターが前回 (デバイスが再起動された) から減少した場合に対処することができます。この場合、最後の既知の値を現在の値に追加して、経過時間の下限を取得できます。失われるのは、最後のセッションとデバイスのシャットダウンの間の時間だけです。ただし、再起動と次のセッション。

于 2012-07-10T13:03:15.193 に答える
3

私が知っていることは、正確な時間を取得する方法は他にないということです。NTPを使用します。

ネットワーク タイム プロトコル (NTP)は、パケット交換の可変遅延データ ネットワークを介してコンピューター システムのクロックを同期するためのネットワーク プロトコルです。詳細: http://en.wikipedia.org/wiki/Network_Time_Protocol

あるプロジェクトでは、NTPを使用する予定です(明日は質問します) が、すでにいくつかの調査を行っています。

iOS ライブラリ: https://github.com/jbenet/ios-ntp - 著者のメモ: 時間の精度を数ミリ秒ではなく 1 秒以内に改善することが目標であったため、これらの RFC で説明されているように実装は厳密ではありません。 .

非営利プロジェクトについては、www.packages.ubuntu.com/source/lucid/ntp を参照してください。

C ライブラリ: www.hillstone-software.com/hs_ntp_details.htm

ドキュメント: www.nist.gov/pml/div688/grp40/its.cfm

于 2012-07-10T12:58:11.010 に答える
1

考えられる唯一のアイデアは、NTP サーバーを使用してクロックを取得することですが、それにはネットワーク接続が必要です。

于 2012-07-10T12:54:28.593 に答える