Swift 包隧道提供程序IOS中的动态DNS

Swift 包隧道提供程序IOS中的动态DNS,swift,dns,vpn,tunnel,networkextension,Swift,Dns,Vpn,Tunnel,Networkextension,我有一个应用程序包含vpn配置使用包隧道提供商 在设置隧道上的隧道时,我们将设置为8.8.8.8 有任何优雅合法的方法可以通过设备使用的dns(wifi、4g等)将其更改为动态 让dnsSettings=NEDNSSettings(服务器:[8.8.8.8]) tunnelNetworkSettings.dnsSettings=dnsSettings您可以使用此代码获取系统DNS服务器 static func getSystemDnsList() -> ([String]/*IPV4*/,

我有一个应用程序包含vpn配置使用包隧道提供商 在设置隧道上的隧道时,我们将设置为8.8.8.8 有任何优雅合法的方法可以通过设备使用的dns(wifi、4g等)将其更改为动态

让dnsSettings=NEDNSSettings(服务器:[8.8.8.8])


tunnelNetworkSettings.dnsSettings=dnsSettings

您可以使用此代码获取系统DNS服务器

static func getSystemDnsList() -> ([String]/*IPV4*/, [String]/*IPV6*/) {
        var dnsListIPV4 = [String]()
        var dnsListIPV6 = [String]()
            let structSize = MemoryLayout<__res_9_state>.size
            let res = UnsafeMutablePointer<__res_9_state>.allocate(capacity: structSize)
            let result = res_9_ninit(res)
            if result == 0 {
                let structSize = MemoryLayout<res_9_sockaddr_union>.size
                let capacity = Int(res.pointee.nscount) * structSize

                let addrUnion = UnsafeMutablePointer<res_9_sockaddr_union>.allocate(capacity: capacity)
                res_9_getservers(res, addrUnion, res.pointee.nscount)

                for i in 0..<Int(res.pointee.nscount) {
                    if addrUnion[i].sin.sin_family == AF_INET {
                        let ip = UnsafeMutablePointer<Int8>.allocate(capacity: Int(INET_ADDRSTRLEN))

                        var ipStringObject : String?
                        if let ipStr = inet_ntop(AF_INET, &(addrUnion[i].sin.sin_addr), ip, socklen_t(INET_ADDRSTRLEN)) {
                            ipStringObject = String(utf8String: ipStr)
                        }

                        var portStringObject : String?
                        let port = nTohs(addrUnion[i].sin.sin_port)
                        portStringObject = String(format: "%d", port)

                        if let ip = ipStringObject {
                            dnsListIPV4.append(ip)
                        }
                    } else if addrUnion[i].sin6.sin6_family == AF_INET6 {
                        let ip = UnsafeMutablePointer<Int8>.allocate(capacity: Int(INET6_ADDRSTRLEN))

                        var ipStringObject : String?
                        if let ipStr = inet_ntop(AF_INET6, &(addrUnion[i].sin6.sin6_addr), ip, socklen_t(INET6_ADDRSTRLEN)) {
                            ipStringObject = String(utf8String: ipStr)
                        }

                        var portStringObject : String?
                        let port = nTohs(addrUnion[i].sin6.sin6_port)
                        portStringObject = String(format: "%d", port)

                        if let ip = ipStringObject {
                            dnsListIPV6.append(ip)
                        }
                    }
                }

                res_9_nclose(res)
                free(res)
            }

            return (dnsListIPV4, dnsListIPV6)
        }
static func getSystemDnsList()->([String]/*IPV4*/,[String]/*IPV6*/){
变量dnsListIPV4=[String]()
变量dnsListIPV6=[String]()
设structSize=MemoryLayout.size
let res=unsafemeutablepointer.allocate(容量:structSize)
设结果=res_9_ninit(res)
如果结果==0{
设structSize=MemoryLayout.size
让容量=Int(res.pointee.nscount)*structSize
让addrUnion=unsafemeutablepointer.allocate(容量:容量)
res_9_getservers(res、addrUnion、res.pointee.nscount)

对于0..中的i,您可以使用此代码获取系统DNS服务器

static func getSystemDnsList() -> ([String]/*IPV4*/, [String]/*IPV6*/) {
        var dnsListIPV4 = [String]()
        var dnsListIPV6 = [String]()
            let structSize = MemoryLayout<__res_9_state>.size
            let res = UnsafeMutablePointer<__res_9_state>.allocate(capacity: structSize)
            let result = res_9_ninit(res)
            if result == 0 {
                let structSize = MemoryLayout<res_9_sockaddr_union>.size
                let capacity = Int(res.pointee.nscount) * structSize

                let addrUnion = UnsafeMutablePointer<res_9_sockaddr_union>.allocate(capacity: capacity)
                res_9_getservers(res, addrUnion, res.pointee.nscount)

                for i in 0..<Int(res.pointee.nscount) {
                    if addrUnion[i].sin.sin_family == AF_INET {
                        let ip = UnsafeMutablePointer<Int8>.allocate(capacity: Int(INET_ADDRSTRLEN))

                        var ipStringObject : String?
                        if let ipStr = inet_ntop(AF_INET, &(addrUnion[i].sin.sin_addr), ip, socklen_t(INET_ADDRSTRLEN)) {
                            ipStringObject = String(utf8String: ipStr)
                        }

                        var portStringObject : String?
                        let port = nTohs(addrUnion[i].sin.sin_port)
                        portStringObject = String(format: "%d", port)

                        if let ip = ipStringObject {
                            dnsListIPV4.append(ip)
                        }
                    } else if addrUnion[i].sin6.sin6_family == AF_INET6 {
                        let ip = UnsafeMutablePointer<Int8>.allocate(capacity: Int(INET6_ADDRSTRLEN))

                        var ipStringObject : String?
                        if let ipStr = inet_ntop(AF_INET6, &(addrUnion[i].sin6.sin6_addr), ip, socklen_t(INET6_ADDRSTRLEN)) {
                            ipStringObject = String(utf8String: ipStr)
                        }

                        var portStringObject : String?
                        let port = nTohs(addrUnion[i].sin6.sin6_port)
                        portStringObject = String(format: "%d", port)

                        if let ip = ipStringObject {
                            dnsListIPV6.append(ip)
                        }
                    }
                }

                res_9_nclose(res)
                free(res)
            }

            return (dnsListIPV4, dnsListIPV6)
        }
static func getSystemDnsList()->([String]/*IPV4*/,[String]/*IPV6*/){
变量dnsListIPV4=[String]()
变量dnsListIPV6=[String]()
设structSize=MemoryLayout.size
let res=unsafemeutablepointer.allocate(容量:structSize)
设结果=res_9_ninit(res)
如果结果==0{
设structSize=MemoryLayout.size
让容量=Int(res.pointee.nscount)*structSize
让addrUnion=unsafemeutablepointer.allocate(容量:容量)
res_9_getservers(res、addrUnion、res.pointee.nscount)
因为我在0。。