2016-08-16 2 views
0

프록시를 설정하려고합니다. 다음은 내 코드입니다.Web-view swift에서 프록시를 설정하는 방법은 무엇입니까?

func startLoading() { 
     let proxy_server: CFString = "abc.somecompanyname.com" // proxy server 
     let proxy_port: CFNumber = 1234 // port 

     //"request" is your NSURLRequest 
     let url: NSURL = request.URL! 
     let urlString: String = url.absoluteString 
     let urlStringRef: CFString = (urlString as CFString) 
     let myURL: CFURLRef = CFURLCreateWithString(kCFAllocatorDefault, urlStringRef, nil) 
     let requestMethod: CFString = "GET"//CFSTR("GET") 
     // let myRequest = CFHTTPMessageCreateRequest(kCFAllocatorDefault, "GET", myURL, kCFHTTPVersion1_1).takeRetainedValue() 

     let myRequest: CFHTTPMessageRef = CFHTTPMessageCreateRequest(kCFAllocatorDefault, requestMethod, myURL, kCFHTTPVersion1_1).takeRetainedValue() 
     //CFHTTPMessageCreateRequest(kCFAllocatorDefault, requestMethod, myURL, kCFHTTPVersion1_1) 
     httpMessageRef = CFHTTPMessageCreateCopy(kCFAllocatorDefault, myRequest).takeRetainedValue() 
     let myReadStream: CFReadStreamRef = CFReadStreamCreateForHTTPRequest(kCFAllocatorDefault, myRequest).takeRetainedValue()//CFReadStreamCreateForHTTPRequest(kCFAllocatorDefault, myRequest) 
     // You can add body, headers.... using core function api, CFNetwork.etc 
     // below code is to set proxy from code if needs } 
     var hostKey: NSString 
     var portKey: NSString 
     /* 
     if (url.scheme.lowercaseString == "https") { 
     hostKey = kCFStreamPropertyHTTPSProxyHost as NSString 
     portKey = kCFStreamPropertyHTTPSProxyPort as NSString 
     } else { 
     hostKey = kCFStreamPropertyHTTPProxyHost as NSString 
     portKey = kCFStreamPropertyHTTPProxyPort as NSString 
     } 
     */ 
     hostKey = kCFNetworkProxiesHTTPProxy as NSString 
     portKey = kCFNetworkProxiesHTTPPort as NSString 

     let proxyToUse: [NSObject : AnyObject] = [ 
      hostKey : proxy_server, 
      portKey : proxy_port 
     ] 

     CFReadStreamSetProperty(myReadStream, kCFNetworkProxiesHTTPProxy, proxyToUse) 

     CFReadStreamOpen(myReadStream) 
    } 

프록시를 설정하는 데있어서 잘못된 점을 알려주십시오.

CFReadStreamCreateForHTTPRequest은 사용되지 않으므로 대신 그 대신 사용해야합니다. 나는 프록시 관련 물건에 대해서는 아직 미성숙하다. 그래서 나에게 똑같은 것에 대해 더 많이 알려주고 더 나은 방식으로 이것을 처리 할 것을 제안한다.

덕분에 당신은 사용자 정의 URL 프로토콜 핸들러를 생성하면

답변

1

, 당신의 프로토콜이 내장 된 프로토콜의 우선 순위를 가지게됩니다 코드 아래 사용하여 등록합니다.

import UIKit 
import CoreFoundation 

class ViewController: UIViewController { 

    @IBOutlet weak var sWebViewOutlet : UIWebView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     setupViewDidLoad() 
    } 

    func setupViewDidLoad() { 
     SpecialProtocol.registerSpecialProtocol() 

     let url = NSURL(string: "http://www.google.com") 
     let req = NSURLRequest(URL: url!) 
     /* if this request will be handled by our special protocol... */ 
     //if ([SpecialProtocol canInitWithRequest:request]) { 
     if SpecialProtocol.canInitWithRequest(req) { 
      print("SpecialProtocol.canInitWithRequest(req)") 
      self.sWebViewOutlet.loadRequest(req) 
     } 
     else { 
      print("SpecialProtocol.cantInitWithRequest(req)") 
     } 
    } 
} 

같은 HTTP, HTTPS, SSL 등 그것은 URL 데이터의 프로토콜 고유의 로딩을 수행하기위한 기본 구조를 제공하는 모든 웹 프로토콜을 처리 할 NSURLProtocol 클래스의 서브 클래스입니다. 코드 아래에 제 문제가 해결되었습니다 ... 제 생각보다 나은 해결책이나 답변을 게시하면 감사하겠습니다.

import UIKit 
import CoreFoundation 

class SpecialProtocol: NSURLProtocol, NSURLSessionDataDelegate, NSURLSessionTaskDelegate { 
//var httpMessageRef: CFHTTPMessage;() 
    var httpMessageRef: CFHTTPMessage? 

    class func registerSpecialProtocol() { 
     var inited: Bool = false 
     if !inited { 
      NSURLProtocol.registerClass(SpecialProtocol.self) 
      inited = true 
     } 
    } 


    private var dataTask:NSURLSessionDataTask? 
    private var urlResponse:NSURLResponse? 
    private var receivedData:NSMutableData? 

    class var CustomKey:String { 
     return "myCustomKey" 
    } 

    // MARK: NSURLProtocol 

    override class func canInitWithRequest(request: NSURLRequest) -> Bool { 
     if (NSURLProtocol.propertyForKey(SpecialProtocol.CustomKey, inRequest: request) != nil) { 
      return false 
     } 

     return true 
    } 

    override class func canonicalRequestForRequest(request: NSURLRequest) -> NSURLRequest { 
     return request 
    } 

    override func startLoading() { 

     let newRequest = self.request.mutableCopy() as! NSMutableURLRequest 

     NSURLProtocol.setProperty("true", forKey: SpecialProtocol.CustomKey, inRequest: newRequest) 

     let defaultConfigObj = customizeEphemeralSessionConfiguration()//NSURLSessionConfiguration.defaultSessionConfiguration() 
     let defaultSession = NSURLSession(configuration: defaultConfigObj, delegate: self, delegateQueue: nil) 

     self.dataTask = defaultSession.dataTaskWithRequest(newRequest) 
     self.dataTask!.resume() 

    } 

    func customizeEphemeralSessionConfiguration() -> NSURLSessionConfiguration { 
     let proxy_server: CFString = "YourProxyServer" // proxy server 

     let proxy_port: CFNumber = 1234 // your port 


     let hostKey: NSString = kCFNetworkProxiesHTTPProxy as NSString 
     let portKey: NSString = kCFNetworkProxiesHTTPPort as NSString 

     let proxyDict:[String:AnyObject] = [kCFNetworkProxiesHTTPEnable as String: true, hostKey as String:proxy_server, portKey as String: proxy_port] 

     let config = NSURLSessionConfiguration.ephemeralSessionConfiguration() 
     config.connectionProxyDictionary = proxyDict as [NSObject : AnyObject] 

     return config 
    } 


    override func stopLoading() { 
     self.dataTask?.cancel() 
     self.dataTask  = nil 
     self.receivedData = nil 
     self.urlResponse = nil 
    } 

    // MARK: NSURLSessionDataDelegate 

    func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, 
        didReceiveResponse response: NSURLResponse, 
             completionHandler: (NSURLSessionResponseDisposition) -> Void) { 

     self.client?.URLProtocol(self, didReceiveResponse: response, cacheStoragePolicy: .NotAllowed) 

     self.urlResponse = response 
     self.receivedData = NSMutableData() 

     completionHandler(.Allow) 
    } 

    func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveData data: NSData) { 
     self.client?.URLProtocol(self, didLoadData: data) 

     self.receivedData?.appendData(data) 
    } 

    // MARK: NSURLSessionTaskDelegate 

    func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?) { 
     if error != nil && error!.code != NSURLErrorCancelled { 
      self.client?.URLProtocol(self, didFailWithError: error!) 
     } else { 
      saveCachedResponse() 
      self.client?.URLProtocolDidFinishLoading(self) 
     } 
    } 

    // MARK: Private methods 

    /** 
    Do whatever with the data here 
    */ 
    func saveCachedResponse() { 
     let timeStamp = NSDate() 
     let urlString = self.request.URL?.absoluteString 
     let dataString = NSString(data: self.receivedData!, encoding: NSUTF8StringEncoding) as NSString? 
     print("TimeStamp:\(timeStamp)\nURL: \(urlString)\n\nDATA:\(dataString)\n\n") 
    } 

} 
+0

원래 프록시 (IP 주소 및 포트)를 숨길 수있는 ios를 만들고 싶습니다.이 경우 작동합니까? 어떻게 구현할 수 있습니까? – ShreePool

관련 문제