共用方式為


Xamarin.Mac 疑難解答秘訣

概觀

有時候,我們都在處理專案時停滯不前,要麼無法讓 API 以我們想要的方式運作,要麼嘗試解決 Bug。 Xamarin 的目標是讓您能夠成功撰寫行動和傳統型應用程式,並提供一些資源來協助。

透過上述任何資源,您可以採取一些準備步驟來協助他們快速解決問題:

  • 盡可能判斷問題的根本原因,以報告當機:

    • 「我的應用程式當機」很難診斷。 「當我將空陣列傳回此呼叫時,我的應用程式當機」更容易處理修正。

    • 「我無法讓 NSTable 運作」不如「我的 NSTableDelegate 上沒有任何方法在此案例中呼叫」的説明。

  • 如果可能的話,請提供顯示問題的小型範例程式。 鑽研尋找問題的原始程式碼頁面需要更多時間和精力。

  • 瞭解您對應用程式所做的變更,導致問題出現,可能會快速縮小問題的來源範圍。 指出您是否最近升級了 Xamarin.Mac 版本,並修剪應用程式的區段來尋找造成問題的元件,或測試先前的組建,以找出問題導入的變更可能會很有説明。

當應用程式在沒有輸出的情況下當機時該怎麼辦

在大部分情況下,Visual Studio for Mac 中的調試程式會攔截應用程式中的例外狀況和當機,並協助您追蹤根本原因。 不過,在某些情況下,您的應用程式會在擴充座上彈跳,然後以很少或沒有輸出結束。 這些可以包括:

  • 程式代碼簽署問題。
  • 某些 Mono 運行時間當機。
  • 某些 Objective-c 例外狀況和當機。
  • 有些程式存留期非常早就損毀。
  • 某些堆疊溢位。
  • Info.plist 中列出的 macOS 版本比您目前安裝的 macOS 版本還新,或無效。

偵錯這些程式可能會令人沮喪,因為尋找所需的資訊可能很困難。 以下是一些可能有説明的方法:

  • 確定 Info.plist 中列出的 macOS 版本與電腦上目前安裝的 macOS 版本相同。

  • 檢查 Visual Studio for Mac 應用程式輸出 (View ->Pads ->Application Output) 中的堆疊追蹤或來自 Cocoa 的紅色輸出,以描述輸出。

  • 從命令列執行您的應用程式,並使用下列方式查看輸出(在 終端 機應用程式中:

    MyApp.app/Contents/MacOS/MyApp (其中 MyApp 是您的應用程式名稱)

  • 您可以將 「MONO_LOG_LEVEL」 新增至命令列上的命令,以增加輸出,例如:

    MONO_LOG_LEVEL=debug MyApp.app/Contents/MacOS/MyApp

  • 您可以將原生調試程式 (lldb) 附加至您的進程,以查看這是否提供更多資訊(這需要付費授權)。 例如,執行下列動作:

    1. 在終端機中輸入 lldb MyApp.app/Contents/MacOS/MyApp
    2. 在終端機中輸入 run
    3. 在終端機中輸入 c
    4. 完成偵錯時結束。
  • 作為最後手段,在方法中Main呼叫NSApplication.Init之前(或視需要在其他位置呼叫),您可以將文字寫入已知位置的檔案,以追蹤您遇到問題的啟動步驟。

已知問題

下列各節涵蓋已知問題及其解決方案。

無法在沙箱化應用程式中聯機到調試程式

調試程式會透過 TCP 連線到 Xamarin.Mac 應用程式,這表示當您啟用沙箱化時,它無法連線到應用程式,因此如果您嘗試執行未啟用適當許可權的應用程式,您會收到「無法連線到調試程式」錯誤

Editing the entitlements in the App sandbox.

允許傳出網路 連線(用戶端)許可權是調試程式所需的許可權,啟用此許可權可正常進行偵錯。 由於您無法在沒有偵錯的情況下進行偵錯,因此我們已更新 CompileEntitlements 的目標 msbuild ,以自動將該許可權新增至任何沙盒化以進行偵錯組建的應用程式的權利。 發行組建應該使用權利檔案中指定的權利,未經修改。

System.NotSupportedException:沒有數據可用於編碼 437

在 Xamarin.Mac 應用程式中包含第三方連結庫時,您可能會在嘗試編譯和執行應用程式時,出現「System.NotSupportedException:沒有數據可用於編碼 437」格式的錯誤。 例如,例如 Ionic.Zip.ZipFile的連結庫可能會在作業期間擲回這個例外狀況。

開啟 Xamarin.Mac 項目的選項,移至 Mac 建>置國際化 並檢查 西部 國際化,即可解決此問題:

Editing the build options

無法編譯 (mm5103)

此錯誤通常是在新版本 Xcode 發行且您已安裝新版本但尚未執行時所造成。 嘗試使用新版本 Xcode 進行編譯之前,您必須先至少執行該版本一次。

第一次執行新版本的 Xcode 時,它會安裝 Xamarin.Mac 所需的數個命令行工具。 此外,您應該在更新 Xcode 或 Xamarin.Mac 版本之後執行全新組建。

如果您無法解決此問題,請 提出錯誤

遺漏 entitlements.plist

最新版的 Visual Studio for Mac 已從 Info.plist 編輯器中移除 [權利] 區段,並將它放在個別的 Entitlements.plist 編輯器中(以 Xamarin.iOS 提供更好的跨平台支援)。

安裝新的 Visual Studio for Mac 時,當您建立新的 Xamarin.Mac 應用程式專案時, Entitlements.plist 檔案會自動新增至專案樹狀結構:

Selecting entitlements

如果您按兩下 Entitlements.plist 檔案,則會顯示權利編輯器:

Editing the entitlements

針對現有的 Xamarin.Mac 專案,您必須以滑鼠右鍵按兩下 Solution Pad 中的專案,然後選取 [新增>檔案...],手動建立 Entitlements.plist檔案。接下來,選取 [Xamarin.Mac>空白屬性清單]:

Adding a new property list

輸入 Entitlements 以取得名稱,然後按兩下 [ 新增 ] 按鈕。 如果您的專案先前包含權利檔案,系統會提示您將它新增至專案,而不是建立新的檔案:

Verifying the overwrite of a file

論壇上的社群支援

使用 Xamarin 產品的開發人員社群非常出色,許多人員會造訪我們的 Xamarin.Mac 論壇 ,分享體驗及其專業知識。 此外,Xamarin 工程師會定期造訪論壇以協助。

提出 Bug

您的意見反應對我們非常寶貴。 如果您發現 Xamarin.Mac 有任何問題:

GitHub 問題全都是公開的。 無法隱藏意見或附件。

請儘量包含下列資訊:

  • 一個可重現問題的簡單範例。 這是非常寶貴的,請盡您所能提供。
  • 損毀狀況的完整堆疊追蹤。
  • 損毀狀況周圍的 C# 程式碼。