Ios 阿拉莫菲尔后台服务,全球经理?全球授权标题?
有人能告诉我如何正确使用Alamofire后台服务吗 我的尝试是: 登录视图控制器Ios 阿拉莫菲尔后台服务,全球经理?全球授权标题?,ios,swift,alamofire,Ios,Swift,Alamofire,有人能告诉我如何正确使用Alamofire后台服务吗 我的尝试是: 登录视图控制器 // Create a global variable for the manager var manager = Alamofire.Manager() var configuration = NSURLSessionConfiguration() class LoginViewController: UIViewController { // set the configuration for
// Create a global variable for the manager
var manager = Alamofire.Manager()
var configuration = NSURLSessionConfiguration()
class LoginViewController: UIViewController {
// set the configuration for the manager
configuration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier("com.xxx.app.backgroundService")
configuration.sharedContainerIdentifier = "com.xxx.app.backgroundService"
}
现在创建我的登录尝试,成功后转到MainViewController并在此处执行更多请求
manager.request(.POST, "\(serviceUrl)public/service/authenticate", parameters: ["email": txtEmail.text!, "password": txtPassword.text!]) {
......
}
在这里,我将获取所有请求的令牌,因此我将向全局配置中添加:
class MainViewController: UIViewController {
if let token: AnyObject = NSUserDefaults.standardUserDefaults().objectForKey("token") {
configuration.HTTPAdditionalHeaders = ["Authorization": "Bearer \(token)"]
manager = Alamofire.Manager(configuration: configuration)
}
}
但是现在,当我退出并再次登录时,我会出现以下错误:
Warning: A background URLSession with identifier xxx.xxx.app.backgroundService already exists!
应用程序崩溃时会出现以下情况:
*** Terminating app due to uncaught exception 'NSGenericException', reason: 'Task created in a session that has been invalidated'
*** First throw call stack:
因此,我真的不知道如何使用后台服务来获得以下结果:
在登录尝试时,我不需要添加身份验证标头。但是,我想把它添加到每个请求中。所有请求都应作为后台服务运行
有人能帮我吗?如何以正确的方式解决这个问题?提前谢谢 您有多个问题。首先,您需要将
配置
对象传递给管理器
初始值设定项。否则,您不会在管理器
实例中将配置
用于基础URL会话
第二个问题是,在配置应用于管理器
实例之后,不应在配置上设置头值。苹果的文档特别指出了这一点。我们也在我们的报告中这样说。如果需要处理授权令牌,则需要将它们作为附加到实际请求的头传递
更新#1 下面是一个小示例,演示如何创建一个可以全局使用的
Manager
实例
class NetworkManager {
var authToken = "1234" // You'll need to update this as necessary
let manager: Manager = {
let configuration: NSURLSessionConfiguration = {
let identifier = "com.company.app.background-session"
let configuration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier(identifier)
return configuration
}()
return Manager(configuration: configuration)
}()
static let sharedInstance = NetworkManager()
}
class ExampleClass {
func startNetworkRequest() {
let headers = ["Authorization": NetworkManager.sharedInstance.authToken]
NetworkManager.sharedInstance.manager.request(.GET, "https://httpbin.org/get", headers: headers)
.responseJSON { response in
debugPrint(response)
}
}
}
您仍然需要了解如何在
authToken
过期时更新它,但这显示了一种方法,可以在整个代码库中使用管理器
实例。谢谢您的回答!你能给我更多的信息吗我应该在哪里初始化Manager变量,这是一个全局变量(在类之外?),还是应该在任何类之外进行配置,以在全局中进行配置?如果自述文件中有我应该将令牌附加到全局配置的信息,那么它就会被推送到每个请求。因此,为了帮助我,最好有一个简短的示例,我应该在其中创建配置,设置背景标识符,以及更新配置(在我想使用alamofire的每个类中?)自述文件中没有关于您应该使用配置将令牌附加到每个请求的信息。它明确指出不要这样做。这意味着什么:“对于不更改的HTTP头,建议在NSURLSessionConfiguration上设置它们,以便它们自动应用于基础NSURLSession创建的任何NSURLSessionTask。”?令牌将随时间而更改。因此,不应将其附加到配置中。如何重新验证会话?例如,如果您使共享会话无效并再次尝试请求,您将无法执行该操作,为什么会这样?