实现持久性倒数计时器
Implementing persistent countdown timer
有些游戏的某些动作与时间相关。例如,如果用户玩了一款游戏,每 24 小时他就会获得一个积分......在我们关闭我们的 phone 并在正确设置几个小时后回来。
这是怎么做到的?一定有某种方法可以将当前时间写入持久存储然后从中读取?
我只是猜测它是这样的:
NSDate * now = [NSDate date];
NSDateFormatter *outputFormatter = [[NSDateFormatter alloc] init];
[outputFormatter setDateFormat:@"HH:mm:ss"];
NSString *newDateString = [outputFormatter stringFromDate:now];
然后是将 newDateString 写入持久存储的部分。
此外,如果这是一种方法,如果用户在他的设备上手动更改时间会怎样?我们可以依靠这个还是有一些其他方法来跟踪游戏中特定时刻之间经过的实时时间?
您可以通过将下一个奖励时间写入 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 的帮助。
有些游戏的某些动作与时间相关。例如,如果用户玩了一款游戏,每 24 小时他就会获得一个积分......在我们关闭我们的 phone 并在正确设置几个小时后回来。
这是怎么做到的?一定有某种方法可以将当前时间写入持久存储然后从中读取?
我只是猜测它是这样的:
NSDate * now = [NSDate date];
NSDateFormatter *outputFormatter = [[NSDateFormatter alloc] init];
[outputFormatter setDateFormat:@"HH:mm:ss"];
NSString *newDateString = [outputFormatter stringFromDate:now];
然后是将 newDateString 写入持久存储的部分。
此外,如果这是一种方法,如果用户在他的设备上手动更改时间会怎样?我们可以依靠这个还是有一些其他方法来跟踪游戏中特定时刻之间经过的实时时间?
您可以通过将下一个奖励时间写入 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 的帮助。