Alamofire背景工作在模拟器,但不在设备上

时间:2017-06-30 15:02:57

标签: swift xcode url alamofire background-process

正如标题所提到的,我已经与Alamofire建立了一个backgroundURL。它就像模拟器中的魅力,但在我的设备上却没有。我确定我在这里遗漏了一些东西,因为我不熟悉URL。 这是我到目前为止的代码:

class NetworkManager {

static let shared = NetworkManager()

private lazy var backgroundManager: Alamofire.SessionManager = {
    let bundleIdentifier = MyStruct.identifier
    return Alamofire.SessionManager(configuration: URLSessionConfiguration.background(withIdentifier: bundleIdentifier))
}()

var backgroundCompletionHandler: (() -> Void)? {
    get{
        return backgroundManager.backgroundCompletionHandler
    }
    set{
        backgroundManager.backgroundCompletionHandler = newValue
    }
}

}

    func application(_ application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: @escaping () -> Void) {
    NetworkManager.shared.backgroundCompletionHandler = completionHandler
}

在我的ViewController中:

 func populateArrays(){  
 Alamofire.request("http://www.aps.anl.gov/Accelerator_Systems_Division/Accelerator_Operations_Physics/sddsStatus/mainStatus.sdds.gz").responseData { response in
        switch response.result{
        case .success:
            print("Validation Successful")
        case .failure(let error):
            print(error.localizedDescription)
        }
        if let data = response.result.value{

2 个答案:

答案 0 :(得分:3)

解决了它。对于有此问题的其他任何人,您需要将以下代码添加到appDelegate。

    func applicationDidEnterBackground(_ application: UIApplication) {
    var bgTask = 0
    var app = UIApplication.shared
    bgTask = app.beginBackgroundTask(expirationHandler: {() -> Void in
        app.endBackgroundTask(bgTask)
})

答案 1 :(得分:0)

在我看来,您没有使用您创建的后台管理器。而不是

Alamofire.request("http://www.aps.anl.gov...")

调用默认(非后台)会话管理器,您应该使用:

backgroundManager.request("http://www.aps.anl.gov...")

顺便说一下,评论中提到了Jon Shier