2015-01-12 13 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") 
    } 
} 

È ok per il simulatore, otterrò continuo "Qualcosa di interessante" tramite Ho premuto il tasto home. Ma ha funzionato quando eseguo il debug dell'applicazione con il mio iPhone. Non ho ottenuto nulla quando ho toccato il pulsante Home e faccio girare la mia app in background. Qualcuno mi ha detto che posso giocare a lungo bianco musica per fare la mia corsa App nel background.But non so come giocare la musica in background con rapida @ MattSwift come usare lo sfondo di NSTimer?

+0

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

+1

Perché hai __ un timer da eseguire in background? – matt

risposta

3

quando ho sfruttato il tasto home e far funzionare la mia app in background

No, questo è un falso presupposto. Quando tocchi il pulsante Home, fai non fai in modo che l'app venga eseguita in background. Fai in modo che l'app sospenda sullo sfondo. Il tuo codice non funziona quando sei in background.

Le app possono ottenere un permesso speciale per l'esecuzione in background solo per eseguire determinate attività limitate, come continuare a riprodurre musica o continuare a utilizzare la posizione principale. Ma la tua app non fa nulla di tutto ciò, quindi va in secondo piano e si ferma.

+0

qualcuno mi ha detto che posso suonare una lunga musica vuota per far funzionare la mia app in background. Ma non so come riprodurre la musica in sottofondo con swift @matt –

+0

Quindi impara come farlo. Ho menzionato la musica come attività legale di base nella mia risposta. – matt

+0

Sospetto che la tua app possa essere rifiutata dall'app store se fai qualcosa del genere.Per favore, spieghi invece cosa ti senti di dover fare in sottofondo? Per impostazione predefinita, un'app sospesa non è qualcosa a cui l'utente importa in quel momento. Dovrebbe essere in grado di fare ciò di cui ha bisogno quando l'utente inizia a usarlo di nuovo. –

18

È possibile utilizzare beginBackgroundTaskWithExpirationHandler per ottenere un tempo di esecuzione in background.

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!) 
}) 

Questo codice è stato ispirato da this answer, ma ho portato su SWIFT.

Questo apparentemente funziona solo per 3 minuti su iOS 7+.

+0

Come detto, si trattava di una porta rapida da una risposta precedente. Ho appena portato la risposta, testato il codice e sembra che funzioni. Posso pulire un po 'l'esempio e rimuovere un po' di codice spazzatura. – garetmckinley

+0

abbassa un po 'il codice di esempio. – garetmckinley

+0

qualcuno mi ha detto che posso suonare una lunga musica vuota per far funzionare la mia app in background.Ma non so suonare la musica in sottofondo con swift @mediachicken –

7

Sono disposto a scommettere che non è necessario eseguire un timer in background, ciò che è necessario è sapere il tempo che è trascorso mentre era sospeso. Questo è un uso molto migliore delle tue risorse rispetto al provare a riprodurre un file audio vuoto.

Utilizzare applicationWillResignActive e applicationDidBecomeActive per determinare quanto tempo è trascorso. In primo luogo salvare il fireDate del timer e invalidare in applicationWillResignActive

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

Quindi, determinare quanto tempo è rimasto per il timer in applicationDidBecomeActive confrontando il tempo ora al fireDate è stato salvato nella chiamata 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) 
    } 
} 

Se avete bisogno di un ripetere uno, basta fare matematica per capire quante volte il timer avrebbe dovuto sparato mentre sullo sfondo

let howManyTimes = abs(howMuchLonger)/repeatInterval