413


iOS8でアプリケーションがバックグラウンドモードに移行したあとも、周期的にタスクを動かしたいと思い、ドキュメントを見ながら以下のようなコードを書いてみました。しかし、思い通り動いてくれません。なにか見落としがあるのでしょうか。

以下、AppDelegate.swiftより抜粋。

[code]

    let backgroundQueue = dispatch_get_global_queue(QOS_CLASS_BACKGROUND,0)
    
    func applicationDidEnterBackground(application: UIApplication) {
        println("did enter background")
        dispatch_async(self.backgroundQueue, myBackgroundTask)
    }
    
    func myBackgroundTask() {
        NSThread.sleepForTimeInterval(0.5)
        println("this is back ground task")
        dispatch_async(self.backgroundQueue, myBackgroundTask)
    }
    
[/code]


CC BY-SA 3.0
2014-12-06T23:52:48.910
411
2014-12-27T06:38:28.423
2014-12-07T06:22:57.697
55
271
question
ios swift
バックグラウンドにあるとき周期的にタスクを動かす方法について


iOS7以上であればBackground Fetchを使うのがいいのではないかと思います。  
参考：<http://www.gaprot.jp/pickup/ios7/vol1/>


CC BY-SA 3.0
2014-12-07T01:50:12.023
413
2014-12-07T02:54:14.603
2014-12-07T02:54:14.603
525
525
411
answer


`beginBackgroundTaskWithExpirationHandler`を使う必要があります。

参考: [Cocoaの日々: [iOS] バックグラウンド実行見本（Task
Completion）](http://cocoadays.blogspot.jp/2011/04/ios-task-completion.html)


CC BY-SA 3.0
2014-12-07T02:40:21.460
414
2014-12-07T02:40:21.460
55
411
answer


下記のコードでバックグラウンドで周期的動作をするようになりました。
ただし180秒までが限界です(iOS8の場合）。expirationHandlerは限界に達する６秒ほど前に呼び出されました。またexpirationHandlerで終了処理を行わないと、アプリケーション全体が終了してしまいます。

[code]

    func applicationDidEnterBackground(application: UIApplication) {
        println("did enter background")
        application.beginBackgroundTaskWithName("myBgTask", expirationHandler: myExpiratonHandler)
        dispatch_async(self.backgroundQueue, myBackgroundTask)
    }
    
    func myBackgroundTask() {
        NSThread.sleepForTimeInterval(0.5)
        println("this is back ground task")
        dispatch_async(self.backgroundQueue, myBackgroundTask)
    }
    
    func myExpiratonHandler(){
        let application:UIApplication = UIApplication.sharedApplication()
        println("Expiration handler called: \(self.bgTaskId)")
        application.endBackgroundTask(self.bgTaskId)
        self.bgTaskId = UIBackgroundTaskInvalid
        }
    }
    
[/code]


CC BY-SA 3.0
2014-12-09T00:25:13.753
469
2014-12-27T06:38:28.423
2014-12-27T06:38:28.423
271
271
411
answer