Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS 8和iOS 9上的NSURLSession之间的差异?_Ios_Swift_Nsurlsession_Basic Authentication - Fatal编程技术网

iOS 8和iOS 9上的NSURLSession之间的差异?

iOS 8和iOS 9上的NSURLSession之间的差异?,ios,swift,nsurlsession,basic-authentication,Ios,Swift,Nsurlsession,Basic Authentication,我有以下代码可以将iOS应用程序验证到MediaWiki服务器: let task = NSURLSession.sharedSession() task.configuration.HTTPAdditionalHeaders = ["Authorization": "Basic " + base64EncodedCredentials] task.dataTaskWithURL(url!) {(data, response, error) in

我有以下代码可以将iOS应用程序验证到MediaWiki服务器:

let task = NSURLSession.sharedSession()
        task.configuration.HTTPAdditionalHeaders = ["Authorization": "Basic " + base64EncodedCredentials]

        task.dataTaskWithURL(url!) {(data, response, error) in
            dispatch_async(dispatch_get_main_queue(), {

                if data != nil {
                    let result = NSString(data: data!, encoding: NSUTF8StringEncoding)
                    if resultIsValid(result) {
                        //Do authentication stuff
                    } else {
                        self.showLoginErrorMessage()
                    }
                } else {
                    self.showLoginErrorMessage()
                }
            })
            }.resume()
在iOS 8上,这非常有效,我收到了HTTP 200 OK响应。然而,在iOS 9上,我收到了未经授权的401。不幸的是,我无法访问服务器以查看它实际接收的内容,而且它位于内部网络上,因此我无法链接到服务器。它使用HTTP基本访问身份验证,因此我假设它应该与具有该身份验证类型的任何其他服务器相同

从iOS 8到iOS 9的API中是否存在任何可能导致此类问题的更改?例如,是否可以更改/删除/添加其他默认标题,如内容类型或用户代理

编辑:
在对requests.in进行测试后,我发现通过添加内容类型,这是iOS 8中头的一部分,而不是iOS 9中头的一部分。在iOS 8中,我仍然可以在不设置内容类型的情况下通过请求,但iOS 9请求中没有它仍然很奇怪。

我终于找到了答案!事实证明,在iOS 9中,NSURLSessionConfiguration的HTTPAdditionalHeaders属性是只读的,对它的任何更改都不会反映在当前的NSURLSession中。除此之外,不能修改四个标题
授权
连接
主机
WWW-Authenticate
。因此,在iOS 9中进行基本访问身份验证的唯一方法是使用quellish提出的NSURLCredential

对于任何有相同问题的人,这里是我用来让我的身份验证同时适用于iOS 8和iOS 9的最后一个代码:

let url = NSURL(string: "https://subdomain2.subdomain1.example.com")

let credential = NSURLCredential(user: username, password: password, persistence: NSURLCredentialPersistence.ForSession)
let protectionSpace = NSURLProtectionSpace(host: url!.host!, port: 443, `protocol`: url!.scheme, realm: "subdomain2.example.com", authenticationMethod: NSURLAuthenticationMethodHTTPBasic)
NSURLCredentialStorage.sharedCredentialStorage().setCredential(credential, forProtectionSpace: protectionSpace)

let task = NSURLSession.sharedSession()

task.dataTaskWithURL(url!) {(data, response, error) in
    if data != nil {
         if responseIsValid(response) {
            //Do authenticated stuff
         } else {
             self.showLoginErrorMessage()
         }         
    } else {
         self.showLoginErrorMessage()
    }
}.resume() 

这可能是一个问题吗?不幸的是,如果不是,我将永远不会得到未经授权的401。另外,我在Info.plist中添加了一个例外,这在两个版本中都是一样的。我还有一个安卓应用程序,可以对服务器进行身份验证,没有任何问题。只有在iOS 9上我才遇到这个问题。除了ATS之外,我没有注意到任何区别。Buy您可以设置一个请求bin url()然后检查bin与iOS8和IOS9接收到的任何差异。为什么您自己使用Base64编码头值而不是使用NSURLCredential?将来,您可能会看到一个工具,例如帮助破译双向web流量。这是一个很好的b/c模式,你可以看到对话的双方,而且设置无线监听比