2017-08-04 37 views
9

नेटवर्किंग पक्ष पर, DNS प्रॉक्सी आईओएस 11 की सबसे बड़ी सुविधाओं में से एक है। लेकिन उन्होंने इसके बारे में अधिक दस्तावेज या नमूने प्रदान नहीं किए हैं। इसमें talk भी है, जहां उन्होंने DNS प्रॉक्सी के साथ क्या संभव है इसका विवरण दिया है।आईओएस में NEDNSProxyProvider का उपयोग कैसे करें 11

मैं इसका एक कामकाजी नमूना बनाना चाहता हूं लेकिन अब तक सफलता प्राप्त नहीं हुई है। इसलिए मैंने DNS प्रॉक्सी एंटाइटेलमेंट के साथ नेटवर्क एक्सटेंशन बनाया है और एक DNS प्रॉक्सी प्रदाता जोड़ा है।

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 
    } 

} 

फिर AppDelegate में, मैं एक NEDNSProxyManager घोषित करने और के रूप में उपयोग:

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") 
      } 
     } 
    } 
} 

प्रश्न/मुद्दे:

  1. क्यों startProxy या handleNewFlow बुलाया नहीं है यहाँ कोड है? क्या सेटअप में कुछ गलत है?
  2. मैं कस्टम DNS पता का उल्लेख कैसे करूं?

उत्तर

1

मैं प्रणाली द्वारा DNSProxyProvider पर startProxy और handleFlow को गति प्रदान करने में कामयाब रहे। मेरे विन्यास इस तरह हैं: एप्लिकेशन लक्ष्य पर

  1. पात्रता enter image description here
  2. DNSProxy एक्सटेंशन पर

    पात्रता enter image description here लाल लाइन के लिए कुछ इसी तरह है: group.com.xzy.project_name

  3. Info.plist एक्सटेंशन पर फ़ाइल

  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") 
          } 
         } 
        } 
    } 
    

यहाँ पर बंडल पहचानकर्ता बदलने के लिए 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. अंतिम चरण के रूप में एक असली आईओएस डिवाइस पर ऐप चलाएं।

  3. यदि आप अपने मैक से Console.app एक्सटेंशन लॉग प्रदर्शित करना चाहते हैं।

  4. एक्सटेंशन डीबग करने के लिए: आपका मुख्य ऐप रन मेनू से चुना जाना चाहिए। Xcode के डीबग मेनू से Attach to Process by PID or Name... का चयन करें और फिर अपना एक्सटेंशन का नाम टाइप करें, Attach बटन दबाएं। Waiting to attach to EXTENSION_NAME on XYZ's iPhone देखने के बाद। आईओएस डिवाइस पर अपना ऐप लक्ष्य चलाएं।

संबंधित मुद्दे