我正在使用 Xamarin 為 iOS 開發 VPN 應用程式。根據 iOS 檔案,需要有一個最終將 VPN 連接到遠程服務器的應用程式擴展。
問題 1.我可以使用 Visual Studio 代碼在 Mac OS X 上的 Xamarin 中創建支持“資料包隧道”的應用程式擴展嗎?當我嘗試在向導中創建應用擴展時,沒有 VPN 擴展選項。我創建了一個 Action Sheet 擴展并手動修改了Info.plist和Entitlement.plist檔案以支持 VPN a hack。
通過上述更改,我能夠創建應用程式擴展并能夠在真實設備上進行部署。現在主要的 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都具有正確的權利。
有一件事想分享 Visual Studio for Mac 2019 在使用圖形編輯器時添加了不正確的權利。它為關鍵的com.apple.developer.networking.networkextension增加了作為packet-tunnel而不是packet-tunnel-provider 的價值。
uj5u.com熱心網友回復:
兩個問題。
我仍然不同意關鍵com.apple.developer.networking.networkextension的值是packet-tunnel。您無法部署到具有該值的真實設備。即使您從 Apple 開發者網站下載臨時證書,并在文本編輯器中簽名并在文本編輯器中打開它,盡管它是一個二進制檔案,但它清楚地說明了值為packet-tunnel-provider,那么packet-tunnel是如何作業的還是個謎我。我為此損失了 2 周。
正如我提到的,我將“操作表”擴展名更改為“網路擴展”,在轉換程序中,我錯過了在我注冊為支持擴展代碼的類的PacketTunnelProvider類上添加[Register]注釋。可能 NSDictionary nil 錯誤與它有關,不確定。
現在呼叫擴展類,呼叫建構式和 StartTunnel 方法,我可以看到控制臺應用程式中的日志仍然不在“應用程式輸出”中,可能它只會顯示主應用程式的日志。
uj5u.com熱心網友回復:
問題 1
我們可以以圖形方式啟用該Network Extensions選項Entitlements.plist,并將字串檢查為源方式,它應該packet-tunnel不是其他任何東西。


問題2
我用你的代碼測驗,它作業正常,我無法重現錯誤,你的代碼似乎沒有問題。
其他
在真實設備上測驗時,我們也應該使用啟用的證書和組態檔Network Extensions,我們需要在Apple Developer上這樣做,下載檔案并在專案中設定它們。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/313162.html
標籤:ios 沙马林 xamarin.ios 虚拟专用网
上一篇:為什么在我的XamarinAndroidnetwork_security_config.xml檔案的debug-overrides標記中包含cleartextTrafficPermitted標記時未檢
