Establish a VPN connection in Mac Catalyst

211 views Asked by At

I'm creating a VPN app in Mac Catalyst.

The demo works fine on the iOs platform but when I run on make catalyst, VPN status changes to Connecting... and then Disconnected.... The same code also works in macOS separate project.

I've used NETunnelProviderManager

Here is the demo. https://github.com/anismansuri63/DNS-Forwarding

public func establishConnection(extensionBundleID: String) {
        tunnelBundleId = extensionBundleID
        initVPNTunnelProviderManager()
    }
    private func initVPNTunnelProviderManager(completionHandler: VoidHandler? = nil) {
        NETunnelProviderManager.loadAllFromPreferences { (savedManagers: [NETunnelProviderManager]?, error: Error?) in
            if let error = error {
                print(error)
            }
            if let savedManagers = savedManagers {
                if savedManagers.count > 0 {
                    self.vpnManager = savedManagers[0]
                }
            }
            self.vpnManager.loadFromPreferences(completionHandler: { (error:Error?) in
                if let error = error {
                    print(error)
                }
                let providerProtocol = NETunnelProviderProtocol()
                providerProtocol.providerBundleIdentifier = self.tunnelBundleId

                providerProtocol.providerConfiguration = [
                                                          "server": self.serverAddress,
                                                          "dns": self.dns
                ]
                providerProtocol.serverAddress = self.serverAddress
                self.vpnManager.protocolConfiguration = providerProtocol
                self.vpnManager.localizedDescription = "Family Protection"
                self.vpnManager.isEnabled = true
                self.vpnManager.saveToPreferences(completionHandler: { (error:Error?) in
                    if let error = error {
                        print(error)
                    } else {
                        print("Save successfully")
                        completionHandler?()
                    }
                })
                self.VPNStatusDidChange(nil)

            })
        }
        NotificationCenter.default.addObserver(self, selector: #selector(VPNStatusDidChange(_:)), name: NSNotification.Name.NEVPNStatusDidChange, object: nil)
    }
public func enableProtection() {
        self.vpnManager.loadFromPreferences { [weak self] error in
            if let error = error {
                print(error)
            }
            do {
                try self?.vpnManager.connection.startVPNTunnel()
            } catch {
                self?.initVPNTunnelProviderManager(completionHandler: {
                    self?.enableProtection()
                })
                print(error)
            }
        }
    }
0

There are 0 answers