PacketTunnelProvider 网络扩展不称为 Swift 3
Posted
技术标签:
【中文标题】PacketTunnelProvider 网络扩展不称为 Swift 3【英文标题】:PacketTunnelProvider network extension not called Swift 3 【发布时间】:2017-07-30 19:16:51 【问题描述】:我正在尝试将 PacketTunnerProvider 网络扩展添加到我的项目中。方法 startTunnelWithOptions(options: [String : NSObject]?, completionHandler: (NSError?) -> Void) 永远不会被调用
但是,我能够使用 providerBundleIdentifier 的网络扩展包 ID 成功建立 *** 连接
这是我用来建立连接的代码
let ***Manager = NETunnelProviderManager.shared()
func init***TunnelProviderManager()
let config = NETunnelProviderProtocol()
config.providerBundleIdentifier = self.tunnelBundleId
config.providerConfiguration = ["lol": 1]
config.serverAddress = self.serverAddress
config.username = self.username
config.passwordReference = passwordRef
***Manager.loadFromPreferences
(error: Error?) in
self.***Manager.protocolConfiguration = ***Protocol
self.***Manager.localizedDescription = "Connect_1.0.0"
self.***Manager.isEnabled = true
self.***Manager.saveToPreferences
(error: Error?) in
do
try self.***Manager.connection.start***Tunnel()
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.***.api</key>
<array>
<string>allow-***</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>`
【问题讨论】:
【参考方案1】:方法 startTunnelWithOptions(options: [String : NSObject]?, completionHandler: (NSError?) -> Void) 永远不会被调用
但是,我能够使用 providerBundleIdentifier 的网络扩展包 ID 成功建立 *** 连接
你的意思是它永远不会被调用?如果您能够成功建立连接,则将调用 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->Your***ProviderProcess
并等待它完全初始化。
【讨论】:
嘿,内森,我有一个网络扩展,但它可以从我的主应用程序调用。请给我一些建议或解释为什么它不能调用。谢谢。 根据这里的答案,您说执行需要 10 秒,但在我的情况下,它从未被调用。以上是关于PacketTunnelProvider 网络扩展不称为 Swift 3的主要内容,如果未能解决你的问题,请参考以下文章