Ios 计时器在后台运行时间不超过3分钟

Ios 计时器在后台运行时间不超过3分钟,ios,swift,nstimer,background-process,Ios,Swift,Nstimer,Background Process,我正在开发冥想应用程序。在这个应用程序中,我有一些音乐内容和一些使用定时器的静默冥想部分。计时器在前台时工作正常,但在后台仅运行3分钟。当设备锁定或用户按下home按钮退出应用程序时。我用的是swift4。我所尝试的: var timer: Timer! var timeCounter : Int! var backgroundTaskIdentifier: UIBackgroundTaskIdentifier? var backgroundTask = BackgroundTask() @I

我正在开发冥想应用程序。在这个应用程序中,我有一些音乐内容和一些使用定时器的静默冥想部分。计时器在前台时工作正常,但在后台仅运行3分钟。当设备锁定或用户按下home按钮退出应用程序时。我用的是swift4。我所尝试的:

var timer: Timer!
var timeCounter : Int!
var backgroundTaskIdentifier: UIBackgroundTaskIdentifier?
var backgroundTask = BackgroundTask()

@IBOutlet weak var timeLabel: UILabel!

 override func viewDidLoad() {
    super.viewDidLoad()

     self.backgroundTaskIdentifier = UIApplication.shared.beginBackgroundTask(expirationHandler: {
        UIApplication.shared.endBackgroundTask(self.backgroundTaskIdentifier!)
    })

    backgroundTask.startBackgroundTask()

    DispatchQueue.global(qos: .background).async {
    let currentRunLoop = RunLoop.current
        let timeInterval = 1.0
        self.timer = Timer.scheduledTimer(timeInterval: timeInterval, target: self, selector: #selector(self.updateTimer), userInfo: nil, repeats: true)
        self.timer.tolerance = timeInterval * 0.1
        currentRunLoop.add(self.timer, forMode: .commonModes)
        currentRunLoop.run()
    }
  }
}

 @objc func updateTimer () { 
    timeCounter = timeCounter - 1
    let minutes = Int(timeCounter) / 60 % 60
    let seconds = Int(timeCounter) % 60

    print("timeCounter", timeCounter)
    if (timeCounter == 0){
        if self.timer != nil {
            self.timer?.invalidate()
            self.timer = nil
            player.play()
        }
    }

    timeLabel.fadeTransition(0.4)
    timeLabel.text = String(format: "%02i:%02i",minutes,seconds)
}

提前感谢。

一般来说,操作系统在后台运行的时间有限。您可以使用以下方法检查背景剩余时间并作出反应:

UIApplication.shared.backgroundTimeRemaining
如果条件良好,则解锁设备,电池已满。。。你通常会有160-180秒的时间

您可以在中找到详细信息

当您想要播放音频时,可以使用播放音频背景模式,以避免被操作系统切断:

根据您播放音频的方式,可能也会有所改进

编辑:
我现在从你的评论中了解到,你希望你的应用程序每4分钟做一次操作。我看到的唯一可能性就是使用该功能。但这并不保证固定的时间间隔。

一般来说,操作系统在后台运行的时间有限。您可以使用以下方法检查背景剩余时间并作出反应:

UIApplication.shared.backgroundTimeRemaining
如果条件良好,则解锁设备,电池已满。。。你通常会有160-180秒的时间

您可以在中找到详细信息

当您想要播放音频时,可以使用播放音频背景模式,以避免被操作系统切断:

根据您播放音频的方式,可能也会有所改进

编辑:
我现在从你的评论中了解到,你希望你的应用程序每4分钟做一次操作。我看到的唯一可能性就是使用该功能。但这并不能保证固定的时间间隔。

谢谢您的回复。@Shallow…我已经这样做了,我的音乐播放器正在工作,但我希望在后台运行计时器,以便用户选择冥想的时间。可能需要1小时或更长时间。所以我的问题是计时器在后台运行的时间没有超过3分钟。如何运行此功能?请参阅我的更新答案。这是不可能的。您可以安排通知提醒用户,但她必须单击通知,然后才能运行应用程序。谢谢回复。@Shallow…我已经完成了此操作,我的音乐播放器正在工作,但我希望在后台运行计时器,以便用户选择冥想的时间。可能需要1小时或更长时间。所以我的问题是计时器在后台运行的时间没有超过3分钟。如何运行此功能?请参阅我的更新答案。这是不可能的。你可以安排通知提醒用户,但她必须单击通知,然后才能运行应用程序。这不是你想要的方法。计时器不会在后台运行。您几乎不应该调用runloop.run;这是一件非常高级的事情。而且,当您完成后台任务时,您并没有正确地结束它—您只是在过期时才这样做,这是不好的做法。精确的解决方案将取决于你正在做什么。你可能想成为一个音乐应用程序,并利用它来驱动其他一切。您可能想考虑无声音频,这对电池有点不好,但对于用户体验可能是理想的。您还可以查看用户通知来计时。根据您到目前为止所描述的,我认为您确实可以使用标准工具构建一些非常好的东西。NSTimer并不合适,这完全取决于您想要的用户体验。感谢回复@RobNapier。。。。我如何解决这个问题?对于这种情况,您建议的最佳解决方案是什么。因此,当用户锁定设备屏幕时,我可以长时间播放计时器。解决此问题将完全取决于您的用例;当您播放音频和必须运行代码时。你所描述的只是一个背景应用程序,当你想保持沉默时,它可以播放沉默的音频,这将是最简单的。See和@RobNapier:如果苹果发现在后台播放音频内容的应用程序必须播放音频内容,而不是静音,则不会批准使用此技巧的应用程序。这不是你想要的方法。计时器不会在后台运行。您几乎不应该调用runloop.run;这是一件非常高级的事情。而且,当您完成后台任务时,您并没有正确地结束它—您只是在过期时才这样做,这是不好的做法。精确的解决方案将取决于你正在做什么。你可能想成为一个音乐应用程序,并利用它来驱动其他一切。您可能想考虑无声音频,这对电池有点不好,但对于用户体验可能是理想的。您还可以查看用户通知来计时。根据您到目前为止所描述的,我认为您确实可以使用标准工具构建一些非常好的东西。NSTimer并不合适,这完全取决于您想要的用户体验。感谢回复@RobNapier。。。。我如何解决这个问题?对于这种情况,您建议的最佳解决方案是什么。所以我可以玩定时器很长时间,当我们
er锁定了设备屏幕。解决此问题在很大程度上取决于您的用例;当您播放音频和必须运行代码时。你所描述的只是一个背景应用程序,当你想保持沉默时,它可以播放沉默的音频,这将是最简单的。See和@RobNapier:如果苹果发现在后台播放音频内容的应用程序必须播放音频内容,而不是静音,则不会批准使用此技巧的应用程序。