我正在尝试在我的应用中执行有限长度后台任务。但是,到目前为止,我的代码在应用程序暂停之前未执行。
我已经按照相当多的教程声称以下方式,但显然我遇到了错误。相关代码应在下面发布(如果我遗漏了某些内容,请询问是否有任何澄清):
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()。
答案 0 :(得分:1)
您需要在self.endBackgroundTask()
之后立即将self.connectionManager.closeConnectionToPeripherals()
来电转移到您的DispatchQueue区块。
registerBackgroundTask
方法不会直接调用self.endBackgroundTask()
,而只会在后台任务过期时调用它。通常情况下,如果您的应用在后台播放约30秒后未完成任务,则会发生这种情况。