使用命令行发布 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-arm64
RuntimeIdentifier
。 因此,也可以在命令行中省略 RuntimeIdentifier
。
发布版本并签署应用,然后将 .ipa 复制到 bin/Release/net8.0-ios/ios-arm64/publish/ 文件夹。 应用的分发通道在包含在预配配置文件中的分发证书中指定。 有关为不同分发渠道创建预配配置文件的信息,请参阅发布用于 App Store 分发的 iOS 应用,发布用于临时分发的 iOS 应用,以及发布用于内部发布的 iOS 应用。
有关 dotnet publish
命令的更多信息,请参阅 dotnet publish。
在项目文件中定义生成属性
在命令行上指定生成参数的替代方法是在 <PropertyGroup>
内的项目文件中指定它们。 下表列出了一些常见的生成属性:
属性 | 值 |
---|---|
<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'">
<CodesignKey>Apple Distribution: John Smith (AY2GDE9QM7)</CodesignKey>
<CodesignProvision>MyMauiApp</CodesignProvision>
<ArchiveOnBuild>true</ArchiveOnBuild>
</PropertyGroup>
本示例 <PropertyGroup>
添加条件检查,除非条件检查通过,否则无法处理设置。 条件检查查找两个项:
- 目标框架设置为包含文本
-ios
的内容。 - 生成配置设置为
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-arm64
RuntimeIdentifier
。 因此,也可以在命令行中省略 RuntimeIdentifier
。
注意
如果在命令行生成调用中省略 ServerPassword
参数,则“与 Mac 配对”将尝试使用其保存的 SSH 密钥登录到 Mac 生成主机。
发布会生成应用并对其进行签名,然后将 .ipa 复制到 Windows 计算机上的 bin\Release\net8.0-ios\ios-arm64\publish 文件夹。 应用的分发通道在包含在预配配置文件中的分发证书中指定。 有关为不同分发渠道创建分发预配配置文件的信息,请参阅发布适用于 App Store 分发的 iOS 应用、发布用于临时分发的 iOS 应用和发布用于内部分发的 iOS 应用
在发布过程中,可能需要允许 codesign
在配对的 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 文件:
- 可以使用 Apple Configurator 分发临时应用。 有关详细信息,请参阅 support.apple.com 上的 Apple Configurator 用户指南。 |
- App Store 应用可以通过 Transporter 等应用上传到 App Store。 这将要求你在 App Store Connect 中创建应用的记录,并创建特定于应用的密码。 有关详细信息,请参阅 developer.apple.com 上的创建应用记录,以及 support.apple.com 上的使用特定于应用的密码和 Apple ID 登录应用。
- 内部应用可以通过安全网站或移动设备管理 (MDM).进行分发。 这两种方法都要求应用准备好分发,其中包括准备清单。 有关详细信息,请参阅 support.apple.com 上的将专有内部应用分发到 Apple 设备。