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 đề:
- Tại sao không phải là
startProxy
hoặchandleNewFlow
gọi? Có gì sai trong quá trình cài đặt không? - Làm cách nào để đề cập đến địa chỉ DNS tùy chỉnh?