在OS X上如何使用Swift创建VPN连接?

3

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

我试图将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的一个bug吗?

2个回答

0

我相信kSCNetworkInterfaceIPv4不是问题,因为我可以使用它来创建L2TP/IPSec和Cisco VPNs,而且在Swift中也能很好地使用。

在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)

你可以在 Github 上找到一个可用的实现(适用于 macOS Sierra)链接


0

只需复制所有的SCNetworkInterface即可

SCNetworkInterfaceCopyAll()

在创建接口之前将其插入到开头


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接