在网络方面,DNS代理是iOS 11最大的功能之一。但他们没有提供太多关于它的文档或示例。在它上面有一个talk,他们刚刚描述了DNS代理的功能。
我想创建一个它的工作示例,但到目前为止还没有成功。所以我创建了一个具有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
?设置有什么问题吗?
1.如何提及自定义DNS地址?
1条答案
按热度按时间hmmo2u0o1#
在
DNSProxyProvider
上通过系统触发了startProxy
和handleFlow
,配置如下:1.应用程序目标
上的授权
1.授权在DNSProxy扩展
上红线类似于:组.com.xzy.项目名称
1.扩展名为
的信息.plist文件
1.应用程序委托
不要忘记在此处
proto.providerBundleIdentifier = "EXTENSION_BUNDLE_IDENTIFIER_WHICH_HAS_DNS_PROXY"
更改线束标识符1.最后一步,在真实的的iOS设备上运行应用程序。
1.如果要显示扩展日志,请从Mac打开Console.app。
1.要调试扩展:您的主应用应该从运行菜单中选择。从Xcode的调试菜单中选择
Attach to Process by PID or Name...
,然后输入扩展名,按Attach
按钮。看到Waiting to attach to EXTENSION_NAME on XYZ's iPhone
后,在iOS设备上运行您的应用目标。