iOS开发 – 检查互联网时间

我正在开发一个应用程序,每5分钟重新填写一次。 什么是最好的方法来检查自上次填充以来的时间,以便用户不能通过改变设备上的时间来欺骗系统?

举一个例子,看看Candy Crush。 改变那里的系统时间会让你有更多的生命,这就是我需要防止的。

如何运行[NSTimer scheduledTimerWithTimeInterval:300.0 target:self selector:@selector(giveLife:) userInfo:nil repeats:YES];

这应该每5分钟执行一次生命,在那里你可以给予额外的生命。 据我所知,NSTimer一旦启动就不会受到改变时钟的影响。

我会build议你做一些类似于笨拙的忍者。

  • 每次应用程序变得活跃[applicationDidBecomeActive:] – 您尝试上网时间。
  • 如果设备时间时间戳小于存储的时间戳,则不允许继续。 (要求连接到互联网)。
  • 实现一个function来保存上次再生周期的时间戳。 因此,即使用户成功获得更快的实时补充,一旦他恢复到原来的时间并继续游戏,它将显示下次实时补充将是用户上次使用应用程序时的方式,而不是5分钟。 (为了惩罚作弊者)(但是也许设置一个最大限度,如果最近的再生时间比现在的时间大5分钟,那么把它设置为1小时?还是一个惩罚,但是不会那么大以至于失去一个玩家。

(基于我可以区分的)

每当应用程序变得活跃时 – 您尝试上网时间。 在这一点上 – 当应用程序打开时,您不必再检查时间,直到下一次应用程序再次变为活动状态。

在笨拙的忍者,他们允许使用应用程序,即使互联网不可用。 因此,如果我激活飞行模式(例如),将时间调整为几个小时,然后打开应用程序 – 它看到互联网不可用,因此无法比较时间。 而且 – 我必须等待修理的东西(打包袋,球等)现在已经修好了。 好极了。

但是如果我多次重复做同样的事情,最后我想回到原来的date和时间 – 并打开应用程序,就会知道有什么不对的地方。 它可能会存储一些最近打开的时间戳,如果这个时间大于实际的设备时间,那么用户可能会做一些不好的事情。 并且 – 警报出现 – 应用程序必须连接到服务器才能继续

将时间向前移动(对于用户而言,对于开发者来说是很大的)的另一个缺点是 – 有一些事情会在一段时间后自动再生,但是需要被“挑选”以便再次开始再生。 在笨拙的忍者里,鸡只偶尔会产生一个鸡蛋。 如果鸡蛋没有被拿起,它仍然有一个时间戳,当它应该/生成。 所以 – 想象一下,用户多次成功转发(直到它已经比原始时间提前了1天) – 现在他想把时间设定回原始时间,以便时钟实际上显示正确的时间。 用户这样做后 – 当应用程序打开,时间同步,但产蛋会显示,它会在1天后 – 上次保存的时间戳准备就绪。 但是,这也可以用于所有需要时间的项目。 为什么笨拙的忍者没有使用这个东西到所有的项目? 也许他们害怕,如果用户看到,很长一段时间没有任何东西可用 – 用户将停止播放。 因此 – 最好有一个骗子用户,而不是用户。

 NSURL *url = [NSURL URLWithString:@"http://www.timeapi.org/utc/now"]; NSString *str = [[NSString alloc] initWithContentsOfURL:url usedEncoding:Nil error:Nil]; str = [str stringByReplacingOccurrencesOfString:@"T" withString:@" "]; str = [str stringByReplacingOccurrencesOfString:@"+01:00" withString:@""]; NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; [dateFormat setDateFormat:@"yyyy-MM-dd hh:mm:ss"]; NSDate *date = [dateFormat dateFromString:str];