1

何らかの理由で、タイマーがフォアグラウンドでしか実行されません。ここで解決策を検索しましたが、良い解決策が見つかりませんでした。私のタイマーは Core Data を使用し、私の timeInterval はデクリメントごとに保存されます。また、UILocalNotification を送信していますが、うまくいきません。フォアグラウンドにある場合、アラートビューを送信しないと想定しています..まあ、これは私が今持っているものです:

-(IBAction)startTimer:(id)sender{
    if (timer == nil) {
        [startButton setTitle:@"Pause" forState:UIControlStateNormal];
       timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerAction:) userInfo:nil repeats:YES];
    } else {
        [startButton setTitle:@"Resume" forState:UIControlStateNormal];
        [timer invalidate];
        timer = nil;
    }

}
-(void)timerAction:(NSTimer *)t
{
    if(testTask.timeInterval == 0)
    {
        if (self.timer)
        {
            [self timerExpired];
            [self.timer invalidate];
            self.timer = nil;
        }
    }
    else
    {
        testTask.timeInterval--;
        NSError *error;
        if (![self.context save:&error]) {
            NSLog(@"couldn't save: %@", [error localizedDescription]);
        }
    }
    NSUInteger seconds = (NSUInteger)round(testTask.timeInterval);
    NSString *string = [NSString stringWithFormat:@"%02u:%02u:%02u",
                        seconds / 3600, (seconds / 60) % 60, seconds % 60];
    timerLabel.text = string;
    NSLog(@"%f", testTask.timeInterval);
}
-(void)timerExpired{
    UILocalNotification* localNotification = [[UILocalNotification alloc] init];
    localNotification.alertBody = @"Time is up";
    localNotification.alertAction = @"Ok";
    localNotification.timeZone = [NSTimeZone defaultTimeZone];
    [[UIApplication sharedApplication]presentLocalNotificationNow:localNotification];
}

タイマーをバックグラウンドで動作させるためのガイダンスをいただければ幸いです (Apple のタイマーのように)。アプリケーションがバックグラウンドにある場合でも、testTask.timeIntervalを更新する必要があるため、NSDateComponentsをどのように使用するかわかりません..

4

2 に答える 2

6
UIBackgroundTaskIdentifier bgTask =0;
UIApplication  *app = [UIApplication sharedApplication];
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
    [app endBackgroundTask:bgTask];
}];

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0
           target:self
           selector:@selector(timerCountDown:)
           userInfo:nil
           repeats:YES];

このメソッドを使用して、通知を起動します。タイマーはバックグラウンドで実行されます。

于 2013-08-04T11:09:43.277 に答える