Thanks Matt!
Please let me add few more details, below is my code.
(void)configureDNSProxy {
ns_info(module, "DNS proxy configurations will be loaded");
[[NEDNSProxyManager sharedManager]
loadFromPreferencesWithCompletionHandler:^(NSError * __nullable loadError) {
if (loadError){
return;
}
NEDNSProxyProviderProtocol *tunnelProtocol = [[NEDNSProxyProviderProtocol alloc] init];
[tunnelProtocol setServerAddress:@"DNS Gateway"];
tunnelProtocol.providerBundleIdentifier = dnsProxyBundleID_;
[NEDNSProxyManager sharedManager].enabled = true;
[NEDNSProxyManager sharedManager].localizedDescription = @"DNS Proxy";
[NEDNSProxyManager sharedManager].providerProtocol = tunnelProtocol;
[[NEDNSProxyManager sharedManager] saveToPreferencesWithCompletionHandler:^(NSError * _Nullable savePrefError) {
if (savePrefError) {
return;
}
}];
}];
}
(OSSystemExtensionReplacementAction)request:(OSSystemExtensionRequest *)request
																		actionForReplacingExtension:(OSSystemExtensionProperties *)existing
																withExtension:(OSSystemExtensionProperties *)ext {
		return OSSystemExtensionReplacementActionReplace;
}
(void)requestNeedsUserApproval:(OSSystemExtensionRequest *)request {
}
(void)request:(OSSystemExtensionRequest *)request
didFailWithError:(NSError *)error {
}
(void)request:(OSSystemExtensionRequest *)request
didFinishWithResult:(OSSystemExtensionRequestResult)result {
[self configureDNSProxy];
}
(void) initializeDNSProxy {
				NSString *extensionIdentifier = dnsProxyBundleID_;
				dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);				 OSSystemExtensionRequest *req = [OSSystemExtensionRequest activationRequestForExtension:extensionIdentifier
																																													queue:queue];
				req.delegate = self;
				[[OSSystemExtensionManager sharedManager] submitRequest:req];
}
It is called [myobj initializeDNSProxy];
Is it correct code?
Thanks