2015-01-12 2 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으로 앱을 디버깅 할 때 효과적이었습니다. 홈 버튼을 두드리고 내 앱을 백그라운드로 실행시킬 때 아무 것도 얻지 못했습니다. 누군가가 내가 홈 버튼을 탭하면 내가 신속한 @ 매트신속한 NSTimer 배경 사용법?

+0

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

+1

왜 백그라운드에서 실행할 타이머가 _ 필요합니까? – matt

답변

3

와 배경 음악을 재생하는 방법을 모르는 나는 background.But 내 응용 프로그램 실행을 위해 긴 빈 음악을 재생할 수 있습니다 얘기하고 내 앱이 백그라운드로 실행되게하십시오.

아니요, 이는 잘못된 가정입니다. 홈 버튼을 탭하면 이 아니라이 앱을 백그라운드에서 실행합니다. 귀하의 응용 프로그램을 백그라운드에서 일시 중지하십시오. 백그라운드에있을 때 코드는 실행되지 않습니다.

음악을 계속 연주하거나 핵심 위치를 계속 사용하는 것과 같이 특정 제한된 활동을 수행하기 위해 앱이 백그라운드에서 실행되도록 특별한 권한을 얻을 수 있습니다. 하지만 앱은 그런 것들을 전혀 가지지 않기 때문에 백그라운드로 들어가 정지합니다.

+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") 
    } 
} 

스위프트 3.0

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

이 코드는 this answer에서 영감을,하지만 난 빠른 포팅되었다.

이것은 분명히 iOS 7 이상에서만 3 분 동안 실행됩니다.

+0

앞에서 설명한대로 이전 답변의 빠른 포트였습니다. 방금 응답을 포팅하고 코드를 테스트 한 결과 제대로 작동하는 것처럼 보였습니다. 예제를 약간 정리하고 일부 정크 코드를 제거 할 수 있습니다. – garetmckinley

+0

예제 코드를 약간 다듬습니다. – garetmckinley

+0

누군가 내게 내 앱이 백그라운드에서 실행되도록 긴 빈 음악을 재생할 수 있다고 말했습니다. 그러나 신속한 @mediachicken으로 백그라운드에서 음악을 재생하는 방법을 모르겠습니다. –

7

나는 백그라운드에서 타이머를 실행할 필요가 없다는 것을 기꺼이 알았습니다. 필요한 것은 일시 중지 된 동안 경과 된 시간을 아는 것입니다. 빈 사운드 파일을 재생하는 것보다 리소스를 훨씬 효율적으로 사용할 수 있습니다.

얼마나 많은 시간이 경과했는지 확인하려면 applicationWillResignActiveapplicationDidBecomeActive을 사용하십시오. 먼저 타이머의 fireDate을 저장하고 applicationWillResignActive

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

다음에 무효의 fireDate에 현재 시간을 비교하여 applicationDidBecomeActive에 타이머 남은 시간을 결정 당신은 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