应用程序进入非活动状态时,iOS NSTimer停止

时间:2013-11-29 23:13:15

标签: ios ios7 nstimer

我一直在做一些阅读 - 我正在制作一个秒表风格的应用程序,出于habbit,我总是锁定我的屏幕。我希望我的应用程序继续倒计时。

所以似乎不活动阻止了NSTimers。我尝试添加带有值音频的UIBackgroundModes - 这似乎变成了“App播放音频或使用AirPlay传输音频/视频”但是当我锁定屏幕时计时器仍然停止。

有人可以通过这个告诉我! iOS7

2 个答案:

答案 0 :(得分:2)

你不应该在后台运行计时器。 Apple采取措施防止它,因为它会耗尽用户的电池。

不幸的是,你真的不能像Apple那样编写秒表或计时器风格的应用程序。 Apple可以访问第三方应用程序没有的系统功能,而且他们的应用程序不必遵循相同的规则。

答案 1 :(得分:0)

你绝对可以建立一个支持锁定屏幕/背景应用程序的秒表应用程序。

诀窍是简单地记录秒表启动的日期。每次需要更新显示时(例如,在计时器回调中),您只需计算自开始日期起经过的时间。

这是一个实现此行为的简单视图控制器:

@implementation StopwatchViewController
{
    NSTimer *timer;
    NSDate *timerStartDate;

    UILabel *timeLabel;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Create a label
    timeLabel = [[UILabel alloc] initWithFrame:self.view.bounds];
    timeLabel.textAlignment = NSTextAlignmentCenter;
    timeLabel.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
    timeLabel.font = [UIFont systemFontOfSize:24.0f];
    [self.view addSubview:timeLabel];

    // Start stopwatch
    [self startStopwatch];
}

#pragma mark - Time Control

- (void) startStopwatch
{
    // Record when the timer started
    timerStartDate = [NSDate date];

    // Schedule a timer to update our label
    timer = [NSTimer scheduledTimerWithTimeInterval:0.1
                                             target:self
                                           selector:@selector(timerUpdate:)
                                           userInfo:nil
                                            repeats:YES];
}

- (void) stopStopwatch
{
    [timer invalidate];

    timerStartDate = nil;
    timer = nil;
}

#pragma mark - Timer Callback

- (void) timerUpdate:(id)sender
{
    // Compute the time interval since timer start
    NSTimeInterval runTime = [[NSDate date] timeIntervalSinceDate:timerStartDate];

    timeLabel.text = [NSString stringWithFormat:@"%.1f", runTime];
}

@end

关于用户在达到特定时间时倒计时/警报,可以使用本地通知来完成。如果您从固定时间开始倒计时,那么安排本地通知将在未来发生。