Alamofire 背景在模拟器上工作但不在设备上工作
Alamofire background working on simulator but not on device
如标题所述,我已经使用 Alamofire 设置了背景URL。它在模拟器中就像一个魅力,但在我的设备上却没有。我确定我在这里遗漏了一些东西,因为我对 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{
解决了。对于遇到此问题的任何其他人,您需要将以下代码添加到您的 appDelegate。
func applicationDidEnterBackground(_ application: UIApplication) {
var bgTask = 0
var app = UIApplication.shared
bgTask = app.beginBackgroundTask(expirationHandler: {() -> Void in
app.endBackgroundTask(bgTask)
})
在我看来,您没有使用您创建的后台管理器。而不是
Alamofire.request("http://www.aps.anl.gov...")
调用默认(非后台)会话管理器,您应该使用:
backgroundManager.request("http://www.aps.anl.gov...")
顺便在评论里提到了Jon Shier
如标题所述,我已经使用 Alamofire 设置了背景URL。它在模拟器中就像一个魅力,但在我的设备上却没有。我确定我在这里遗漏了一些东西,因为我对 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{
解决了。对于遇到此问题的任何其他人,您需要将以下代码添加到您的 appDelegate。
func applicationDidEnterBackground(_ application: UIApplication) {
var bgTask = 0
var app = UIApplication.shared
bgTask = app.beginBackgroundTask(expirationHandler: {() -> Void in
app.endBackgroundTask(bgTask)
})
在我看来,您没有使用您创建的后台管理器。而不是
Alamofire.request("http://www.aps.anl.gov...")
调用默认(非后台)会话管理器,您应该使用:
backgroundManager.request("http://www.aps.anl.gov...")
顺便在评论里提到了Jon Shier