iOS中是否有可以使用的时钟,用户无法更改

时间:2012-07-10 12:45:32

标签: objective-c ios time

我正在尝试设计一个实时事件发生的系统,我想将它们与时钟同步。 [NSDate date]通常可以,但用户可以更改此设置并欺骗系统。我需要的是一个时钟,我可以从相对时间(例如64位计数器) - 我不需要绝对时间(或时间等)。

我可以使用这样的API吗?

编辑:我还想补充一点,这个时钟需要在应用程序的会话中保持持久。

6 个答案:

答案 0 :(得分:9)

iPhone上单调增加的最佳数字是mach_absolute_time(),这是自上次重启以来的CPU滴答数。如果您因任何原因希望在几秒钟内完成,则可以使用CACurrentMediaTime()轻松获取。

使用它来创建“始终增量”非常简单。首次启动时,将当前值存储在您喜欢的任何位置。退出时,定期保存该值的偏移量。重启时,检查当前值;如果它小于您之前的基值,请替换您的基值(重新启动)。

除非您在服务器上存储内容,否则可以通过删除您的应用来清除所有这些。

请注意,这不能用作强大的安全措施。无法阻止授权用户伪造请求。因此,根据“欺骗系统”的含义,它可能不是一个可解决的问题。你能做的最好的事情就是不断寻找黑客并处理它们。

答案 1 :(得分:6)

如果您只需要一个时钟来测量事件的单调递增,那么您可以获得当前系统的正常运行时间clock_gettime(CLOCK_MONOTONIC)。如果重新启动设备是个问题,只需保存最后使用的值,并在下次启动时使用上次保存的值作为偏移量。这里的问题可能是,如果他们实际关闭了设备,它将不计算那个时间。但如果你担心用户加快时间,他们就不能这样做,只会减慢速度。

答案 2 :(得分: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;
}

答案 3 :(得分:5)

我认为mach_absolute_time()可能是你想要的。这里有很多信息:http://developer.apple.com/library/mac/#qa/qa1398/_index.html

它基本上是自设备启动以来的滴答数量的计数器。这将在重启时重置,但除此之外,它是一个单调增加的计数器。

如果计数器自上次(设备重新启动)以来已减少,您可以保留计数器的最后一个值并处理它。在这种情况下,您可以将最后的已知值添加到当前值以获得已经过去的时间的下限,您丢失的是上次会话和设备关闭之间的时间,您将保持时间间隔重启和下一次会议。

答案 4 :(得分:3)

我所知道的是,没有任何其他方法可以获得正确的时间。我会使用 NTP。

  

网络时间协议(NTP)是一种网络协议,用于通过分组交换,可变延迟数据网络同步计算机系统的时钟。更多:http://en.wikipedia.org/wiki/Network_Time_Protocol

在一个项目中,我将使用 NTP (明天我会),但我已经做了一些研究:

iOS库: https://github.com/jbenet/ios-ntp - 作者注意:实施并不像那些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

答案 5 :(得分:1)

我能想到的唯一想法是使用NTP服务器来获取时钟,但这需要网络连接。