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

Symulator jest w porządku, otrzymam ciągłe "Coś fajnego", naciskając przycisk strony głównej. Ale zadziałało, gdy debugowałem aplikację za pomocą mojego iPhone'a. Nic nie dostałem, gdy nacisnąłem przycisk home i sprawiłem, że aplikacja działa w tle. Ktoś powiedział mi, mogę grać długą pustą muzykę, aby mój bieg aplikacji w background.But nie wiem jak odtwarzać muzykę w tle z szybkim @mattSwift, jak korzystać z tła NSTimer?

+0

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

+1

Dlaczego uruchamiasz program w tle? – matt

Odpowiedz

3

kiedy wcisnął przycisk home i spraw, aby aplikacja działała w tle

Nie, to fałszywe założenie. Po dotknięciu przycisku strony domowej wykonasz , a nie, aby aplikacja działała w tle. Sprawiasz, że twoja aplikacja zawiesza się w tle. Twój kod nie ma wartości , jeśli nie działa, gdy jesteś w tle.

Aplikacje mogą uzyskać specjalne pozwolenie na uruchamianie w tle tylko po to, aby wykonywać pewne ograniczone czynności, takie jak kontynuowanie odtwarzania muzyki lub dalsze korzystanie z Lokalizacji głównej. Ale twoja aplikacja nie robi żadnej z tych rzeczy, więc przechodzi w tło i zatrzymuje się.

+0

Ktoś powiedział mi, że mogę odtwarzać długą, pustą muzykę, aby moja aplikacja działała w tle. Ale nie wiem, jak odtwarzać muzykę w tle za pomocą szybkiego @matt –

+0

Następnie dowiedz się, jak to zrobić. Wspomniałem o odtwarzaniu muzyki jako legalnej aktywności w tle w mojej odpowiedzi. – matt

+0

Podejrzewam, że Twoja aplikacja może zostać odrzucona ze sklepu z aplikacjami, jeśli zrobisz coś takiego.Zamiast tego wyjaśnij, co czujesz, że musisz zrobić w tle? Domyślnie zawieszona aplikacja nie jest czymś, o co w tej chwili dba użytkownik. Powinien być w stanie zrobić to, czego potrzebuje, gdy użytkownik ponownie zacznie go używać. –

18

Możesz użyć beginBackgroundTaskWithExpirationHandler, aby uzyskać czas wykonania tła.

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

Kod ten został zainspirowany this answer, ale przeniesione do szybkich.

To najwyraźniej działa tylko przez 3 minuty na iOS 7+.

+0

Jak stwierdzono, był to szybki port z poprzedniej odpowiedzi. Przesunąłem odpowiedź, przetestowałem kod i wydawało się, że działa. Mogę trochę wyczyścić przykład i usunąć trochę niepotrzebnego kodu. – garetmckinley

+0

przycinał trochę przykładowy kod w dół. – garetmckinley

+0

Ktoś powiedział mi, że mogę grać długą, pustą muzykę, aby moja aplikacja działała w tle. Ale nie wiem, jak odtwarzać muzykę w tle za pomocą szybkiego @mediachicken –

7

Jestem gotów założyć się, że nie trzeba uruchamiać czasomierza w tle, potrzebna jest znajomość czasu, który upłynął podczas zawieszenia. To znacznie lepsze wykorzystanie zasobów niż próba odtworzenia pustego pliku dźwiękowego.

Użyj applicationWillResignActive i applicationDidBecomeActive, aby określić, ile czasu upłynęło. Najpierw zapisać fireDate swojego czasomierza i unieważnia go w applicationWillResignActive

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

Następnym krokiem jest określenie, ile czasu pozostało do timera w applicationDidBecomeActive porównując czas teraz na fireDate zapisano w zaproszeniu 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) 
    } 
} 

Jeśli potrzebujesz powtarzanie jednego, po prostu zrobić matematyki, aby dowiedzieć się, ile razy licznik powinien zwolniony, podczas gdy w tle

let howManyTimes = abs(howMuchLonger)/repeatInterval