【发布时间】:2021-11-25 01:52:14
【问题描述】:
我正在使用 Xamarin 为 iOS 开发一个 VPN 应用程序。根据 iOS 文档,需要有一个应用扩展,最终将 VPN 连接到远程服务器。
问题 1. 我能否使用 Visual Studio 代码在 Mac OS X 上的 Xamarin 中创建支持“数据包隧道”的应用扩展。当我尝试在向导中创建应用程序扩展时,没有 VPN 扩展选项。我创建了一个 Action Sheet 扩展并手动修改了 Info.plist 和 Entitlement.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.plist 和 Entitlement.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