问题描述
我正在尝试通过我的代码更改DNS设置以使用Google DNS服务器, 我进行了很多搜索,从@ user3769499问题中找到了这个答案https://stackoverflow.com/a/50730387/4949756,但这对我不起作用。 这是我的代码:
import Foundation
import NetworkExtension
public class VPNConnect {
public static let shared: VPNConnect = VPNConnect()
private static let vpnDescription = "DNS ondemand to GooglednS"
private static let vpnServerDescription = "ondemand DNS to GooglednS"
public var manager:NETunnelProviderManager = NETunnelProviderManager()
public var dnsEndpoint1:String = "8.8.8.8"
public var dnsEndpoint2:String = "8.8.4.4"
public var connected:Bool {
get {
return self.manager.isondemandEnabled
}
set {
if newValue != self.connected {
update(
body: {
self.manager.isEnabled = newValue
self.manager.isondemandEnabled = newValue
},complete: {
if newValue {
do {
try (self.manager.connection as? NETunnelProviderSession)?.startVPNTunnel(options: nil)
} catch let err as NSError {
NSLog("\(err.localizedDescription)")
}
} else {
(self.manager.connection as? NETunnelProviderSession)?.stopVPNTunnel()
}
}
)
}
}
}
public init() {
refreshManager()
}
public func refreshManager() -> Void {
NETunnelProviderManager.loadAllFromPreferences(completionHandler: { (managers,error) in
if nil == error {
if let managers = managers {
for manager in managers {
if manager.localizedDescription == VPNConnect.vpnDescription {
self.manager = manager
return
}
}
}
}
self.setPreferences()
})
}
private func update(body: @escaping ()->Void,complete: @escaping ()->Void) {
manager.loadFromPreferences { error in
if (error != nil) {
NSLog("Load error: \(String(describing: error?.localizedDescription))")
return
}
body()
self.manager.savetoPreferences { (error) in
if nil != error {
NSLog("vpn_connect: save error \(error!)")
} else {
complete()
}
}
}
}
private func setPreferences() {
self.manager.localizedDescription = VPNConnect.vpnDescription
let proto = NETunnelProviderProtocol()
// proto.providerBundleIdentifier = "com.DNSTest.NetworkExt"
proto.serverAddress = VPNConnect.vpnServerDescription
self.manager.protocolConfiguration = proto
// TLDList is a struct I created in its own swift file that has an array of all top level domains
let evaluationRule = NEEvaluateConnectionRule(matchDomains: TLDList.tlds,andAction: NEEvaluateConnectionRuleAction.connectIfNeeded)
evaluationRule.usednSServers = [self.dnsEndpoint1,self.dnsEndpoint2]
let ondemandRule = NEondemandRuleEvaluateConnection()
ondemandRule.connectionRules = [evaluationRule]
ondemandRule.interfaceTypeMatch = NEondemandRuleInterfaceType.any
self.manager.ondemandRules = [ondemandRule]
}
}
但是现在,我有两个问题。
- 我应该把这节课放在哪里?它应该在主应用程序目标中,还是创建一个
NetworkExtension
目标并将该类放入其中? - 如果必须以
NetworkExtension
为目标,如何访问此类以启用/禁用DNS?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)