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-&gt;Attach To Process-&gt;Your***ProviderProcess 并等待它完全初始化。

【讨论】:

嘿,内森,我有一个网络扩展,但它可以从我的主应用程序调用。请给我一些建议或解释为什么它不能调用。谢谢。 根据这里的答案,您说执行需要 10 秒,但在我的情况下,它从未被调用。

以上是关于PacketTunnelProvider 网络扩展不称为 Swift 3的主要内容,如果未能解决你的问题,请参考以下文章

iOS 9 SimpleTunnel 示例 - 启动新隧道

macOS 上的多个网络扩展

疲劳裂纹扩展的卷积神经网络辨识

Metamask扩展添加BSC主网络,添加自定义网络

在 iOS NEDNSProxyProvider 网络扩展上安装 Firebase / Crashlytics

如何从网络扩展中停用按需连接 ***?