Thanks for your answer Quinn. My AppProxyProvider's startProxy function is like this and tries to open a tunnel connection.
override func startProxy(options: [String : Any]?, completionHandler: @escaping (Error?) -> Void) {
let newTunnel = ClientTunnel()
newTunnel.delegate = self
if let error = newTunnel.startTunnel(self) {
completionHandler(error as NSError)
return
}
pendingStartCompletion = completionHandler
tunnel = newTunnel
}
On ClientTunnel startTunnel function
func startTunnel(_ provider: NETunnelProvider) -> SimpleTunnelError? {
guard let serverAddress = provider.protocolConfiguration.serverAddress else {
return .badConfiguration
}
let endpoint: NWEndpoint
if let colonRange = serverAddress.rangeOfCharacter(from: CharacterSet(charactersIn: ":"), options: [], range: nil) {
let hostname = String(serverAddress[serverAddress.startIndex..<colonRange.lowerBound])
let portString = String(serverAddress[serverAddress.index(after: colonRange.lowerBound)..<serverAddress.endIndex])
guard !hostname.isEmpty && !portString.isEmpty else {
return .badConfiguration
}
endpoint = NWHostEndpoint(hostname:hostname, port:portString)
}
else {
endpoint = NWBonjourServiceEndpoint(name: serverAddress, type:Tunnel.serviceType, domain:Tunnel.serviceDomain)
}
connection = provider.createTCPConnection(to: endpoint, enableTLS:false, tlsParameters:nil, delegate:nil)
connection!.addObserver(self, forKeyPath: "state", options: .initial, context: &ClientTunnel.observerContext)
return nil
}
With in this startTunnel function endpoint comes as example.com._tunnelserver._tcp.local and the connection state stays as connecting. As I read from NEAppProxyProvider documentation handleFlow function triggered by system whenever an app which matches the current App Proxy configuration’s app rules opens a new network connection. For the app rules do I need to set something on .mobileconfig file? If so could you give me some examples? Or there must be a open connection?
UPDATED PART:
I updated startProxy and stopProxy functions as below but still no luck on triggering handleFlow function.
override func startProxy(options: [String : Any]?, completionHandler: @escaping (Error?) -> Void) {
completionHandler(nil)
}
override func stopProxy(with reason: NEProviderStopReason, completionHandler: @escaping () -> Void) {
completionHandler()
}
Thanks,
Krypton