我正在尝试将 PacketTunnerProvider 网络扩展添加到我的项目中。方法 startTunnelWithOptions(options: [String : NSObject]?,completionHandler: (NSError?) -> Void) 永远不会被调用
但是,我能够使用提供商 BundleIdentifier 的网络扩展包 ID 成功建立 VPN 连接
这是我用来建立连接的代码
let vpnManager = NETunnelProviderManager.shared()
func initVPNTunnelProviderManager() {
let config = NETunnelProviderProtocol()
config.providerBundleIdentifier = self.tunnelBundleId
config.providerConfiguration = ["lol": 1]
config.serverAddress = self.serverAddress
config.username = self.username
config.passwordReference = passwordRef
vpnManager.loadFromPreferences {
(error: Error?) in
self.vpnManager.protocolConfiguration = vpnProtocol
self.vpnManager.localizedDescription = "Connect_1.0.0"
self.vpnManager.isEnabled = true
self.vpnManager.saveToPreferences {
(error: Error?) in
do {
try self.vpnManager.connection.startVPNTunnel()
} catch let error as NSError {
print("Error: \(error.localizedDescription)")
}
}
}
}
这是我的 PacketTunnel 权利文件
`<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.developer.networking.vpn.api</key>
<array>
<string>allow-vpn</string>
</array>
<key>com.apple.security.application-groups</key>
<array>
<string>group.touchcore.Connectionapp</string>
</array>
<key>keychain-access-groups</key>
<array>
<string>$(AppIdentifierPrefix)touchcore.Connectionapp.PacketTunnel</string>
</array>
<key>com.apple.developer.networking.networkextension</key>
<array>
<string>packet-tunnel-provider</string>
<string>app-proxy-provider</string>
<string>content-filter-provider</string>
</array>
</dict>
</plist>`
方法 startTunnelWithOptions(options: [String : NSObject]?,completionHandler: (NSError?) -> Void) 永远不会被调用
但是,我能够使用提供商 BundleIdentifier 的网络扩展包 ID 成功建立 VPN 连接
你到底是什么意思它永远不会被调用?如果您能够成功建立连接startTunnelWithOptions
正在被呼叫。
如果您试图确定它是通过使用NSLog()
,请记住,只有当您将调试器附加到提供程序而不是容器应用程序时,这才会显示在调试日志中。
这将很困难,因为提供者已经初始化并且startTunnelWithOptions
在您有机会附加调试器之前调用函数。
在这种情况下,一个有用的解决方法是休眠,以便为调试器提供附加时间。
- (void) startTunnelWithOptions:(NSDictionary *) options
completionHandler:(void (^)(NSError *)) completionHandler
{
// Give debugger time to attach, 10 seconds is usually enough
// Comment this out before you release the app or else you
// will be stuck with a 10 second delay on all connections.
sleep(10);
// Continue with execution
. . .
}
然后,当您初始化 PacketTunnelProvider 时,它将等待 10 秒,然后再完全进入您的逻辑内部startTunnelWithOptions
功能。
所以,这段时间在XCode中你可以去Debug->Attach To Process->YourVPNProviderProcess
并等待它完全初始化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)