2015-01-12 4 views
6
class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     var timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("update"), userInfo: nil, repeats: true) 
    } 

    func update() { 
     println("Something cool") 
    } 
} 

Это нормально для симулятора, я получу непрерывное «Что-то прохладное» через я постучал по домашней кнопке. Но это сработало, когда я отлаживаю приложение с помощью своего iPhone. Я ничего не получил, когда я нажал кнопку «домой» и сделал фоновое изображение приложения. Кто-то сказал мне, что я могу играть длинную пустую музыку, чтобы сделать мое приложение запустить в background.But я не знаю, как играть музыку в фоновом режиме с быстрым @ MattБыстрое использование фона NSTimer?

+0

ч ttp: //stackoverflow.com/questions/8415870/scheduled-nstimer-when-app-is-in-background – rakeshbs

+1

Зачем вам _need_ таймер запускать в фоновом режиме? – matt

ответ

3

, когда я нажал на кнопку домой и сделать мой запуск приложения фоном

Нет, это ложное предположение. Когда вы нажимаете кнопку «домой», вы делаете не, чтобы ваше приложение запускалось в фоновом режиме. Вы делаете свое приложение suspend в фоновом режиме. Ваш код не запускается, когда вы находитесь в фоновом режиме.

Приложения могут получить специальное разрешение для запуска в фоновом режиме только для того, чтобы выполнять определенные ограниченные действия, например, продолжать играть музыку или продолжать использовать Core Location. Но ваше приложение ничего не делает, поэтому оно выходит на задний план и останавливается.

+0

Кто-то сказал мне, что я могу сыграть длинную пустую музыку, чтобы мое приложение запустилось в фоновом режиме. Но я не знаю, как играть музыку в фоновом режиме со скоростью @matt. –

+0

Тогда узнайте, как это сделать. В моем ответе я упомянул музыку в качестве юридической фоновой деятельности. – matt

+0

Я подозреваю, что ваше приложение может быть отклонено из магазина приложений, если вы сделаете что-то подобное.Пожалуйста, вместо этого объясните, что вы чувствуете, что вам нужно делать в фоновом режиме? По умолчанию приостановленное приложение не является чем-то, что пользователь заботится в этот момент. Он должен иметь возможность делать то, что ему нужно, когда пользователь снова начнет использовать его. –

18

Вы можете использовать beginBackgroundTaskWithExpirationHandler, чтобы получить некоторое время выполнения фона.

class ViewController: UIViewController { 
    var backgroundTaskIdentifier: UIBackgroundTaskIdentifier? 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     backgroundTaskIdentifier = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler({ 
      UIApplication.sharedApplication().endBackgroundTask(self.backgroundTaskIdentifier!) 
     }) 
     var timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "update", userInfo: nil, repeats: true) 
    } 

    func update() { 
     println("Something cool") 
    } 
} 

Swift 3,0

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

Этот код был вдохновлен this answer, но я портирована на стрижа.

Это, по-видимому, работает только в течение 3 минут на iOS 7+.

+0

Как было сказано, это был быстрый порт из предыдущего ответа. Я просто портировал ответ, проверял код и, похоже, работал. Я могу немного очистить пример и удалить ненужный код. – garetmckinley

+0

немного уменьшил код примера. – garetmckinley

+0

кто-то сказал мне, что я могу сыграть длинную пустую музыку, чтобы мое приложение запустилось в фоновом режиме. Но я не знаю, как играть музыку в фоновом режиме с помощью swift @mediachicken –

7

Я готов поспорить, что вам не нужно запускать таймер в фоновом режиме, вам нужно знать время, прошедшее с момента приостановки. Это намного лучше использовать ваши ресурсы, чем пытаться воспроизвести пустой звуковой файл.

Используйте applicationWillResignActive и applicationDidBecomeActive, чтобы определить, сколько времени прошло. Во-первых сохранить fireDate вашего таймера и отменить его в applicationWillResignActive

func applicationWillResignActive(application: UIApplication) { 
    guard let t = self.timer else { return } 
    nextFireDate = t.fireDate 
    t.invalidate() 
} 

Далее, определить, сколько времени осталось для таймера в applicationDidBecomeActive путем сравнения времени теперь к fireDate вы сохранили в applicationWillResignActive вызова:

func applicationDidBecomeActive(application: UIApplication) { 
    guard let n = nextFireDate else { return } 
    let howMuchLonger = n.timeIntervalSinceDate(NSDate()) 
    if howMuchLonger < 0 { 
     print("Should have already fired \(howMuchLonger) seconds ago") 
     target!.performSelector(selector!) 
    } else { 
     print("should fire in \(howMuchLonger) seconds") 
     NSTimer.scheduledTimerWithTimeInterval(howMuchLonger, target: target!, selector: selector!, userInfo: nil, repeats: false) 
    } 
} 

Если вам нужно повторять один, просто сделать математику, чтобы выяснить, сколько раз таймер должен быть уволен в то время как в фоновом режиме

let howManyTimes = abs(howMuchLonger)/repeatInterval 
Смежные вопросы