实现持久倒数计时器

时间:2015-02-11 21:07:40

标签: ios timer sprite-kit nsdate

某些游戏中某些操作与时间有关。例如,如果用户玩游戏,则每24小时获得一个积分...我们关闭手机并在几小时后回来计时器设置正确。

这是怎么做到的?必须有一些方法将当前时间写入持久存储,然后从中读取?

我只是猜测它是这样的:

 NSDate * now = [NSDate date];
 NSDateFormatter *outputFormatter = [[NSDateFormatter alloc] init];
 [outputFormatter setDateFormat:@"HH:mm:ss"];
 NSString *newDateString = [outputFormatter stringFromDate:now];

然后是将newDateString写入持久存储的部分。

另外,如果这是一种方法,如果用户在他的设备上手动更改时间会怎样?我们可以依靠这个还是有其他一些方法来跟踪游戏中某些时刻之间的实时传递?

1 个答案:

答案 0 :(得分:2)

您可以将下一个奖励时间写入NSUserDefaults并比较以前的值。

// Fetch previous "next award" time.
NSNumber *previousTime = [[NSUserDefaults standardUserDefaults] objectForKey:@"next_award_time"];
NSTimeInterval now = [[NSDate date] timeIntervalSince1970];

// If we haven't yet scheduled a "next award" time, or if we've passed it..
if (!previousTime || [previousTime doubleValue] < now) {
  // We had a previous value, so we've passed the time.
  if (previousTime) {
    // Award user.
  }
  // Set next award time.
  NSTimeInterval nextTime = [[NSDate date] timeIntervalSince1970] + 60*60*24;
  [[NSUserDefaults standardUserDefaults] setObject:@(nextTime) forKey:@"next_award_time"];
}

至于担心用户更改自己的设备时间,您需要向无偏的第三方时钟发出网络请求。这可能是您控制的服务器或众所周知的时间服务器。您可能需要查看this answer以获取有关如何联系NTP的帮助。

相关问题