【问题标题】:ios: find real time since previous app launchios:查找自上次应用程序启动以来的实时时间
【发布时间】:2015-06-29 22:24:50
【问题描述】:

所以基本上所有内容都在标题中。我已经搜索了很多,但没有找到任何不需要互联网连接的正确解决方案。 如果用户在设置中更改时间 - 自上次启动以来我无法找到实时时间。

我的游戏需要它,每小时都需要它,即使你不玩游戏,你也会得到一些硬币。

如果用户更改设置中的时间 - 这会影响 NSDate() 中的时间并且用户可以用硬币作弊。

【问题讨论】:

标签: ios swift


【解决方案1】:

所以在应用启动时将NSDate() 保存为用户默认值。下次应用程序进入前台或再次启动时,获取当前的 NSDate 并从中减去保存的日期。这将为您提供两个日期之间的秒数。从秒计算小时只是除以 3600 的简单问题。——邓肯 C 刚刚编辑

编辑:

请注意,在较新版本的 Swift 中(从 Swift 2 开始?)大多数 Foundation 类被定义为没有 NS 前缀的原生 Swift 类。对于较新版本的 swift,请将上面所有出现的 NSDate 替换为 Date

另请注意,在 iOS ≥ 7.0 中,Calendar 有一些方法可以使这种计算更加简洁和容易。有一种新方法dateComponents(_:from:to:) 可以让您以您想要的任何单位计算两个日期之间的差异。如我原来的答案所述,您可以使用它来计算两个日期之间的秒数,而不是计算秒数。日历方法还倾向于处理边界条件,例如跨越夏令时、闰秒等。

考虑以下 Swift 4/5 操场代码:

import UIKit

let now = Date()
let randomSeconds = Double.random(in: 100000...3000000)
let later = now + randomSeconds

if let difference = Calendar.current.dateComponents([.second],
                                                    from: now,
                                                    to: later)
    .second {
    print(difference)

【讨论】:

  • 如果用户在设置中更改时间 - 这会影响该时间并且用户可以用硬币作弊。
  • 是的,这可能是真的。为避免这种情况,您可能需要互联网连接并从互联网时间服务器获取时间。
  • 然而,弄乱你设备的时间会导致各种各样的问题,所以用户必须真正想要你的游戏币才能做到这一点。
【解决方案2】:

试试这个。

步骤 1. 当用户退出游戏时。使用当前时间设置 NSUserDefault。

第 2 步。当应用启动时,在您的 appDelagate 文件中,获取此值。

第 3 步。计算两者之间的差异并相应地奖励硬币。

【讨论】:

  • 我猜伟大的思想是一样的,不管有没有裤子。
  • 伟大的头脑,我在问题的最后一行添加了,检查一下。
  • 正如邓肯所说,我认为正确的方法是从互联网时间服务器获取时间。也许您可以考虑在应用未激活时在后台运行 NSTimer,但我不确定这是否可行以及它对设备电池寿命的负面影响。
  • 我正在阅读这个,这个主题应该可以帮助你。 stackoverflow.com/questions/12221528/…
猜你喜欢
  • 1970-01-01
  • 2014-06-10
  • 1970-01-01
  • 1970-01-01
  • 2010-09-23
  • 1970-01-01
  • 1970-01-01
  • 2015-04-16
  • 2010-10-23
相关资源
最近更新 更多