我在IOS中有一个像计时器这样的应用程序。在第一个屏幕上我有按钮,当我点击它时计时器启动,经过一段时间说30秒我运行我的应用程序然后我停止我的应用程序(不在后台),我终止应用程序。在计时器显示1分钟后我重新打开我的应用程序,这工作正常,但是当我更改设备系统时间时,计时器显示不同的时间。
NSTimeInterval oldTimeInterval = [[NSUserDefaults standardUserDefaults] doubleForKey:PunchInTimeWhenGoneBackgroundKEY];
NSTimeInterval currentTimeInterval = [[NSDate date] timeIntervalSince1970];
//if(currentTimeInterval>oldTimeInterval)
//{}
WORKING_TIME = WORKING_TIME + (currentTimeInterval - oldTimeInterval) + 1;
if(timerWorkTime!=nil)
{
[timerWorkTime invalidate];
timerWorkTime = nil;
}
timerWorkTime = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(funCalculateWorkingTime) userInfo:nil repeats:YES];
-(void)funCalculateWorkingTime
{
WORKING_TIME++;
workingHour = (int) WORKING_TIME / 3600;
WorkingMin = (int) WORKING_TIME / 60;
WorkingSecond = (int) WORKING_TIME % 60;
lblWorkingTime.text = [NSString stringWithFormat:@"%.2d : %.2d : %.2d",workingHour,WorkingMin,WorkingSecond];
earnedMoney = ((float)WORKING_TIME * HOURLY_RATE)/3600.0;
lblTotalEarned.text = [NSString stringWithFormat:@"$%.2f",earnedMoney];
// NSLog(@"time : %@",lblWorkingTime.text);
}
请帮帮我。 提前谢谢。
答案 0 :(得分:0)
我不知道如何在不使用服务器提供计时器功能的情况下纠正此问题。
如果应用程序无法在后台运行,即使应用程序未运行,您设置为保存和检查的任何计时器都将依赖于本地设备的系统时间。对系统时间的任何改变都会搞砸了。
我唯一的想法是创建一个非常简单的服务器组件,您可以在该站点上注册计时器,然后在启动时检查服务器以查看可用的计时器以及剩余时间。
编辑:您可以使用一个选项,但这不是万无一失的。您可以使用CACurrentMediaTime()
获取相对于启动时间的时间。如果用户更改时区,或手动更改系统日期,则不会受到影响。它仍然是相对于上一次系统启动。不好的一面是,如果用户重新启动手机,它将会丢弃所有计时器。
答案 1 :(得分:0)
请勿使用系统时间进行测量。使用UserDefaults或您自己的属性列表存储时差。