使用Alamofire
网络框架时,项目中需要动态替换 Proxy
,使用 Alamofire
代码如下:
static var requestManager = Alamofire.SessionManager()let cfg = Alamofire.SessionManager.default.session.configurationcfg.connectionProxyDictionary = [ kCFNetworkProxiesHTTPEnable: true, kCFNetworkProxiesHTTPPort: 80, kCFNetworkProxiesHTTPProxy: ip]requestManager = Alamofire.SessionManager(configuration: cfg)requestManager.request(...)复制代码
connectionProxyDictionary
中的Proxy,需要是动态的,随时可能变化。但是使用此方法会报出一个错误
FAILURE: Error Domain=NSURLErrorDomain Code=-999 "cancelled"
在使用Alamofire
时,官方推荐使用单利来完成初始化,不然就会报出上面的错误。
抱着试试的态度使用系统的URLSession
来做这件事,代码如下:
var dataTask: URLSessionDataTask?// curl -v "http://xxxxx/uaa/apid/member/code/get" -x "47.91.236.123:80" let url = URL(string: "http://xxxxx/uaa/apid/member/code/get") let configuration = URLSessionConfiguration.default configuration.timeoutIntervalForRequest = 30 configuration.connectionProxyDictionary = [ kCFNetworkProxiesHTTPEnable: true, kCFNetworkProxiesHTTPPort: 80, kCFNetworkProxiesHTTPProxy: "47.91.236.123" ] let session = URLSession(configuration: configuration) dataTask = session.dataTask(with: url!) { (data, response, error) in print("----------------------\n") if let result = data { let str = String(data: result, encoding: String.Encoding.utf8) print("result \(String(describing: str))") } if let msg = error { print(msg.localizedDescription) } print("----------------------\n") } dataTask?.resume()复制代码
这样居然可以完成达到这个目的,然后我们就把整个Network层换了。 /(ㄒoㄒ)/~~ 真是个蛋疼的问题!!!!
其实使用Alamofire
也可以完成
- 需要监听你的
Ip
变化 - 变化了,就重新创建一个
Alamofire
实例 代码如下:
final class Network { static let shared: SessionManager = { let configuration = URLSession.default cconfiguration.timeoutIntervalForRequest = 30 configuration.connectionProxyDictionary = [ kCFNetworkProxiesHTTPEnable: true, kCFNetworkProxiesHTTPPort: 80, kCFNetworkProxiesHTTPProxy: "47.91.236.123" ] return SessionManager(configuration: configuration) }()}复制代码