使用命令行发布 iOS 应用

要在 Mac 上从命令行发布应用,请打开终端并导航到 .NET Multi-platform App UI (.NET MAUI) 应用项目的文件夹。 提供以下参数,运行 dotnet publish 命令:

参数
-f--framework 目标框架,即 net8.0-ios
-c--configuration 生成配置,即 Release

警告

尝试发布 .NET MAUI 解决方案将导致 dotnet publish 命令尝试分别发布解决方案中的每个项目,如果已将其他项目类型添加到解决方案中,则可能会出现问题。 因此,dotnet publish 命令的作用域应为 .NET MAUI 应用项目。

如果项目文件的 <PropertyGroup> 中未提供其他生成参数,则可以在命令行上指定这些参数。 下表列出了一些常用参数:

参数
-p:ApplicationTitle 应用的用户可见名称。
-p:ApplicationId 应用的唯一标识符,如 com.companyname.mymauiapp
-p:ApplicationVersion 标识应用迭代的生成版本。
-p:ApplicationDisplayVersion 应用的版本号。
-p:RuntimeIdentifier 项目的运行时标识符 (RID)。 使用 ios-arm64
-p:ArchiveOnBuild 指示是否生成应用存档的布尔值。 使用 true 生成 .ipa
-p:CodesignKey 代码签名密钥的名称。
-p:CodesignProvision 签名应用程序包时要使用的预配配置文件。
-p:CodesignEntitlements 指定应用所需授权的授权文件的路径。

有关生成属性的完整列表,请参见项目文件属性

重要

这些参数的值不必在命令行上提供。 它们也可以在项目文件中提供。 如果在命令行和项目文件中提供了参数,则命令行参数优先。 有关在项目文件中提供生成属性的更多信息,请参见在项目文件中定义生成属性

例如,使用以下命令在 Mac 上生成并签署 .ipa

dotnet publish -f net8.0-ios -c Release -p:ArchiveOnBuild=true -p:RuntimeIdentifier=ios-arm64 -p:CodesignKey="Apple Distribution: John Smith (AY2GDE9QM7)" -p:CodesignProvision="MyMauiApp"

注意

在 .NET 8 中,dotnet publish 命令默认为 Release 配置。 因此,生成配置可以从命令行中省略。 此外,dotnet publish 命令也默认为 ios-arm64RuntimeIdentifier。 因此,也可以在命令行中省略 RuntimeIdentifier

发布版本并签署应用,然后将 .ipa 复制到 bin/Release/net8.0-ios/ios-arm64/publish/ 文件夹。 应用的分发通道在包含在预配配置文件中的分发证书中指定。 有关为不同分发渠道创建预配配置文件的信息,请参阅发布用于 App Store 分发的 iOS 应用发布用于临时分发的 iOS 应用,以及发布用于内部发布的 iOS 应用

有关 dotnet publish 命令的更多信息,请参阅 dotnet publish

运行时标识符

如果未在命令行或项目文件中指定 RuntimeIdentifier 参数,则生成过程将默认使用模拟器运行时标识符。 此外,如果在项目文件中有多个目标框架,则传递命令行上的运行时标识符可能会导致生成无法还原。 有关更多信息,请参阅如果项目文件中存在多个框架,向 dotnet build 指定 -f 和 -r 会导致无法还原

这些问题的一个解决方法是将以下 <PropertyGroup> 添加到项目文件:

<PropertyGroup Condition="'$(IsPublishing)'  == 'true' And '$(TargetFramework)' == 'net7.0-ios'">
    <RuntimeIdentifier>ios-arm64</RuntimeIdentifier>
</PropertyGroup>

然后,运行以下命令来发布应用:

dotnet publish -f net7.0-ios -p:IsPublishing=true ...

这些问题的替代解决方案是将以下 <PropertyGroup> 添加到项目文件:

<PropertyGroup Condition="'$(Configuration)' == 'Release' And '$(TargetFramework)' == 'net7.0-ios'">
    <RuntimeIdentifier>ios-arm64</RuntimeIdentifier>
</PropertyGroup>

然后,运行以下命令来发布应用:

dotnet publish -f net7.0-ios -c Release ...

在项目文件中定义生成属性

在命令行上指定生成参数的替代方法是在 <PropertyGroup> 中的项目文件中指定它们。 下表列出了一些常见的生成属性:

属性 Value
<ApplicationTitle> 应用的用户可见名称。
<ApplicationId> 应用的唯一标识符,如 com.companyname.mymauiapp
<ApplicationVersion> 标识应用迭代的生成版本。
<ApplicationDisplayVersion> 应用的版本号。
<RuntimeIdentifier> 项目的运行时标识符 (RID)。 使用 ios-arm64
<ArchiveOnBuild> 指示是否生成应用存档的布尔值。 使用 true 生成 .ipa
<CodesignKey> 代码签名密钥的名称。
<CodesignProvision> 签名应用程序包时要使用的预配配置文件。
<CodesignEntitlements> 指定应用所需授权的授权文件的路径。

有关生成属性的完整列表,请参见项目文件属性

重要

这些生成属性的值不必在项目文件中提供。 发布应用时,还可以在命令行上提供它们。 这使你能够省略项目文件中的特定值。

以下示例演示了一个典型的属性组,用于使用其预配配置文件生成和签名 iOS 应用:

<PropertyGroup Condition="$(TargetFramework.Contains('-ios')) and '$(Configuration)' == 'Release'">
  <RuntimeIdentifier>ios-arm64</RuntimeIdentifier> <!-- Required in .NET 7 but not in .NET 8 -->
  <CodesignKey>Apple Distribution: John Smith (AY2GDE9QM7)</CodesignKey>
  <CodesignProvision>MyMauiApp</CodesignProvision>
  <ArchiveOnBuild>true</ArchiveOnBuild>
</PropertyGroup>

本示例 <PropertyGroup> 添加条件检查,除非条件检查通过,否则无法处理设置。 条件检查查找两个项:

  1. 目标框架设置为包含文本 -ios 的内容。
  2. 生成配置设置为 Release

如果上述任一条件失败,则不会处理设置。 更重要的是,未设置 <CodesignKey><CodesignProvision> 设置,从而无法对应用进行签名。

从 Windows 发布 iOS 应用

使用 .NET MAUI 生成本机 iOS 应用需要仅在 Mac 上运行的 Apple 生成工具的访问权限。 因此,Visual Studio 2022 必须连接到可通过网络访问的 Mac 才能生成 .NET MAUI iOS 应用。 有关详细信息,请参阅与 Mac 配对以进行 iOS 开发

注意

“与 Mac 配对”首次从 Visual Studio 2022 登录到 Mac 生成主机时,会设置 SSH 密钥。 借助这些密钥,之后登录时无需使用用户名或密码。

要从 Windows 上的命令行发布应用,请打开终端并导航到 .NET MAUI 应用项目的文件夹。 运行 dotnet publish 命令,在项目文件中提供与从 Mac 发布时提供的相同命令行参数或生成属性。 此外,还必须提供以下命令行参数:

参数
-p:ServerAddress Mac 生成主机的 IP 地址。
-p:ServerUser 登录到 Mac 生成主机时要使用的用户名。 使用系统用户名而不是全名。
-p:ServerPassword 用于登录 Mac 生成主机的用户名的密码。
-p:TcpPort 用于与 Mac 生成主机通信的 TCP 端口,即 58181。
-p:_DotNetRootRemoteDirectory Mac 生成主机上包含 .NET SDK 的文件夹。 使用 /Users/{macOS username}/Library/Caches/Xamarin/XMA/SDKs/dotnet/

重要

这些参数的值也可以在项目文件中作为生成属性提供。 但是,出于安全原因,通常会在命令行上提供 <ServerAddress><ServerUser><ServerPassword><_DotNetRootRemoteDirectory> 的值。

例如,使用以下命令从 Windows 生成和签署 .ipa

dotnet publish -f net8.0-ios -c Release -p:ArchiveOnBuild=true -p:RuntimeIdentifier=ios-arm64 -p:CodesignKey="Apple Distribution: John Smith (AY2GDE9QM7)" -p:CodesignProvision="MyMauiApp" -p:ServerAddress={macOS build host IP address} -p:ServerUser={macOS username} -p:ServerPassword={macOS password} -p:TcpPort=58181 -p:_DotNetRootRemoteDirectory=/Users/{macOS username}/Library/Caches/Xamarin/XMA/SDKs/dotnet/

注意

在 .NET 8 中,dotnet publish 命令默认为 Release 配置。 因此,生成配置可以从命令行中省略。 此外,dotnet publish 命令也默认为 ios-arm64RuntimeIdentifier。 因此,也可以在命令行中省略 RuntimeIdentifier

注意

如果在命令行生成调用中省略 ServerPassword 参数,则“与 Mac 配对”将尝试使用其保存的 SSH 密钥登录到 Mac 生成主机。

发布会生成应用并对其进行签名,然后将 .ipa 复制到 Windows 计算机上的 bin\Release\net8.0-ios\ios-arm64\publish 文件夹。 应用的分发通道在包含在预配配置文件中的分发证书中指定。 有关为不同分发渠道创建分发预配配置文件的信息,请参阅发布适用于 App Store 分发的 iOS 应用发布用于临时分发的 iOS 应用发布用于内部分发的 iOS 应用

在发布过程中,可能需要允许 codesign 在配对的 Mac 上运行:

Allow codesign to sign your app on your paired Mac.

远程生成排除故障

如果从 Windows 上的命令行远程生成时未指定 RuntimeIdentifier,则将使用 Windows 计算机的体系结构。 之所以发生这种情况,是因为在生成过程中必须尽早设置 RuntimeIdentifier,然后生成才能连接到 Mac 来派生其体系结构。

如果在 Windows 上使用 Visual Studio 进行远程生成时未指定 RuntimeIdentifier,则 IDE 将检测远程 Mac 的体系结构并进行相应的设置。 可以通过设置 $(ForceSimulatorX64ArchitectureInIDE) 生成属性来重写默认值:

<PropertyGroup Condition="'$(Configuration)' == 'Release' And '$(TargetFramework)' == 'net8.0-ios'">
    <ForceSimulatorX64ArchitectureInIDE>true</ForceSimulatorX64ArchitectureInIDE>
</PropertyGroup>

分发应用

可以使用以下任一方法分发 .ipa 文件: