【问题标题】:Xamarin iOS VPN app extension not starting packet tunnel provider classXamarin iOS VPN 应用程序扩展未启动数据包隧道提供程序类
【发布时间】:2021-11-25 01:52:14
【问题描述】:

我正在使用 Xamarin 为 iOS 开发一个 VPN 应用程序。根据 iOS 文档,需要有一个应用扩展,最终将 VPN 连接到远程服务器。

问题 1. 我能否使用 Visual Studio 代码在 Mac OS X 上的 Xamarin 中创建支持“数据包隧道”的应用扩展。当我尝试在向导中创建应用程序扩展时,没有 VPN 扩展选项。我创建了一个 Action Sheet 扩展并手动修改了 Info.plistEntitlement.plist 文件以支持 VPN ahack

通过上述更改,我能够创建应用扩展并能够在真实设备上进行部署。现在主要的 iOS 应用程序能够保存 VPN 配置文件,我可以在设置中看到它。我当前的应用扩展隧道提供程序类是空的我只有简单的日志行。

问题 2。 我原以为我会得到一些日志,但由于没有代码,它最终会失败,但我的课程从未被调用。没有堆栈跟踪。我可以从连接到真实设备的控制台中提取的唯一内容如下。

Unhandled Exception:
Foundation.MonoTouchException: Objective-C exception thrown. Name: NSInvalidArgumentException Reason: *** -[__NSDictionaryM setObject:forKey:]: object cannot be nil (key: 7E3DD3B9-285A-4EB1-9DCA-6EC5B89214DA)
Native stack trace:
    0  CoreFoundation           0x00000001b130a9a4 <redacted> + 252
    1  libobjc.A.dylib           0x00000001b04e39f8 objc_exception_throw + 56
    2  CoreFoundation           0x00000001b12843f8 _CFArgv + 0
    3  CoreFoundation           0x00000001b11f9228 <redacted> + 940
    4  Foundation             0x00000001b1d288b4 <redacted> + 100
    5  Foundation             0x00000001b1d28124 <redacted> + 764
    6  libdispatch.dylib          0x00000001b0d48a38 <redacted> + 24
    7  libdispatch.dylib          0x00000001b0d497d4 <redacted> + 16
    8  libdispatch.dylib          0x00000001b0cf2324 <redacted> + 592
    9  libdispatch.dylib          0x00000001b0cf2e40 <redacte<…>

我开始隧道如下。下面的代码在 NETunnelProviderManager.LoadAllFromPreferences 完成处理程序中。

var activationAttemptId = new NSUuid().AsString() + "-SECRET-VPN";
Console.WriteLine("Activation UUID " + activationAttemptId);
var options = new NSDictionary<NSString, NSObject>((NSString)NSObject.FromObject("activationAttemptId"), NSObject.FromObject(activationAttemptId));
var sessionConnection = tunnelProviderManager.Connection as NETunnelProviderSession;

NSError terror;

sessionConnection.StartTunnel(options, out terror);

if (terror != null && terror.Code != null)
{
       Console.Error.WriteLine("While starting VPN error ...." + terror.Code);
}

我的配置保存代码如下。

var tunnelProviderManager = new NETunnelProviderManager();
tunnelProviderManager.LocalizedDescription = "Second Xam VPN";
                    

var protocolConfiguration = new NETunnelProviderProtocol();
protocolConfiguration.ProviderBundleIdentifier = "xxx.xxx";
protocolConfiguration.ServerAddress = "XXX:XXX";
protocolConfiguration.ProviderConfiguration = new NSDictionary<NSString, NSObject>();

tunnelProviderManager.ProtocolConfiguration = protocolConfiguration;

tunnelProviderManager.Enabled = true;

tunnelProviderManager.SaveToPreferences((NSError error) => {// ...logic here .....});

如果能提供一些指导如何解决该问题,我将非常感激,这可能是一些调试帮助,我在 Xamarin 和整体移动开发方面具有中级技能。

应用和应用扩展 Info.plistEntitlement.plist 都具有正确的权利。

One thing like to share Visual Studio for Mac 2019 在使用图形编辑器时添加了不正确的权利。它作为 packet-tunnel 而不是 packet-tunnel-provider 为关键 com.apple.developer.networking.networkextension 增加了价值。

【问题讨论】:

  • 为了好玩,您是否尝试在代码周围添加 try/catch?
  • @Cheesebaron 是的,设备部分的 Visual Studio 输出中没有异常,但是如果我通过控制台连接,我会看到一些活动,如帖子中所示。

标签: ios xamarin xamarin.ios vpn


【解决方案1】:

两个问题。

  1. 我仍然不同意密钥 com.apple.developer.networking.networkextension 的值是 packet-tunnel。您无法部署到具有该值的真实设备。即使您从您正在签名的Apple开发者网站下载临时证书并在文本编辑器中打开它,虽然它是一个二进制文件,但它清楚地将值声明为packet-tunnel-provider,那么为什么packet-tunnel 工作对我来说是个谜。 我为此损失了 2 周时间。

  2. 正如我提到的,我将“操作表”扩展名更改为“网络扩展名”,在转换过程中,我错过了在我的 PacketTunnelProvider 类上添加 [Register] 注释注册为支持扩展代码的类。可能 NSDictionary nil 错误与它有关,不确定。

现在调用了扩展类,调用了构造函数和 StartTunnel 方法,我可以看到控制台应用程序中的日志仍然不在“应用程序输出”中,可能它只会显示主应用程序的日志。

【讨论】:

    【解决方案2】:

    问题 1

    我们可以以图形方式启用Entitlements.plist中的Network Extensions选项,并检查字符串是否为源方式,它应该是packet-tunnel而不是其他任何东西。


    问题 2

    我用你的代码测试,它工作正常,我无法重现错误,你的代码似乎没有问题。


    其他

    在真机上测试时,我们应该使用启用Network Extensions的证书和配置文件,我们需要在Apple Developer上这样做,下载文件并在项目中设置它们。

    【讨论】:

    • 如果我使用数据包隧道,它无法在设备上部署。我检查了我的配置文件,应用程序 id 是通配符 *,它具有网络扩展和数据保护功能。我尝试部署的设备已映射和我的开发人员证书。
    猜你喜欢
    • 2017-08-31
    • 2019-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多