startTunnelWithOptions

startTunnelWithOptions

我正在尝试向我的项目添加PacketTunnerProvider网络扩展。方法startTunnelWithOptions(options:[String:NSObject] ?, completeHandler:(NSError?)-> Void)永远不会被调用

但是,我能够使用providerBundleIdentifier的网络扩展捆绑包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] ?, completeHandler:(NSError?)-> Void)永远不会被调用
但是,我能够使用providerBundleIdentifier的网络扩展捆绑包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并等待它完全初始化。
ios - PacketTunnelProvider网络扩展未称为Swift 3-LMLPHP

09-06 03:09