1

自 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

4 回答 4

2

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

于 2016-03-31T03:32:31.957 回答
2

我认为在你 startVPNTunnel 之前你需要像这样 loadFromPreferences :

manager.saveToPreferences(completionHandler: { (error) -> Void in
                if error != nil{
                }
                else{
                    manager.loadFromPreferences(completionHandler: { (error) -> Void in
                        if error != nil{
                        }
                        else{
                            do{
                                try manager.connection.startVPNTunnel(options: nil)
                            }
                            catch{
                            }
                        }
                    })
                }
            })
于 2016-11-04T04:43:50.727 回答
0

我认为您的配置无效。除其他事项外,该协议必须使用您要加载的 VPN 插件的捆绑标识符进行配置。

我强烈建议以一些示例代码为起点。配置其中一个野兽是一项非常复杂的任务,并且有很多尖锐的边缘,一个微小的错误可能会导致它完全失败,而没有任何明显的提示说明它失败的原因。

于 2015-09-16T06:19:59.473 回答
0

根据 Apple 提供的文件,错误代码对应于 NEVPNErrorConfigurationInvalid,它在以下情况下抛出

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

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

于 2015-10-16T02:52:04.080 回答