如何在OS X上的Swift中创建VPN连接?

时间:2015-03-03 00:22:16

标签: macos swift vpn

我按照this教程中描述的步骤进行了操作。

我尝试将代码从Objective-C转换为Swift。这是我的代码:

 var l2tpInterface = SCNetworkInterfaceCreateWithInterface(
        kSCNetworkInterfaceIPv4,
        kSCNetworkInterfaceTypeL2TP
        ).takeUnretainedValue();
    var pppInterface = SCNetworkInterfaceCreateWithInterface(
        l2tpInterface,
        kSCNetworkInterfaceTypePPP
        ).takeUnretainedValue();
    var prefs = SCPreferencesCreate(nil,"SoybeanVPN",nil).takeUnretainedValue();
    var service = SCNetworkServiceCreate(prefs, pppInterface).takeUnretainedValue();
    var success = SCNetworkServiceEstablishDefaultConfiguration(service);

此代码在第一行返回运行时错误EXEC_BAD_ACCESS(code=1)

我搜索了这个错误,有人说这个问题是由在Objective-C中使用已发布的对象引起的?在Swift中是一样的吗?有没有人在Swift中有任何VPN创建经验?

更新: 我试图调试并发现kSCNetworkInterfaceIPv4的const值无效,请参阅附图: enter image description here

这是Swift的错误吗?

2 个答案:

答案 0 :(得分:0)

我相信kSCNetworkInterfaceIPv4不是问题所在,因为我可以使用Swift来创建L2TP / IPSec和Cisco VPN。

在Swift中处理C指针相当棘手,但这就是我使用Swift 2.3的方法。注意用! C-Reference对象包装/解包。

let initialTopInterface: SCNetworkInterfaceRef!
let initialBottomInterface: SCNetworkInterfaceRef!

// L2TP on top of IPv4
initialBottomInterface = SCNetworkInterfaceCreateWithInterface(kSCNetworkInterfaceIPv4, kSCNetworkInterfaceTypeL2TP)
// PPP on top of L2TP
initialTopInterface = SCNetworkInterfaceCreateWithInterface(initialBottomInterface!, kSCNetworkInterfaceTypePPP)

let service = SCNetworkServiceCreate(usingPreferencesRef, initialTopInterface!)

// Now you assign the attributes
SCNetworkServiceSetName(service, ("Some Name" as CFString))
// myConfiguration is a Hash with your relevant Key/Value pairs
SCNetworkInterfaceSetConfiguration(topInterface!, myConfiguration)

// Here is a good example for why Swift may just crash if you're not careful
let temporaryString:CFString = "IPSec"
SCNetworkInterfaceSetExtendedConfiguration(topInterface!, temporaryString, myL2tpConfiguration)
SCNetworkServiceEstablishDefaultConfiguration(service)

您可以找到有效的实施方案(适用于macOS Sierra)on Github

答案 1 :(得分:0)

只需要复制所有的 SCNetworkInterface

SCNetworkInterfaceCopyAll()

在创建接口之前插入它