Ios 阿拉莫菲尔后台服务,全球经理?全球授权标题?

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

有人能告诉我如何正确使用Alamofire后台服务吗

我的尝试是:

登录视图控制器

// 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。”?令牌将随时间而更改。因此,不应将其附加到配置中。如何重新验证会话?例如,如果您使共享会话无效并再次尝试请求,您将无法执行该操作,为什么会这样?