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
Swift:如何使用HTTPS代理_Swift_Xcode_Proxy_Urlsession - Fatal编程技术网

Swift:如何使用HTTPS代理

Swift:如何使用HTTPS代理,swift,xcode,proxy,urlsession,Swift,Xcode,Proxy,Urlsession,我有一个付费代理(HTTP/HTTPS/SOCKS)。 我可以使用HTTP方案发出请求,但不能使用HTTPS 我总是犯错误: Error Domain=kCFErrorDomainCFNetwork Code=311 "(null)" UserInfo={_NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <69F444DF-8C0E-4F4B-B723-C7BCD72B6C02>.<1>, _

我有一个付费代理(HTTP/HTTPS/SOCKS)。 我可以使用HTTP方案发出请求,但不能使用HTTPS

我总是犯错误:

Error Domain=kCFErrorDomainCFNetwork Code=311 "(null)" UserInfo={_NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <69F444DF-8C0E-4F4B-B723-C7BCD72B6C02>.<1>, _kCFStreamErrorDomainKey=4, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalDataTask <69F444DF-8C0E-4F4B-B723-C7BCD72B6C02>.<1>"
), _kCFStreamErrorCodeKey=-2097}
请求功能:

private func getProxySessionConfigration() -> URLSessionConfiguration {
        
        let login = ConfigurationData.proxy.login
        let password = ConfigurationData.proxy.password
        let sessionConfiguration = URLSessionConfiguration.default
        
        let userPasswordString = "\(login):\(password)"
        let userPasswordData = userPasswordString.data(using: String.Encoding.utf8)
        let base64EncodedCredential = userPasswordData!.base64EncodedString(options: Data.Base64EncodingOptions(rawValue: 0))
        let authString = "Basic \(base64EncodedCredential)"
        sessionConfiguration.httpAdditionalHeaders = ["Authorization" : authString]
        
        
        sessionConfiguration.connectionProxyDictionary = [
            "HTTPEnable": true,
            "HTTPPort": ConfigurationData.proxy.port,
            "HTTPProxy": ConfigurationData.proxy.host,
            "HTTPSEnable": true,
            "HTTPSPort": ConfigurationData.proxy.port,
            "HTTPSProxy": ConfigurationData.proxy.host
        ]
        
        return sessionConfiguration
    }
public func getPage(_ url: URL, completion: @escaping (String?, RequestError?) -> Void) {
        
        let session = URLSession(configuration: getProxySessionConfigration())
        let task = session.dataTask(with: url) { (data, response, error) in
            
            guard let httpResponse = response as? HTTPURLResponse,
                  (200...299).contains(httpResponse.statusCode) else {
                if let error = error {
                    completion(nil, .requestFailed(error))
                } else {
                    completion(nil, .unknown(response))
                }
                return
            }
            
            
            if let data = data {
                print(httpResponse)
                if let urlContent = NSString(data: data, encoding: String.Encoding.utf8.self.rawValue) {
                    completion(urlContent as String, nil)
                } else {
                    completion(nil, .dataDecodeFailed(data))
                }
            } else {
                completion(nil, .noData)
            }
            
        }
        
        task.resume()
   
    }
let requestAvito = AvitoProjectPlaygroud_Sources.RequestAvito()

 let url = URL(string: "https://www.avito.ru/krasnodar/vakansii/voditel_v_yandeks_taksi_zarabotok_ot_1388074044")!


requestAvito.getPage(url) { (htmlString, error) in
    if let error = error {
        switch error {
            case .noData: print("ERROR: no data")
            case .unknown(let response):
                print("ERROR: unknown error")
                if let response =  response { print(response) }
            case .urlFailed: print("ERROR: url generating failed")
            case .requestFailed(let returnedError): print("ERROR: \(returnedError)")
            case .dataDecodeFailed(let data):
                print("ERROR: data decoding failed")
                print(data!)
        }
        return
    }
    
    if let htmlString = htmlString {
        // print(htmlString)
        print(String(htmlEncodedString: htmlString))
    } else {
        print("NO DATA")
    }
}
函数调用:

private func getProxySessionConfigration() -> URLSessionConfiguration {
        
        let login = ConfigurationData.proxy.login
        let password = ConfigurationData.proxy.password
        let sessionConfiguration = URLSessionConfiguration.default
        
        let userPasswordString = "\(login):\(password)"
        let userPasswordData = userPasswordString.data(using: String.Encoding.utf8)
        let base64EncodedCredential = userPasswordData!.base64EncodedString(options: Data.Base64EncodingOptions(rawValue: 0))
        let authString = "Basic \(base64EncodedCredential)"
        sessionConfiguration.httpAdditionalHeaders = ["Authorization" : authString]
        
        
        sessionConfiguration.connectionProxyDictionary = [
            "HTTPEnable": true,
            "HTTPPort": ConfigurationData.proxy.port,
            "HTTPProxy": ConfigurationData.proxy.host,
            "HTTPSEnable": true,
            "HTTPSPort": ConfigurationData.proxy.port,
            "HTTPSProxy": ConfigurationData.proxy.host
        ]
        
        return sessionConfiguration
    }
public func getPage(_ url: URL, completion: @escaping (String?, RequestError?) -> Void) {
        
        let session = URLSession(configuration: getProxySessionConfigration())
        let task = session.dataTask(with: url) { (data, response, error) in
            
            guard let httpResponse = response as? HTTPURLResponse,
                  (200...299).contains(httpResponse.statusCode) else {
                if let error = error {
                    completion(nil, .requestFailed(error))
                } else {
                    completion(nil, .unknown(response))
                }
                return
            }
            
            
            if let data = data {
                print(httpResponse)
                if let urlContent = NSString(data: data, encoding: String.Encoding.utf8.self.rawValue) {
                    completion(urlContent as String, nil)
                } else {
                    completion(nil, .dataDecodeFailed(data))
                }
            } else {
                completion(nil, .noData)
            }
            
        }
        
        task.resume()
   
    }
let requestAvito = AvitoProjectPlaygroud_Sources.RequestAvito()

 let url = URL(string: "https://www.avito.ru/krasnodar/vakansii/voditel_v_yandeks_taksi_zarabotok_ot_1388074044")!


requestAvito.getPage(url) { (htmlString, error) in
    if let error = error {
        switch error {
            case .noData: print("ERROR: no data")
            case .unknown(let response):
                print("ERROR: unknown error")
                if let response =  response { print(response) }
            case .urlFailed: print("ERROR: url generating failed")
            case .requestFailed(let returnedError): print("ERROR: \(returnedError)")
            case .dataDecodeFailed(let data):
                print("ERROR: data decoding failed")
                print(data!)
        }
        return
    }
    
    if let htmlString = htmlString {
        // print(htmlString)
        print(String(htmlEncodedString: htmlString))
    } else {
        print("NO DATA")
    }
}

对于您的问题,首先(在做其他事情之前,请确保您的代理处理HTTPS代理),如果否,则不管您输入的代码如何

要处理HTTPS代理,有两个键可以使用,似乎您正在使用它。我可以看到的一件事是,您使用true作为布尔值,等等

根据我的经验,我总是使用数值或字符串

确保数据以字符串/Int(true->1)等形式传递,这可能会有所帮助

有时,它会对那些将“真”转换为1的假设产生一些问题

下面是我如何使用它的示例:

  let request = URLRequest(url: URL(string: url)!)

    let config = URLSessionConfiguration.default
    config.requestCachePolicy = URLRequest.CachePolicy.reloadIgnoringLocalCacheData
    config.connectionProxyDictionary = [AnyHashable: Any]()
    config.connectionProxyDictionary?[kCFNetworkProxiesHTTPEnable as String] = 1
    config.connectionProxyDictionary?[kCFNetworkProxiesHTTPProxy as String] = "xxx.yyy.zzz.bbb"
    config.connectionProxyDictionary?[kCFNetworkProxiesHTTPPort as String] = 8888
    config.connectionProxyDictionary?[kCFStreamPropertyHTTPSProxyHost as String] = "xxx.yyy.zzz.bbb"
    config.connectionProxyDictionary?[kCFStreamPropertyHTTPSProxyPort as String] = 8888
简言之:

  • 首先验证您的代理(确保已处理https代理)
  • 然后按上述方式传递数据

希望它能解决您的问题。

谢谢您的回答。我检查了你的代码,得到了同样的问题-error((一个也检查了代理(使用命令行))并且它可以同时工作两种类型-HTTPS和HTTPS