Как я могу изменить DNS-сервер iOS, используя swift - PullRequest
0 голосов
/ 16 апреля 2020

Я пытаюсь изменить DNS-серверы с помощью NEDNSProxyManager следующим образом:

var dnsManager: NEDNSProxyManager = NEDNSProxyManager.shared()

private func enable() {
    self.update {

        self.dnsManager.localizedDescription = "QNEDNSProxy Test"

        let proto = NEDNSProxyProviderProtocol()
        proto.serverAddress = "Custom DNS Server"

        proto.providerBundleIdentifier = self.tunnelBundleId
        self.dnsManager.providerProtocol = proto
        self.dnsManager.isEnabled = true
    }
}

private func disable() {
    self.update {
        self.dnsManager.isEnabled = false
    }
}

private func update(_ body: @escaping () -> Void) {
    self.dnsManager.loadFromPreferences { error in
        guard error == nil else {
            NSLog("QNEDNSProxy.App: load error")
            return
        }
        body()
        self.dnsManager.saveToPreferences { error in
            guard error == nil else {
                NSLog("QNEDNSProxy.App: save error")
                return
            }
            NSLog("QNEDNSProxy.App: saved")
        }
    }
}

Мое сетевое расширение выглядит так:

import NetworkExtension

класс DNSProxyProvider: NEDNSProxyProvider {

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")
    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)")
    return false
}

}

Я даю разрешения для DNS-прокси и получения журналов "QNEDNSProxy.App: сохранено", это означает, что моя конфигурация была сохранена, НО, методы staryProxy () или stopProxy () никогда не запускаются .

Мой список сетевых расширений выглядит следующим образом:

<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>DNSProxyManager</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>NSExtension</key>
<dict>
    <key>NSExtensionPointIdentifier</key>
    <string>com.apple.networkextension.dns-proxy</string>
    <key>NSExtensionPrincipalClass</key>
    <string>$(PRODUCT_MODULE_NAME).DNSProxyProvider</string>
</dict>

Разрешения для расширения сети и цели приложения:

<dict>
<key>com.apple.developer.networking.networkextension</key>
<array>
    <string>app-proxy-provider</string>
    <string>content-filter-provider</string>
    <string>dns-proxy</string>
    <string>packet-tunnel-provider</string>
</array>

Но все же я не могу добиться этой работы, или я даже не знаю, сработает ли это просто для изменения DNS-сервера. Кто-то делал это раньше? Заранее спасибо

...