.NET MAUI打包Android时触发iOS Code Signing错误求助
我用C# 8.0开发.NET MAUI应用,首次打包被谷歌、苹果双双拒绝。调整配置后已经能生成符合要求的iOS .ipa文件,但现在打包Android App Bundle时失败。
操作步骤:选择实体Android设备为目标,切换到Release模式,右键项目选“Publish...”开始构建,目标平台显示Android,流程提示“Archiving App Bundle”,但构建失败,错误信息如下:
C:\Program Files\dotnet\packs\Microsoft.iOS.Sdk.net8.0_18.0\18.0.8303\tools\msbuild\iOS\Xamarin.Shared.targets(2901,3): error : Code signing must be enabled to create an Xcode archive.
明明是打包Android,为什么会触发iOS的Xcode签名错误?下面是脱敏后的项目文件:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFrameworks>net8.0-ios;net8.0-maccatalyst;net8.0-android34.0</TargetFrameworks> <TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net8.0-windows10.0.19041.0</TargetFrameworks> <OutputType>Exe</OutputType> <RootNamespace>[MY APP NAME]</RootNamespace> <UseMaui>true</UseMaui> <SingleProject>true</SingleProject> <ImplicitUsings>disable</ImplicitUsings> <Nullable>enable</Nullable> <!-- Display name --> <ApplicationTitle>[MY APP NAME]</ApplicationTitle> <!-- App Identifier --> <ApplicationId>[MY APP IDENTIFIER]</ApplicationId> <!-- Versions --> <ApplicationDisplayVersion>1.0</ApplicationDisplayVersion> <ApplicationVersion>1</ApplicationVersion> <SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'">12.0</SupportedOSPlatformVersion> <SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'maccatalyst'">13.1</SupportedOSPlatformVersion> <SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'">27.0</SupportedOSPlatformVersion> <SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">10.0.17763.0</SupportedOSPlatformVersion> <TargetPlatformMinVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">10.0.17763.0</TargetPlatformMinVersion> <SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'tizen'">6.5</SupportedOSPlatformVersion> </PropertyGroup> <PropertyGroup Condition="'$(TargetFramework)'=='net8.0-ios'"> <ProvisioningType>manual</ProvisioningType> <CodesignKey>[MY VALID KEY]</CodesignKey> <CodesignProvision>[MY VALID PROVISION]</CodesignProvision> </PropertyGroup> <!-- iOS --> <PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Debug|net8.0-ios|AnyCPU'"> <CodesignEntitlements>Platforms\iOS\Entitlements.plist</CodesignEntitlements> <ApplicationId>[MY APP IDENTIFIER]</ApplicationId> <CodesignResourceRules></CodesignResourceRules> <MtouchDebug>True</MtouchDebug> <ArchiveOnBuild>True</ArchiveOnBuild> <MtouchInterpreter>all</MtouchInterpreter> <PublishAot>False</PublishAot> <UseInterpreter>True</UseInterpreter> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Release|net8.0-ios|AnyCPU'"> <CodesignEntitlements>Platforms\iOS\Entitlements.plist</CodesignEntitlements> <ApplicationId>[MY APP IDENTIFIER]</ApplicationId> <CodesignResourceRules></CodesignResourceRules> <MtouchDebug>True</MtouchDebug> <ArchiveOnBuild>True</ArchiveOnBuild> <MtouchInterpreter>all</MtouchInterpreter> <PublishAot>False</PublishAot> <UseInterpreter>True</UseInterpreter> </PropertyGroup> <!-- Android --> <PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Release|net8.0-android34.0|AnyCPU'"> <AndroidPackageFormat>aab</AndroidPackageFormat> <Debugger>Xamarin</Debugger> <EnableLLVM>False</EnableLLVM> <AndroidUseAapt2>True</AndroidUseAapt2> <AndroidCreatePackagePerAbi>False</AndroidCreatePackagePerAbi> <ApplicationId>[MY APP IDENTIFIER]</ApplicationId> <_MauiForceXamlCForDebug>True</_MauiForceXamlCForDebug> <UseInterpreter>False</UseInterpreter> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Debug|net8.0-android34.0|AnyCPU'"> <EmbedAssembliesIntoApk>True</EmbedAssembliesIntoApk> <Debugger>Xamarin</Debugger> <EnableLLVM>False</EnableLLVM> <AndroidUseAapt2>True</AndroidUseAapt2> <AndroidCreatePackagePerAbi>False</AndroidCreatePackagePerAbi> <AndroidPackageFormat>aab</AndroidPackageFormat> <ApplicationId>[MY APP IDENTIFIER]</ApplicationId> <_MauiForceXamlCForDebug>True</_MauiForceXamlCForDebug> <UseInterpreter>False</UseInterpreter> </PropertyGroup> <!-- Mac Catalyst --> <PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Debug|net8.0-maccatalyst|AnyCPU'"> <ApplicationId>[MY APP IDENTIFIER]</ApplicationId> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Release|net8.0-maccatalyst|AnyCPU'"> <ApplicationId>[MY APP IDENTIFIER]</ApplicationId> </PropertyGroup> <!-- Windows --> <PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Debug|net8.0-windows10.0.19041.0|AnyCPU'"> <ApplicationId>[MY APP IDENTIFIER]</ApplicationId> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Release|net8.0-windows10.0.19041.0|AnyCPU'"> <ApplicationId>[MY APP IDENTIFIER]</ApplicationId> </PropertyGroup> <ItemGroup> <!-- App Icon --> <MauiIcon Include="Resources\AppIcon\appicon.svg" ForegroundFile="Resources\AppIcon\ourappicon.png" Color="#C7DCF9" /> <!-- Splash Screen --> <MauiSplashScreen Include="Resources\Images\app_our_logo.png" Color="#C7DCF9" BaseSize="200,67" /> <!-- Images --> <MauiImage Include="Resources\Images\*" /> <MauiImage Update="Resources\Images\app_our_logo.png"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </MauiImage> <!-- Custom Fonts --> <MauiFont Include="Resources\Fonts\*" /> <!-- Raw Assets (also remove the "Resources\Raw" prefix) --> <MauiAsset Include="Resources\Raw\**" LogicalName="%(RecursiveDir)%(Filename)%(Extension)" /> </ItemGroup> <ItemGroup> <None Remove="appsettings.json" /> </ItemGroup> <ItemGroup> <EmbeddedResource Include="appsettings.json" /> </ItemGroup> <ItemGroup Condition="$(TargetFramework.Contains('-ios'))"> <CustomEntitlements Include="aps-environment" Type="string" Value="development" Condition="'$(Configuration)' == 'Debug'" /> <CustomEntitlements Include="aps-environment" Type="string" Value="production" Condition="'$(Configuration)' == 'Release'" /> </ItemGroup> <ItemGroup Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios' OR $([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'maccatalyst'"> <BundleResource Include="Platforms\iOS\PrivacyInfo.xcprivacy" LogicalName="PrivacyInfo.xcprivacy" /> </ItemGroup> <ItemGroup> <GoogleServicesJson Include="Platforms\Android\google-services.json" /> </ItemGroup> <ItemGroup> <PackageReference Include="Camera.MAUI" Version="1.5.1" /> <PackageReference Include="Camera.MAUI.ZXing" Version="1.0.0" /> <PackageReference Include="CommunityToolkit.Maui" Version="9.0.3" /> <PackageReference Include="CommunityToolkit.Maui.MediaElement" Version="4.1.1" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="8.0.8" /> <PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="8.0.2" /> <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="8.0.0" /> <PackageReference Include="Microsoft.Maui.Controls" Version="8.0.91" /> <PackageReference Include="Microsoft.Maui.Controls.Compatibility" Version="8.0.91" /> <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="8.0.0" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> <PackageReference Include="Plugin.LocalNotification" Version="11.1.3" /> <PackageReference Include="Shiny.Beacons" Version="3.3.3" /> <PackageReference Include="Shiny.Hosting.Maui" Version="3.3.3" /> <PackageReference Include="Shiny.Push" Version="3.3.3" /> </ItemGroup> <ItemGroup> <!-- ... Here are two C# 8.0 library projects I am using ... --> </ItemGroup> <ItemGroup> <!-- ... All my non-image resources are here ... --> </ItemGroup> <ItemGroup> <MauiXaml Update="Resources\Styles\CommonStyles.xaml"> <Generator>MSBuild:Compile</Generator> </MauiXaml> </ItemGroup> <ItemGroup> <!-- ... All my XAML files are here ... --> </ItemGroup> <ItemGroup Condition="'$(TargetFramework)' == 'net8.0-android34.0'"> <PackageReference Include="Symbol.XamarinEMDK"> <Version>8.0.0.9</Version> </PackageReference> </ItemGroup> </Project>
问题原因
你的项目配置中,iOS的Release和Debug配置里都设置了<ArchiveOnBuild>True</ArchiveOnBuild>,这个属性会强制MSBuild在构建时执行Xcode归档操作。即使你选择的是Android目标,某些MSBuild任务可能会遍历所有目标框架的配置,触发iOS的归档逻辑,导致签名错误。另外,iOS Release配置中开启<MtouchDebug>True</MtouchDebug>也不符合发布版本的规范。
解决步骤
- 打开项目文件,找到iOS的Debug和Release配置段:
- 将
<ArchiveOnBuild>True</ArchiveOnBuild>改为<ArchiveOnBuild>False</ArchiveOnBuild>,或者直接删除该行。 - 将iOS Release配置中的
<MtouchDebug>True</MtouchDebug>改为<MtouchDebug>False</MtouchDebug>。
- 将
修改后的iOS配置段示例:
<!-- iOS --> <PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Debug|net8.0-ios|AnyCPU'"> <CodesignEntitlements>Platforms\iOS\Entitlements.plist</CodesignEntitlements> <ApplicationId>[MY APP IDENTIFIER]</ApplicationId> <CodesignResourceRules></CodesignResourceRules> <MtouchDebug>True</MtouchDebug> <ArchiveOnBuild>False</ArchiveOnBuild> <MtouchInterpreter>all</MtouchInterpreter> <PublishAot>False</PublishAot> <UseInterpreter>True</UseInterpreter> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Release|net8.0-ios|AnyCPU'"> <CodesignEntitlements>Platforms\iOS\Entitlements.plist</CodesignEntitlements> <ApplicationId>[MY APP IDENTIFIER]</ApplicationId> <CodesignResourceRules></CodesignResourceRules> <MtouchDebug>False</MtouchDebug> <ArchiveOnBuild>False</ArchiveOnBuild> <MtouchInterpreter>all</MtouchInterpreter> <PublishAot>False</PublishAot> <UseInterpreter>True</UseInterpreter> </PropertyGroup>
- 保存项目文件,重新尝试打包Android App Bundle。这样MSBuild就不会再触发iOS的归档流程,也就不会出现Xcode签名错误了。
内容的提问来源于stack exchange,提问作者BeRo

