【问题标题】:Implementing persistent countdown timer实现持久倒数计时器
【发布时间】:2015-02-11 21:07:40
【问题描述】:

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

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

我只是猜测它是这样的:

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

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

另外,如果这是一种方法,如果用户在他的设备上手动更改时间会发生什么?我们可以依靠这个或其他一些方法来跟踪游戏中特定时刻之间的实时时间吗?

【问题讨论】:

  • 也许定时器链接到服务器上的时钟?
  • 我明白了。但是,例如,当没有服务器时如何做到这一点?我在离线模式下玩过游戏,(iCloud也关闭了)并且计时器仍然有效......我不确定游戏是否依赖于服务器时间或设备上的系统时间......
  • 将开始时间写入 NSUserDefaults 并在游戏再次激活时处理经过的时间。为了防止用户弄乱他们设备上的时间,您可能必须与服务器通信才能获得准确的时间。
  • @sangony 服务器时间实际上是什么意思?哪个服务器?
  • 这是一个JSON格式的time.jsontest.com

标签: ios timer sprite-kit nsdate


【解决方案1】:

您可以通过将下一个奖励时间写入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 的帮助。

【讨论】:

  • time.jsontest.com 可能是在 iOS 应用程序中拥有远程时间权限的最简单方法。从 URL 获取简单数据,然后解析 JSON。超好的。我不知道。
猜你喜欢
  • 2020-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多