2015-01-12 5 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でアプリケーションをデバッグするとうまくいきました。ホームボタンをタップしてアプリをバックグラウンドで実行させると、何も得られませんでした。 誰かが私はホームボタンをタップすると、私は迅速@mattスイフト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() 
} 

次でそれを無効にする、あなたはapplicationWillResignActiveコールに保存されているどのくらいの時間fireDateに今の時間を比較することにより、applicationDidBecomeActiveにタイマー放置されて決定します。

あなたは1を繰り返す必要がある場合は
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 
関連する問題