为什么NSTimer可以在后台模式下延迟?

时间:2017-03-29 18:00:08

标签: ios objective-c nstimer nsrunloop background-audio

我的应用在后台运行,并使用NSTimer在一段时间后启动音频。我和我的测试人员对此没有任何问题,音频可以在后台几小时后启动事件(> 10h)。

我的问题是有些用户报告音频经常被延迟,有时会延迟几分钟,有时会延迟一小时。

我这样做:

UIApplication * app = [UIApplication sharedApplication];
  bgTask = [app beginBackgroundTaskWithExpirationHandler:nil];

dispatch_async(dispatch_get_main_queue(), ^{
    theTimer = [NSTimer scheduledTimerWithTimeInterval:[theDateIWant timeIntervalSinceNow] target:self selector:@selector(playAudio) userInfo:nil repeats:NO];
    });

我的问题是:

- 系统可以延迟NSTimer吗?如果是这样如何解决这个问题? - 如何重现这类问题? - 使用以下内容更安全吗?

theTimer = [[NSTimer alloc] initWithFireDate:theDateIWant interval:0.0 target:self selector:@selector(playAudio) userInfo:nil repeats:NO];
[[NSRunLoop mainRunLoop] addTimer:theTimer
                          forMode:NSDefaultRunLoopMode];

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

在我看来,你理解背景任务有点不对劲。

执行第一个代码段时(我假设您将其放在applicationDidEnterBackground方法中),它表示系统

  

我有一个小任务要执行,请等一会儿直到我完成   它!

并且系统将等待大约5-10分钟,然后暂停应用程序。

如果您需要报警,可以使用LocalNotification在指定时间播放特定声音。