Xamarin iOS仅在AppStore发布版中出现方法未找到问题
核心原因分析
调试模式下链接器和AOT编译默认关闭,所有方法都能正常加载;但TestFlight发布构建会启用链接器裁剪未被直接引用的代码,加上Xamarin.Forms 5(基于.NET Standard 2.1)与.NET 8版本的Microsoft.AspNetCore.SignalR.Client、System.Formats.ASN1存在兼容性差异,导致必要方法被误裁剪。
具体解决步骤
添加链接器保留规则
在iOS项目中创建Linker.xml文件,写入以下配置强制保留缺失的类型和方法:<linker> <!-- 保留SignalR相关类型 --> <assembly fullname="Microsoft.AspNetCore.Http.Connections"> <type fullname="Microsoft.AspNetCore.Http.Connections.NegotiationResponse" preserve="all" /> </assembly> <!-- 保留ASN1相关所有类型 --> <assembly fullname="System.Formats.ASN1"> <type fullname="*" preserve="all" /> </assembly> </linker>然后在iOS项目的
.csproj中引入该文件:<ItemGroup> <LinkDescription Include="Linker.xml" /> </ItemGroup>调整链接器行为
发布构建时选择仅链接SDK程序集(而非“链接所有程序集”),减少第三方依赖库被误裁剪的概率。降级SignalR Client版本
Xamarin.Forms 5对.NET 8类库的支持有限,尝试将Microsoft.AspNetCore.SignalR.Client降级到6.0.x系列(.NET 6 LTS版本),此版本与.NET Standard 2.1兼容性更好。排查AOT编译影响
临时关闭iOS项目的AOT编译验证:在.csproj中添加<EnableAOT>false</EnableAOT>,发布到TestFlight测试。若问题消失,说明是AOT裁剪导致,需针对相关程序集添加AOT保留规则:<ItemGroup> <AotAssemblies Include="Microsoft.AspNetCore.Http.Connections.dll" /> <AotAssemblies Include="System.Formats.ASN1.dll" /> </ItemGroup>统一NuGet依赖版本
确保共享库和iOS项目引用的Microsoft.AspNetCore.SignalR.Client、System.Formats.ASN1版本完全一致,避免版本冲突引发的依赖缺失。
内容的提问来源于stack exchange,提问作者Bartek Chyży

