【发布时间】:2015-10-22 15:00:00
【问题描述】:
我开发了一个需要连接 VPN 才能查看应用内容的应用。我现在的问题是,每当用户忘记打开 VPN 时,我需要显示用户警报框,提醒用户连接到 VPN 以在应用程序打开后查看内容(我认为我需要在 AppDelegate 中实现此功能)。我怎样才能达到这种情况? .提前谢谢你。
【问题讨论】:
我开发了一个需要连接 VPN 才能查看应用内容的应用。我现在的问题是,每当用户忘记打开 VPN 时,我需要显示用户警报框,提醒用户连接到 VPN 以在应用程序打开后查看内容(我认为我需要在 AppDelegate 中实现此功能)。我怎样才能达到这种情况? .提前谢谢你。
【问题讨论】:
我写了一个小助手来检测你在找什么。这是sn-p:
struct VpnChecker {
private static let vpnProtocolsKeysIdentifiers = [
"tap", "tun", "ppp", "ipsec", "utun"
]
static func isVpnActive() -> Bool {
guard let cfDict = CFNetworkCopySystemProxySettings() else { return false }
let nsDict = cfDict.takeRetainedValue() as NSDictionary
guard let keys = nsDict["__SCOPED__"] as? NSDictionary,
let allKeys = keys.allKeys as? [String] else { return false }
// Checking for tunneling protocols in the keys
for key in allKeys {
for protocolId in vpnProtocolsKeysIdentifiers
where key.starts(with: protocolId) {
// I use start(with:), so I can cover also `ipsec4`, `ppp0`, `utun0` etc...
return true
}
}
return false
}
}
用法:VpnChecker.isVpnActive()
我还写了一篇关于它的小博文here
【讨论】:
要检查连接是否通过 VPN,请执行此代码并在用户每次使用应用程序时调用它,因此必须在
中进行处理func applicationDidBecomeActive(_ application: UIApplication) { }
或
func applicationWillEnterForeground(_ application: UIApplication) { }
func isVPNConnected() -> Bool {
let cfDict = CFNetworkCopySystemProxySettings()
let nsDict = cfDict!.takeRetainedValue() as NSDictionary
let keys = nsDict["__SCOPED__"] as! NSDictionary
for key: String in keys.allKeys as! [String] {
if (key == "tap" || key == "tun" || key == "ppp" || key == "ipsec" || key == "ipsec0" || key == "utun1" || key == "utun2") {
return true
}
}
return false
}
【讨论】:
您正在尝试通过 VPN 连接到特定站点或 IP 地址,对吗?你可以简单地使用Reachability来检测IP地址是否可达,Apple sample code can be found here。
更多信息可见theserelated questions。
【讨论】: