【发布时间】:2020-06-26 17:52:12
【问题描述】:
我的 iOS 应用从我们的主服务接收到刷新其状态的通知。现在,我们正在使用 Alamofire 获取最新状态,并在有更新数据时播放持续声音。我们的设备被锁定在引导模式,以防止它们关闭并提供信息亭体验。
我们正在进行更改,以便设备可以在 xx 分钟不活动后进入睡眠状态。但是,我们遇到了一个问题,即即使请求已成功发送(基于我们在 api 端的日志),设备也没有从 Alamofire 获取结果。
当我使用 Alamofire 4 时,我设置了一个带有 backgroundsessionmanager 的单例,这就是现在发送 AF 请求的方式。但挑战在于,请求是间歇性发送的,并且大部分时间在设备因此错误而处于睡眠状态时都会失败:
Domain=NSURLErrorDomain Code=-997 "Lost connection to background transfer service"
这是我的单例代码(我在 AppDelegate 中有相关代码):
class Networking {
static let sharedInstance = Networking()
public var sessionManager: Alamofire.SessionManager // most of your web service clients will call through sessionManager
public var backgroundSessionManager: Alamofire.SessionManager // your web services you intend to keep running when the system backgrounds your app will use this
private init() {
self.sessionManager = Alamofire.SessionManager(configuration: URLSessionConfiguration.default)
self.backgroundSessionManager = Alamofire.SessionManager(configuration: URLSessionConfiguration.background(withIdentifier: "com.test.app"))
}
}
这是我发送请求的代码:
let NetworkManager = Networking.sharedInstance.backgroundSessionManager
DispatchQueue.main.async(execute: {
NetworkManager.request(self.api_url, method: .post, parameters: params, encoding: JSONEncoding.default, headers: headers).responseJSON{ response in
switch (response.result){
case .success:
if let jsonResp = response.result.value{
print("got the response")
print(jsonResp)
// parse results
}
case .failure:
print("Network Error: \(response.error)")
}
}
})
我希望得到一些帮助来解决这个问题,因为我无法从根本上导致不一致的行为。我在某些地方读到 Apple/iOS 只允许在应用程序处于后台模式而不是 requests 时上传/下载。
【问题讨论】:
-
与您的问题无关,
DispatchQueue.main.async可能不需要。 Alamofire 请求已经异步运行。如果您的应用程序在后台运行(作为后台获取的结果),这并不意味着它在后台线程上运行。 “后台”一词有三种完全不同的用法:后台队列/线程(相对于主队列/线程);后台模式(而不是在前台运行);和后台、进程外、URL 会话(而不是默认、进程中、会话)。但这是三个完全不同的概念。 -
顺便说一句,按照惯例,变量和属性名称通常应以小写字母开头。因此,您可以使用
let networkManager = ...而不是NetworkManager。这意味着,一目了然,您可以轻松地区分变量名和类型名。 -
感谢您指出改进。我会做出调整。
标签: ios swift alamofire alamofire-request