NETunnelProviderManager iOS 9上的startVPNTunnel

时间:2015-08-13 10:40:47

标签: ios9 ios-app-extension networkextension

自iOS 9测试版发布以来,Apple开放了NetworkExtension.framework,让开发人员可以在设备上实现自定义协议VPN客户端。

当我尝试使用以下代码连接自定义VPN

    let providerProtocol = NETunnelProviderProtocol()
    providerProtocol.serverAddress = "example.com"

    let manager = NETunnelProviderManager()
    manager.protocolConfiguration = providerProtocol
    manager.enabled = true
    manager.saveToPreferencesWithCompletionHandler({ error in
        guard error == nil else {
            print("saveToPreferencesWithCompletionHandler \(error)")
            return
        }

        do {
            try manager.connection.startVPNTunnel()
        } catch {
            print("startVPNTunnel \(error)")
        }
    })

startVPNTunnel Error Domain=NEVPNErrorDomain Code=1 "(null)"

会失败

4 个答案:

答案 0 :(得分:2)

在启动VPN之前,您必须先致电loadFromPreferencesWithCompletionHandler

答案 1 :(得分:2)

我认为在你启动VPNNTunnel之前你需要像这样loadFromPreferences:

./gradlew app:dependencies

答案 2 :(得分:0)

我认为您的配置无效。除此之外,协议必须配置您要加载的VPN插件的包标识符。

我强烈建议抓一些示例代码作为起点。配置这些野兽中的一个是一项相当复杂的任务,并且存在许多尖锐的边缘,其中一个微小的错误可能导致它完全失败,而没有任何明显暗示它失败的原因。

答案 3 :(得分:0)

根据Apple提供的文件,错误代码对应NEVPNErrorConfigurationInvalid,在下面的场景中引发

“与NEVPNManager对象关联的VPN配置无效。在配置缺少配置属性或配置属性无效时尝试保存配置时,或尝试在配置成功保存到配置之前使用配置时,可能会发生此错误网络扩展首选项或在从网络扩展首选项“

成功加载之前

填写providerProtocol和manager的所有属性并保存它们。如果不将配置分配给manager并将它们保存在manager.loadFromPreferencesWithCompletionHandler方法中,那么应解决您的问题。