Xamarin.Forms应用程序通过Testlfight安装时在iOS上崩溃



各位开发者好!我正在开发一个适用于android和iOS的Xamarin.Forms应用程序。它在安卓模拟器、安卓设备、iOS模拟器的调试和发布模式下运行良好。

但iOS设备存在问题。将调试/发布构建直接部署到设备是可行的。但当我将应用程序上传到AppStore并通过Testflight在我的设备上安装时,它在启动时崩溃。从控制台我可以看到以下错误:

  1. "System.MissingMethodException:找不到类型App.Views.Login的默认构造函数">
  2. "找不到类型ColorPicker.iOS.Effects.ColorPickerTouchEffectiOS的默认构造函数">

第一个与我的登录视图有关,它有一个默认的构造函数,在调试和发布版本中运行良好。第二个与金块包装有关。

我的问题是:为什么默认构造函数在Debug和Release中可用,而在我通过Testflight下载应用程序时却不可用?我该怎么解决这个问题?

链接行为被设置为";链接所有";。

这是因为当您使用"链接所有程序集"选项时,您需要手动保留项目中的类,并可能标记出链接器不安全的库代码。

有一份Microsoft文档专门针对这个问题:https://learn.microsoft.com/en-us/xamarin/ios/deploy-test/linker?tabs=macos

您可以在手动准备完整链接时,暂时将链接器行为设置为仅限链接SDK程序集。

  • 保留代码:当您使用链接器时,它有时可以删除您可能使用System.Reflection.MemberInfo.Invoke动态调用的代码,或者使用[Export]属性将方法导出到Objective-C,然后手动调用选择器。在这些情况下,您可以指示链接器通过在类级别或成员级别应用[Xamarin.iOS.Foundation.Preserve]属性来考虑要使用的整个类或要保留的单个成员。应用程序未静态链接的每个成员都将被删除。因此,该属性用于标记未静态引用但应用程序仍需要的成员。

  • 正在跳过程序集可以指定应从链接器进程中排除的程序集,同时允许其他程序集正常链接。如果无法在某些程序集上使用[Preserve](例如第三方代码(,或者将其作为错误的临时解决方法,这将非常有用。

    --linkskip=NameOfAssemblyToSkipWithoutFileExtension // Single assembly 
    --linkskip=NameOfFirstAssembly --linkskip=NameOfSecondAssembly // Multiple Assemblies
    

希望这能有所帮助。确保您浏览了MS文档以了解更多详细信息

最新更新