在网络方面,DNS代理是iOS 11最重要的功能之一。但是关于它们并没有提供太多的文档或示例。有一个讲座也提到了它,但他们只是描述了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")
}
}
}
}
问题/问题:
- 为什么没有调用
startProxy
或者handleNewFlow
?设置有什么问题吗? - 我该如何提及自定义DNS地址?
Questions/Issues:
- 为什么没有调用
startProxy
或handleNewFlow
?设置有什么问题吗? - 如何提及自定义DNS地址?
Debug
构建来执行这些指令,而无需管理该设备。如果您想要使用Managed
设备,则需要安装一个特定于您的应用程序的.mobileconfig
文件。 - abdullahselek