1

I've created a MacOS app project which contains System Network Extension (DNS proxy). With help of https://developer.apple.com/forums/thread/81103?answerId=246229022 and How to use NEDNSProxyProvider in iOS 11. I enabled DNSProxyProvider. When I built the app for the first time a prompt asked to allow the system extension. I allowed it and Under network in system preference, I can see DNS is not running (yellow dot). Not running

I added OSSystemextensionRequest from the container App. This is my code.

import Cocoa
import NetworkExtension
import SystemExtensions
import OSLog


class ViewController: NSViewController {


let log=OSLog(subsystem:"com.example.applesamplecode.DNSTestBed", category: "app")
let manager = NEDNSProxyManager.shared()

private func installSystemExtension() {
  os_log("DNSFProxy: installing system extension")
  let request = OSSystemExtensionRequest.activationRequest(
    forExtensionWithIdentifier: "my system extension's bundle indentifier",
    queue: .main
  )
  request.delegate = self
  OSSystemExtensionManager.shared.submitRequest(request)
}

private func enable() {
    NSLog("enabled already ",self.manager.isEnabled )
    NSLog(self.manager.isEnabled  ? "Yes" : "No")
    self.update {
        self.manager.localizedDescription = "DNS"
        let proto = NEDNSProxyProviderProtocol()
        proto.serverAddress = "localhost"
        proto.providerBundleIdentifier = "my system extension's bundle indentifier"
        self.manager.providerProtocol = proto
        self.manager.isEnabled = true
    }
    NSLog(self.manager.isEnabled  ? "Yes" : "No")
    
    
}

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("DNS Test App: load error")
            return
        }
        body()
        self.manager.saveToPreferences { (error) in
            guard error == nil else {
                NSLog("DNS Test App: save error")
                return
            }
            NSLog("DNS Test App: saved")
        }
    }
}



override func viewDidLoad() {
    super.viewDidLoad()
    
    self.enable()
    self.installSystemExtension()

    

}

}



 extension ViewController: OSSystemExtensionRequestDelegate {



func request(_ request: OSSystemExtensionRequest, actionForReplacingExtension existing: OSSystemExtensionProperties, withExtension ext: OSSystemExtensionProperties) -> OSSystemExtensionRequest.ReplacementAction {
    os_log("DNSProxy: Replacing extension %@ version %@ with version %@", request.identifier, existing.bundleShortVersion, ext.bundleShortVersion)
    return .replace
  }
   
  func requestNeedsUserApproval(_ request: OSSystemExtensionRequest) {
    os_log("DNSProxy: Extension %@ requires user approval", request.identifier)
  }
   
  func request(_ request: OSSystemExtensionRequest, didFailWithError error: Error) {
    os_log("DNSProxy: System extension request failed: %@", error.localizedDescription)
  }
   
  /* Other delegate methods here */
  func request(_ request: OSSystemExtensionRequest, didFinishWithResult result: OSSystemExtensionRequest.Result) {
    switch result {
    case .completed:
      var manager = NEDNSProxyManager.shared()
    case .willCompleteAfterReboot:
       os_log("DNSProxy: willCompleteAfterReboot")
    @unknown default:
      os_log("DNSProxy: default")
    }
  }
}

Info.plist of system extension:

info.plist

I'm getting an error when the activation request happens: The operation couldn’t be completed. (OSSystemExtensionErrorDomain error 1.). Any help would be great. Thanks. P.S: I also posted this in apple forums https://developer.apple.com/forums/thread/717647

0 Answers0