在应用程序进入暂停状态之前执行后台任务

时间:2017-08-08 12:44:13

标签: ios swift background

我正在尝试在我的应用中执行有限长度后台任务。但是,到目前为止,我的代码在应用程序暂停之前未执行。

我已经按照相当多的教程声称以下方式,但显然我遇到了错误。相关代码应在下面发布(如果我遗漏了某些内容,请询问是否有任何澄清):

class Manager {

    private var backgroundTask: UIBackgroundTaskIdentifier = UIBackgroundTaskInvalid

    init(){
        // Add observer able of detecting when app will go to background
        NotificationCenter.default.addObserver(self, selector: #selector(self.didEnterBackground(_:)), name: .UIApplicationDidEnterBackground, object: nil)
    }

    deinit {
        // Observers removed when view controller is dismissed / deallocated
        NotificationCenter.default.removeObserver(self)
    }

       // Routine performed when app will resign from active
@objc private func didEnterBackground(_ notification: Notification){

    registerBackgroundTask()

    // Code that needs to be executed before app is suspended ------
    DispatchQueue.global().sync {

        self.isBackgrounding = true

        self.shutdownSession()


        self.isConnected = false
        self.isActivated = false
        self.activate = false

        self.connectionManager.closeConnectionToPeripherals()

    }
    // -----------------------------------------------------
    self.endBackgroundTask()

}

func registerBackgroundTask() {
    backgroundTask = UIApplication.shared.beginBackgroundTask { [weak self] in
        self?.endBackgroundTask()
    }
    assert(backgroundTask != UIBackgroundTaskInvalid)
}

func endBackgroundTask() {
    print("\n\n\nBackground task ended.\n\n\n")
    UIApplication.shared.endBackgroundTask(backgroundTask)
    backgroundTask = UIBackgroundTaskInvalid
}

}

我遇到的问题是,在执行代码之前,后台任务似乎总是要结束。在应用程序暂停之前,如何确保同步块中的代码被执行?

我也不太了解“registerBackgroundTask()” - 即使互联网坚持以这种方式实现它 - 因为它调用了endBackgroundTask()。

1 个答案:

答案 0 :(得分:1)

您需要在self.endBackgroundTask()之后立即将self.connectionManager.closeConnectionToPeripherals()来电转移到您的DispatchQueue区块。

registerBackgroundTask方法不会直接调用self.endBackgroundTask(),而只会在后台任务过期时调用它。通常情况下,如果您的应用在后台播放约30秒后未完成任务,则会发生这种情况。