Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c iOS中是否有用户无法更改的时钟_Objective C_Ios_Time - Fatal编程技术网

Objective c iOS中是否有用户无法更改的时钟

Objective c iOS中是否有用户无法更改的时钟,objective-c,ios,time,Objective C,Ios,Time,我正在尝试设计一个系统,在这个系统中,实时事件会发生,我想将它们与时钟同步[NSDate date]通常是可以的,但用户可以更改此设置并欺骗系统。我所需要的是一个时钟,我可以采取相对时间(例如64位计数器)-我不需要绝对时间(或一天的时间等) 有这样的API我可以使用吗 编辑:我还想补充一点,这个时钟需要在应用程序的会话中保持不变。我能想到的唯一办法是使用NTP服务器来获取时钟,但这需要网络连接。据我所知,没有任何其他方法来获取正确的时间。我会使用NTP。 网络时间协议(NTP)是一种网络协议,

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

有这样的API我可以使用吗


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

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

据我所知,没有任何其他方法来获取正确的时间。我会使用NTP。

网络时间协议(NTP)是一种网络协议,用于在分组交换、可变延迟数据网络上同步计算机系统的时钟。更多:

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

iOS库:-作者注意:实施不像RFC中描述的那样严格,因为目标是将时间精度提高到一秒钟,而不是几毫秒

对于非商业项目,请访问:www.packages.ubuntu.com/source/lucid/ntp

C库:www.hillstone-software.com/hs\u ntp\u details.htm


文档:www.nist.gov/pml/div688/grp40/its.cfm

我认为
马赫绝对时间()
可能是您想要的。这里有很多信息:

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


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

iPhone上最好的单调递增数字是
mach\u absolute\u time()
,这是自上次重新启动以来的CPU滴答数。如果您出于任何原因希望以秒为单位获取它,那么使用
CACurrentMediaTime()
最容易获取它

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

当然,所有这些都可以通过删除你的应用程序来清除,除非你在服务器上存储了一些东西


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

如果你只需要一个时钟来测量单调递增的事件,你只需要得到当前系统的正常运行时间ala
clock\u gettime(clock\u MONOTONIC)
。如果重新启动设备有问题,只需保存上次使用的值,并在下次启动时使用上次保存的值作为偏移量。这里的问题可能是,如果他们真的关闭了设备,那就不算时间了。但是,如果你担心用户加速时间,他们就不能这样做,只能放慢速度。

我正在我们的应用程序中使用这个

+ (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;
}

是的,我希望避免这种情况。一个用户为了作弊而伪造时钟时间,也可以伪造你的NTP服务器。他们当然可以,但这比在用户控制面板中弄乱日期/时间设置要复杂得多。我有一些朋友,他们一点也不懂技术,他们发现他们可以通过这种方式欺骗游戏(或者他们可能在网上读到这方面的信息,无论什么),但这真的很容易做到。这些人不知道NTP是什么,更不用说他们有动机或能力欺骗服务器了,即使这对一个经验丰富的黑客来说很容易。@Suboptimus,很好的观点。我仍然想知道,当没有网络连接时,应用程序会做什么。它应该停止工作,还是信任用户定义的时间?经验法则是:“如果它在用户的设备上,他可以搞乱它。”这可能不是100%正确,但非常接近。然而,必须有一个低级别的、持久的时钟(即使通过公共API无法访问)。如果没有,设备如何知道它开启的时间?如果你能利用它,你至少可以得到会话之间的相对秒数。该设备可以得到上次关机和此次启动之间的时间,但一旦启动,它可能会被弄乱,到你的应用启动时,所有赌注都被取消了。基本上是同一个问题:他需要一个时钟在会话之间保持,所以这不会有帮助。mach_absolute_time()仅在设备重新启动时重置。如果您想象这样的场景,即用户重置iphone,玩游戏并在5分钟后关闭,然后再次重置iphone并在5分钟后玩游戏,计数器可能不会减少。但这似乎是最可靠的方法——我只会浪费时间,但不会加快速度。谢谢你的代码。如果我决定使用时间服务器,我将使用它。目前,我正试图避免网络连接。奇怪的事情。我用这个代码在iPadAir上得到了“(空)”。有了老款iPad(第三代)和模拟器,它就可以工作了!两者都运行iOS 8.0.2。有什么想法吗?当S3在本周出现问题时,这是如何处理的?有没有关于时钟时间(时钟单调)的文档?我找到了。我试着包括/导入