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)
}
}
}