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

Posted

技术标签:

【中文标题】Xamarin.Mac 应用程序在与最终用户的文件系统交互时挂起【英文标题】:Xamarin.Mac application hang when interacting with filesystem for end-users 【发布时间】:2020-12-01 10:31:01 【问题描述】:

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

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

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

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

据我所知,我已经检查/确认该应用没有被沙盒化,并且正在使用正确的分发证书/配置文件对其进行签名/公证,据我所知,不应该有任何阻止所需文件系统访问的安全限制。除非我遗漏了什么。

有什么方法可以让我更深入地了解导致这种行为的原因,例如我可以使用任何调试工具来了解/查看应用本身的任何潜在问题/它的构建方式?

谢谢!

【问题讨论】:

您是否添加了任何日志记录来跟踪挂起时发生的情况? 控制台是您的朋友。在启动应用程序之前启动控制台应用程序并检查那里的任何相关消息 您好,感谢您的回复!我已经添加了日志记录,但我根本无法让它正常工作。最初,该应用程序会在启动时创建一个日志文件,但是当在最终用户计算机上运行时,它会在启动时崩溃,因为它无法创建/写入文件。该应用程序现在也重定向错误“Console.Error”,但我无法弄清楚这在 OSX 上的位置。我已经检查了控制台,在这里看不到任何明显的东西,我也没有看到应用程序的任何日志输出。有趣的是,当我尝试通过 Instruments 对其进行调试时,它能够完美地启动应用程序并且一切正常。 据我所知,执行此行时会发生“挂起”:string[] directories = Directory.GetDirectories(MainClass.AppFolder);。这个调用永远不会返回,应用程序就在那里。 MainClass.AppFolder 是一个公共静态变量,指向“ProgramName.app”文件当前所在的目录。 只是关于无法创建日志文件等的额外说明,我已经检查了目录权限等以排除这种情况。如前所述,在我将其上传到 Web 服务器并从那里重新下载之前,一切都在本地运行良好。我的猜测是对下载的文件设置了某种安全限制,但如果确实是原因,我无法弄清楚是什么或如何清除它。 【参考方案1】:

终于找到了这个问题的根源:这个问题是因为 Apple 有一个被称为“应用程序迁移”的安全系统。

这里有一个对不熟悉的人的描述:https://lapcatsoftware.com/articles/app-translocation.html - tl;dr 是下载的应用程序被标记为“隔离”,并且在运行时它们被复制到虚拟只读文件系统并从那里执行。这可以防止应用程序对本地文件系统进行任何访问(无论应用程序是否经过签名/公证或从“受信任”来源等下载)。

有两种方法可以“取消隔离”应用程序:

    通过 Finder 手动将应用程序移动到其他位置(例如,将其拖放到“/Applications”或“~/Documents”中(注意:移动应用程序所在的文件夹/被提取的文件夹也是不够的 -您必须物理移动 *.app 文件本身。Apple 将此操作视为用户认为应用程序是安全的,并在移动操作期间删除隔离标志(这必须通过 Finder 完成,不能通过命令行完成mv)等操作。

    从终端运行以下命令以删除隔离标志:

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

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

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

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

com.apple.quarantine

那么这意味着应用程序将受到App Translocation的影响。

【讨论】:

以上是关于Xamarin.Mac 应用程序在与最终用户的文件系统交互时挂起的主要内容,如果未能解决你的问题,请参考以下文章

从 Visual Studio 使用 Xamarin 创建 Mac 应用

从 xamarin.mac / xamarin.forms 的编辑菜单中删除表情符号和符号

使用 ConfigurationManager 将用户值存储在与应用配置不同的文件中

Xamarin.mac 资源本地化不会因当前文化而改变

Xamarin.Mac:关闭的窗口未重新打开以单击 Dock 中的应用程序图标

NSStatusBarButton.Activate 事件不会触发 (Xamarin.Mac - C#)