2017-08-04 52 views
9

Về phía mạng, DNS Proxy là một trong những tính năng lớn nhất của iOS 11. Nhưng chúng chưa cung cấp nhiều tài liệu hoặc mẫu liên quan đến nó. Có một số talk trên đó cũng như nơi họ vừa đưa ra mô tả về những gì có thể với Proxy DNS.Cách sử dụng NEDNSProxyProvider trong iOS 11

Tôi muốn tạo mẫu làm việc nhưng chưa thành công cho đến bây giờ. Vì vậy, tôi đã tạo ra một phần mở rộng mạng với quyền truy cập DNS Proxy và thêm một nhà cung cấp Proxy DNS. Dưới đây là các mã:

class DNSProxyProvider: NEDNSProxyProvider { 
    let defaults = UserDefaults(suiteName: "group.com.securly.dnsProxy") 

    override init() { 
     NSLog("QNEDNSProxy.Provider: init") 
     super.init() 
     // +++ might want to set up KVO on `systemDNSSettings` 
    } 

    override func startProxy(options:[String: Any]? = nil, completionHandler: @escaping (Error?) -> Void) { 
     NSLog("QNEDNSProxy.Provider: start") 
     // self.defaults?.set("DidStart", forKey: "DidStart") 
     completionHandler(nil) 
    } 

    override func stopProxy(with reason: NEProviderStopReason, completionHandler: @escaping() -> Void) { 
     NSLog("QNEDNSProxy.Provider: stop") 
     completionHandler() 
    } 

    override func handleNewFlow(_ flow: NEAppProxyFlow) -> Bool { 
     NSLog("QNEDNSProxy.Provider: new flow (denied)") 
     // self.defaults?.set("DidHandleNewFlow", forKey: "DidHandleNewFlow") 
     return true 
    } 

} 

Sau đó, trong appdelegate, tôi tuyên bố một NEDNSProxyManager và sử dụng nó như:

class AppDelegate: UIResponder, UIApplicationDelegate { 

    var window: UIWindow? 
    let manager = NEDNSProxyManager.shared() 

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 

     self.enable() 
     return true 
    } 

    private func enable() { 
     self.update { 
      self.manager.localizedDescription = "DNSProxySample" 
      let proto = NEDNSProxyProviderProtocol() 
      // proto.providerConfiguration = +++ 
      proto.providerBundleIdentifier = "com.securly.dnsProxy" 
      self.manager.providerProtocol = proto 
      self.manager.isEnabled = true 
     } 
    } 

    private func disable() { 
     self.update { 
      self.manager.isEnabled = false 
     } 
    } 

    private func update(_ body: @escaping() -> Void) { 
     self.manager.loadFromPreferences { (error) in 
      guard error == nil else { 
       NSLog("DNSProxySample.App: load error") 
       return 
      } 
      body() 
      self.manager.saveToPreferences { (error) in 
       guard error == nil else { 
        NSLog("DNSProxySample.App: save error") 
        return 
       } 
       NSLog("DNSProxySample.App: saved") 
      } 
     } 
    } 
} 

câu hỏi/vấn đề:

  1. Tại sao không phải là startProxy hoặc handleNewFlow gọi? Có gì sai trong quá trình cài đặt không?
  2. Làm cách nào để đề cập đến địa chỉ DNS tùy chỉnh?

Trả lời

1

Tôi đã quản lý kích hoạt startProxyhandleFlow trên DNSProxyProvider theo hệ thống. cấu hình của tôi là như thế này:

  1. Quyền lợi trên mục tiêu ứng dụng enter image description here
  2. Quyền lợi trên DNSProxy mở rộng enter image description here đường đỏ là một cái gì đó tương tự như: group.com.xzy.project_name

  3. Info.plist tệp trên Tiện ích mở rộng enter image description here

  4. appdelegate

    import UIKit 
    import NetworkExtension 
    
    @UIApplicationMain 
    class AppDelegate: UIResponder, UIApplicationDelegate { 
    
        var window: UIWindow? 
        let manager = NEDNSProxyManager.shared() 
    
        func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 
         self.enable() 
         return true 
        } 
    
        private func enable() { 
         self.update { 
          self.manager.localizedDescription = "DNS" 
          let proto = NEDNSProxyProviderProtocol() 
          proto.providerBundleIdentifier = "EXTENSION_BUNDLE_IDENTIFIER_WHICH_HAS_DNS_PROXY" 
          self.manager.providerProtocol = proto 
          self.manager.isEnabled = true 
         } 
        } 
    
        private func disable() { 
         self.update { 
          self.manager.isEnabled = false 
         } 
        } 
    
        private func update(_ body: @escaping() -> Void) { 
         self.manager.loadFromPreferences { (error) in 
          guard error == nil else { 
           NSLog("DNS Test App: load error") 
           return 
          } 
          body() 
          self.manager.saveToPreferences { (error) in 
           guard error == nil else { 
            NSLog("DNS Test App: save error") 
            return 
           } 
           NSLog("DNS Test App: saved") 
          } 
         } 
        } 
    } 
    

KHÔNG QUÊN ĐỂ THAY ĐỔI BUNDLE IDENTIFIER tại đây proto.providerBundleIdentifier = "EXTENSION_BUNDLE_IDENTIFIER_WHICH_HAS_DNS_PROXY"

  1. DNSProxyProvider

    import NetworkExtension 
    
    class DNSProxyProvider: NEDNSProxyProvider { 
    
        override init() { 
         NSLog("DNSProxyProvider: init") 
         super.init() 
        } 
    
        override func startProxy(options:[String: Any]? = nil, completionHandler: @escaping (Error?) -> Void) { 
         NSLog("DNSProxyProvider: startProxy") 
         completionHandler(nil) 
        } 
    
        override func stopProxy(with reason: NEProviderStopReason, completionHandler: @escaping() -> Void) { 
         NSLog("DNSProxyProvider: stopProxy") 
         completionHandler() 
        } 
    
        override func sleep(completionHandler: @escaping() -> Void) { 
         NSLog("DNSProxyProvider: sleep") 
         completionHandler() 
        } 
    
        override func wake() { 
         NSLog("DNSProxyProvider: wake") 
        } 
    
        override func handleNewFlow(_ flow: NEAppProxyFlow) -> Bool { 
         NSLog("DNSProxyProvider: handleFlow") 
         return false 
        } 
    
    } 
    
  2. Bước cuối cùng chạy ứng dụng trên thiết bị iOS thực.

  3. Nếu bạn muốn hiển thị nhật ký tiện ích mở, hãy mở Console.app từ máy Mac của bạn.

  4. Để gỡ lỗi tiện ích mở rộng: Ứng dụng chính của bạn nên được chọn từ menu chạy. Chọn Attach to Process by PID or Name... từ trình đơn Gỡ lỗi của Xcode rồi nhập tên của tiện ích mở rộng, nhấn Attach. Sau khi bạn thấy số Waiting to attach to EXTENSION_NAME on XYZ's iPhone. Chạy mục tiêu ứng dụng của bạn trên thiết bị iOS.

Các vấn đề liên quan