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

Cth*_*utu 24 time objective-c ios

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

我可以使用这样的API吗?

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

Rob*_*ier 9

iPhone上最好的单调递增数字是mach_absolute_time()自上次重启以来的CPU滴答数.如果您因任何原因想在几秒钟内完成它,那么最容易获取它CACurrentMediaTime().

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

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

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


Ed *_*rty 6

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


msk*_*msk 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;
}
Run Code Online (Sandbox Code Playgroud)


hyp*_*ypt 5

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

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

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