如何在iOS 11中使用NEDNSProxyProvider [英] How to use NEDNSProxyProvider in iOS 11

查看:441
本文介绍了如何在iOS 11中使用NEDNSProxyProvider的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在网络方面,DNS代理是iOS 11的最大功能之一.但是,他们没有提供太多有关它的文档或示例.上面有一个对话以及他们刚刚给出了什么描述可以与DNS代理一起使用.

On the networking side, DNS Proxy is one of the biggest features of iOS 11. But they haven't provided much documentation or samples regarding it. There's a talk on it as well where they have just given a description of what is possible with DNS Proxy.

我想为其创建一个工作示例,但直到现在都没有成功.因此,我创建了具有DNS代理权利的网络扩展,并添加了DNS代理提供程序.这是代码:

I want to create a working sample of it but didn't get success till now. So I have created a Network Extension with DNS Proxy entitlements and added a DNS Proxy Provider. Here's the code:

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并将其用作:

Then in AppDelegate, I declare a NEDNSProxyManager and use it as:

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. 为什么不调用startProxyhandleNewFlow?设置有什么问题吗?
  2. 如何提及自定义DNS地址?
  1. Why isn't startProxy or handleNewFlow called? Is there anything wrong in the setup?
  2. How do I mention custom DNS address?

推荐答案

我设法通过系统触发了DNSProxyProvider上的startProxyhandleFlow.我的配置是这样的:

I managed to trigger startProxy and handleFlow on DNSProxyProvider by system. My configurations are like this:

    针对应用定位的
  1. 权利
  2. 关于DNSProxy扩展的
  3. 权利 红线类似于:group.com.xzy.project_name

  1. Entitlements on app target
  2. Entitlements on DNSProxy Extension Red line is something similar to: group.com.xzy.project_name

Info.plist 文件

AppDelegate

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

  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")
        if let tcpFlow = flow as? NEAppProxyTCPFlow {
            let remoteHost = (tcpFlow.remoteEndpoint as! NWHostEndpoint).hostname
            let remotePort = (tcpFlow.remoteEndpoint as! NWHostEndpoint).port
            NSLog("DNSProxyProvider TCP HOST : \(remoteHost)")
            NSLog("DNSProxyProvider TCP PORT : \(remotePort)")
        } else if let udpFlow = flow as? NEAppProxyUDPFlow {
            let localHost = (udpFlow.localEndpoint as! NWHostEndpoint).hostname
            let localPort = (udpFlow.localEndpoint as! NWHostEndpoint).port
            NSLog("DNSProxyProvider UDP HOST : \(localHost)")
            NSLog("DNSProxyProvider UDP PORT : \(localPort)")
        }
        return true
    }

}

  • 最后一步,在真实的 iOS设备上运行该应用.

  • As a last step run the app on a real iOS Device.

    如果要显示扩展日志,请从Mac打开 Console.app .

    If you want to display extension logs open Console.app from your Mac.

    要调试扩展,请执行以下操作:应从运行菜单中选择您的主应用.从Xcode的 Debug 菜单中选择Attach to Process by PID or Name...,然后键入扩展名,然后按Attach按钮.看到Waiting to attach to EXTENSION_NAME on XYZ's iPhone之后.在iOS设备上运行您的应用目标.

    To debug the extension: Your main app should be selected from run menu. Select Attach to Process by PID or Name... from Xcode's Debug menu and then type your extension's name, press Attach button. After you see the Waiting to attach to EXTENSION_NAME on XYZ's iPhone. Run your app target on a iOS device.

    这篇关于如何在iOS 11中使用NEDNSProxyProvider的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

  • 查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆