使用命令行發佈 iOS 應用程式

若要從 Mac 上的命令列發佈您的應用程式,請開啟終端機並流覽至 .NET 多平臺應用程式 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如果未在命令行或項目檔中指定 參數,建置程式會預設為模擬器運行時間識別符。 此外,如果項目檔中有多個目標架構,在命令行上傳遞運行時間標識碼可能會導致組建無法還原。 如需詳細資訊,請參閱 在項目檔中存在多個架構時,將 -f 和 -r 指定為 dotnet build 無法還原。

這些問題的其中一個解決方案是將下列專案 <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>指定它們。 下表列出一些常見的組建屬性:

屬性
<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 應用程式需要存取 Apple 的建置工具,而 Apple 只會在 Mac 上執行。 因此,Visual Studio 2022 必須連線到可網路存取的 Mac,才能建置 .NET MAUI iOS 應用程式。 如需詳細資訊,請參閱 與Mac配對以進行iOS開發

注意

第一次從 Visual Studio 2022 配對 Mac 登入 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/

重要

這些參數的值也可以在項目檔中提供,做為建置屬性。 不過,基於安全性考慮,通常會在命令行上提供、 <ServerUser><ServerPassword><_DotNetRootRemoteDirectory> 的值<ServerAddress>

例如,使用下列命令從 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.

針對遠端組建進行疑難解答

RuntimeIdentifier如果在從 Windows 上的命令行遠端建置時未指定 ,則會使用 Windows 電腦的架構。 RuntimeIdentifier這是因為 必須在建置程式初期設定 ,組建才能連線到Mac以衍生其架構。

RuntimeIdentifier如果在 Windows 上使用 Visual Studio 從遠端建置時未指定 ,IDE 會偵測遠端 Mac 的架構並據以設定。 藉由設定 $(ForceSimulatorX64ArchitectureInIDE) build 屬性,即可覆寫預設值:

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

散發應用程式

.ipa 檔案可以使用下列其中一種方法來散發: