Xamarin.Mac 应用程序在与最终用户的文件系统交互时挂起

Xamarin.Mac application hang when interacting with filesystem for end-users

我正在开发一个通过内部 Intranet 站点分发的内部公司桌面应用程序。该应用程序是用 C# 编写的,使用 Xamarin.Mac 和 Visual Studio for Mac,在本地运行良好,直到我压缩 *.app 文件并将其上传到内部网站以供最终用户下载。

当用户(包括我自己)下载并启动应用程序时,它会完全锁定以尝试执行与用户本地文件系统交互的任何操作(没有错误或警告 displayed/no 看到崩溃,它只是停止执行更多代码。UI 继续更新但没有其他任何事情发生)。

奇怪的是,如果您右键单击“*.app”文件,select“显示包内容”,然后浏览到 'Content' > 'MacOS' 并双击单击其中包含的应用程序副本,一切正常,没有任何问题。

我不是 OSX 方面的专家,所以我真的很难理解是什么导致了这种行为,以及通过 '* 启动 Xamarin.Forms 应用程序之间的区别是什么.app' 文件和位于 'ProgramName.app/Content/MacOS/ProgramName'.

中的可执行文件

我 checked/confirmed 该应用程序未被沙盒化,并且正在 signed/notarized 使用正确的分发 certificates/provisioning 配置文件,据我所知,据我所知我知道不应该有任何安全限制来阻止所需的文件系统访问。除非我遗漏了什么。

有什么方法可以让我更深入地了解导致此行为的原因,例如我可以使用的任何调试工具 understand/view 应用 itself/the 构建方式的任何潜在问题?

谢谢!

终于弄清了这个问题的真相:这个问题是因为 Apple 的安全系统 in-place 被称为 'App Translocation'。

对于不熟悉的人,这里有一个描述:https://lapcatsoftware.com/articles/app-translocation.html - tl;dr 是下载的应用程序被标记为 'Quarantined' 并且当 运行 他们'重新复制到虚拟 read-only 文件系统并从那里执行。这会阻止应用程序访问本地文件系统(无论应用程序是 signed/notarized 还是从 'trusted' 源等下载的)。

有两种方法可以'unquarantine'申请:

  1. 通过 Finder 手动将应用程序移动到其他位置(例如 Drag/drop 将其移动到“/Applications”或“~/Documents”(注意:移动应用程序所在的文件夹 in/was 提取出来还不够——你必须物理移动 *.app 文件本身)。Apple 将此操作视为用户认为应用程序是安全的,并在移动过程中删除 qua运行tine 标志操作(这必须通过Finder来完成,不能通过mv等命令行操作)。

  2. 运行 从终端执行以下命令删除 qua运行tine 标志:

xattr -dr com.apple.quarantine '/path/to/downloaded/program.app'

您可以通过多种方式检测您的应用程序是否受到 App T运行位置的影响,例如:

  1. 使用 'Console' 你可以看到你的可执行文件的路径类似于 '/private/var/.../AppT运行slocation/.... '(这是我之前调试时在控制台中发现的东西,但我对 OSX 的了解还不够,无法准确理解我所看到的内容,最初尝试理解这一点并没有产生任何有用的信息)

  2. 运行 命令 xattr /path/to/downloaded/program.app。如果在 then 输出中看到以下内容:

com.apple.quarantine

则表示应用会受到App T运行位置的影响。