我们正在将移动应用程序从iOS本机(Swift)转换为Xamarin.iOS(以便最终可以部署到多个操作系统)。
我正在尝试研究如何在Xamarin.iOS中执行以下操作: 1-检查iOS设备上的VPN连接是否处于活动状态/已启用 2-弹出“ VPN设置”屏幕(或更妙的是,自动启用特定的VPN)
针对: 1-此https://docs.microsoft.com/en-us/dotnet/api/networkextension.nevpnstatus是否适用? 2-https://docs.microsoft.com/en-us/dotnet/api/networkextension.netunnelprovidermanager是否相同?
现有Swift代码的片段:
func connectToVpn(){
//mention the connection name instead of exposing the server
//let connectUrl = URL(string: "mobileconnect://connect?name=*********")
let connectUrl = URL(string: "mobileconnect://connect?")
if UIApplication.shared.canOpenURL(connectUrl!) == true
{
UIApplication.shared.openURL(connectUrl!)
}
}
var isVpnConnected : Bool {
let dict = CFNetworkCopySystemProxySettings()?.takeUnretainedValue() as? [String: AnyObject]
guard let keys = dict?["__SCOPED__"]?.allKeys as? [String] else{
return false
}
for key in keys {
if key.contains("tap") || key.contains("tun") || key.contains("ppp") {
return true
}
}
return false
}
任何评论/建议/ youtube视频/博客条目链接将不胜感激。
编辑: 对于1-已实现,我不需要检查VPN状态,只需ping内部服务器/主机以查看其是否响应。
答案 0 :(得分:0)
仅iOS允许您从应用程序内打开自己的应用程序设置页面。如果您的应用未实现自己的设置页面,则将打开主设置页面,但无法打开特定的系统设置页面。在SO上的其他地方查看此讨论:How to open Settings programmatically like in Facebook app?
答案 1 :(得分:0)
您的方法是必经之路,无论使用哪种接口类型都无关紧要。请注意,还有其他接口名称,例如“ utun2”。不确定从何处提取所有接口名称,但是这里是Xamarin的更新版本,以防有人入侵。
public bool isVPNConnected()
{
var settings = CoreFoundation.CFNetwork.GetSystemProxySettings();
var keys = settings.Dictionary.ValueForKey(new NSString("__SCOPED__")) as NSDictionary;
return keys.Any(k => new string[] { "tap", "tun", "utun2", "ppp", "ipsec", "ipsec0" }.Contains(k.Key.ToString()));
}