【问题标题】:How can I detect vpn connection in xcode?如何在 xcode 中检测 vpn 连接?
【发布时间】:2015-10-22 15:00:00
【问题描述】:

我开发了一个需要连接 VPN 才能查看应用内容的应用。我现在的问题是,每当用户忘记打开 VPN 时,我需要显示用户警报框,提醒用户连接到 VPN 以在应用程序打开后查看内容(我认为我需要在 AppDelegate 中实现此功能)。我怎样才能达到这种情况? .提前谢谢你。

【问题讨论】:

    标签: ios xcode vpn


    【解决方案1】:

    我写了一个小助手来检测你在找什么。这是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

    【讨论】:

      【解决方案2】:

      要检查连接是否通过 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
      }
      

      【讨论】:

        【解决方案3】:

        您正在尝试通过 VPN 连接到特定站点或 IP 地址,对吗?你可以简单地使用Reachability来检测IP地址是否可达,Apple sample code can be found here

        更多信息可见theserelated questions

        【讨论】:

        • “您可以简单地使用可达性来检测 IP 地址是否可达” - 不,你不能。 Apple 的主机可达性实际上并没有测试到达 IP,它只测试第一跳(例如到本地路由器)。名字完全错了。
        猜你喜欢
        • 2011-03-12
        • 2013-04-23
        • 1970-01-01
        • 1970-01-01
        • 2019-07-08
        • 2011-12-29
        • 2022-11-09
        • 2019-04-09
        • 2020-05-29
        相关资源
        最近更新 更多