我按照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值无效,请参阅附图:
这是Swift的错误吗?
答案 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()
在创建接口之前插入它