如何在物理 iOS 设备上调试 Xamarin.iOS 应用程序

How to debug a Xamarin.iOS app on a physical iOS device

提前为这个冗长的问题道歉,但我已经浪费了 3 天时间尝试设置一个允许我在物理设备上调试的 Xamarin.iOS 开发环境(而不是 iPhone 模拟器),我不知道接下来要尝试什么。

我相信我的设置是非常标准的 Xamarin 配置:

我首先在 Visual Studio 中创建了一个 Xamarin 解决方案,我最初是在 Android 上开发和调试的。

为了进行 iOS 调试,我随后使用 Xcode 和 Xamarin Studio 设置了 Mac,启用了远程登录,并创建了一个虚拟 Xcode 项目与我的 Xamarin.iOS 应用程序具有相同的包标识符。我还尝试了相当复杂的过程,即为应用程序创建签名身份和配置文件,并在 Mac 上下载/安装它们。这个过程非常不直观(并且 Xcode 中的视觉反馈非常差)以至于我不确定我是否正确地完成了它。但是,我能够 运行 iPhone 上的虚拟 Xcode 项目,所以我认为它一定没问题吧?

在 Windows PC 上,Xamarin > iOS 选项 面板位于 Visual Studio settings 确认 Visual Studio 连接到 Mac 并且附加的 iPhone 也被列为候选目标设备,因此似乎一切都已设置为设备调试。

如果我尝试在 Visual Studio 的 iPhone 模拟器上调试应用程序,它可以正常工作。但是,在物理 iPhone 上调试失败并显示以下无用消息:

Xamarin.Messaging.Exceptions.MonotouchException: error MT1006: Could not install the
application '/Users/Tim/Library/Caches/Xamarin/mtbs/builds/Test.iOS/c4f40041b6c58fc579a727bccfc18614/bin/iPhoneSimulator/Debug/TestiOS.app' 
on the device 'Tim’s iPhone': AMDeviceSecureInstallApplicationBundle returned: 0xe8008001.

作为比较,我还尝试使用 Xamarin Studio 直接在 Mac 上进行调试。同样,iPhone 模拟器工作正常,但甚至无法使用物理设备启动调试会话,因为连接的 iPhone 未被列为 的候选目标设备调试 | iPhone配置。

如果我打开项目选项并导航到 iOS Debug 视图,我可以看到与 Debug[=52] 关联的平台=]配置为iPhone模拟器。将其更改为 iPhone 并保存配置看起来有效,但实际上并未保存更改。我想这就是我的测试设备未列出的原因,但我不清楚我需要做什么才能让 Xamarin Studio 接受我的更改。

所以,在所有这些实验之后,我完全迷失了。为这个设置过程提供一个完整、强大的 A-Z 教程会很有帮助,但如果失败了,我将非常感谢任何我接下来应该尝试的建议。

更新:如果我使用 Ad-Hoc 项目配置(在 Visual Studio 或 Xamarin Studio 中),它会在设备上正确部署和启动应用程序,但是不附加调试器。如果我在 Ad-Hoc 项目配置中明确启用调试,Xamarin Studio 会忽略它,但 Visual Studio 然后附加调试器但不会命中任何断点。这听起来不错吗?它是否提供了任何线索,我需要更改哪些内容才能使真正的 Debug 配置正常工作?

对于面临类似问题的任何人,我最终采用的解决方案需要 'brute force' 方法。

我首先创建一个新的 Xamarin.Forms 解决方案(使用标准 Visual Studio 模板)并删除不需要的平台项目(UWP 和 Windows Phone)。在此初始状态下,我验证了它能够在 Android 和 iOS 设备以及它们各自的 emulators/simulators 上启动调试。一切正常,确认我的 Mac 设置正确,还为我提供了调试所需的确切 iOS 项目配置。

在这一点上,我认为配置问题一定是我之前出现的问题的原因,所以我在我的原始解决方案中准确地复制了工作配置的每个细节。它仍然拒绝在 iOS.

上进行调试

然后我开始怀疑引用的 Nuget 包导致了问题,因此我将原始实现中的所有引用包添加到新的测试解决方案中。我预计这会中断 iOS 上的调试,但它没有。

最后,我小心翼翼地将我原来解决方案的全部内容(XAML & 代码隐藏文件、视图模型、资源等)移植到测试解决方案中,它继续正确调试。

因此,在没有可行的诊断程序的情况下,我通过从头开始重建我的解决方案有效地解决了这个问题。没有更改任何代码,据我所知,也没有更改任何配置设置,但新实现现在可以在所有目标环境中可靠地进行调试。

有可能,如文档中所述:https://developer.xamarin.com/guides/ios/getting_started/installation/device_provisioning/free-provisioning/

(抱歉,我只是认为当前接受的答案更适合故障排除页面,而不是一般情况。)