Публикация приложения 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 Путь к файлу прав, который указывает необходимые для приложения права.

Полный список свойств сборки см. в разделе "Свойства файла Project".

Важно!

Значения этих параметров не должны быть предоставлены в командной строке. Они также могут быть предоставлены в файле проекта. Если параметр указан в командной строке и в файле проекта, параметр командной строки имеет приоритет. Дополнительные сведения о предоставлении свойств сборки в файле проекта см. в разделе "Определение свойств сборки" в файле проекта.

Например, используйте следующую команду, чтобы создать и подписать IPA на Mac:

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/folder. Канал распространения для приложения указан в сертификате распространения, содержаемом в профиле подготовки. Сведения о создании профилей подготовки для разных каналов распространения см. в статье "Публикация приложения iOS для распространения App Store", публикация приложения 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> Путь к файлу прав, который указывает необходимые для приложения права.

Полный список свойств сборки см. в разделе "Свойства файла Project".

Важно!

Значения этих свойств сборки не должны быть предоставлены в файле проекта. Они также могут быть предоставлены в командной строке при публикации приложения. Это позволяет опущению определенных значений из файла проекта.

В следующем примере показана типичная группа свойств для создания и подписывания приложения 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> параметры не заданы, предотвращая подпись приложения.

Публикация приложения iOS из Windows

Для создания собственных приложений iOS с помощью .NET MAUI требуется доступ к средствам сборки Apple, которые работают только на Mac. Из-за этого Visual Studio 2022 должен подключаться к сетевому компьютеру Mac для создания приложений iOS .NET MAUI. Дополнительные сведения см. в разделе "Пара с Mac для разработки iOS".

Примечание.

При первом входе пары в Mac в узел сборки Mac из Visual Studio 2022 он настраивает ключи SSH. Благодаря этим ключам в дальнейшем при входе не потребуется указывать имя пользователя или пароль.

Чтобы опубликовать приложение из командной строки в Windows, откройте терминал и перейдите в папку для проекта приложения .NET MAUI. dotnet publish Выполните команду, указав те же параметры командной строки или свойства сборки в файле проекта, которые вы предоставили при публикации из Mac. Кроме того, необходимо указать следующие параметры командной строки:

Параметр Значение
-p:ServerAddress IP-адрес узла сборки Mac.
-p:ServerUser Имя пользователя, используемое при входе в узел сборки Mac. Используйте системное имя пользователя, а не полное имя.
-p:ServerPassword Пароль для имени пользователя, используемого для входа в узел сборки Mac.
-p:TcpPort TCP-порт, используемый для взаимодействия с узлом сборки Mac, который равен 58181.
-p:_DotNetRootRemoteDirectory Папка на узле сборки Mac, содержащая пакет SDK для .NET. Используйте /Users/{macOS username}/Library/Caches/Xamarin/XMA/SDKs/dotnet/.

Важно!

Значения этих параметров также можно указать в файле проекта в качестве свойств сборки. Однако значения для <ServerAddress>, <ServerUser>и <ServerPassword><_DotNetRootRemoteDirectory> обычно предоставляются в командной строке по соображениям безопасности.

Например, используйте следующую команду, чтобы создать и подписать IPA из Windows:

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 пытается войти в узел сборки Mac с помощью сохраненных ключей SSH.

Публикация создает и подписывает приложение, а затем копирует IPA в bin\Release\net8.0-ios\ios-arm64\publish на компьютере Windows. Канал распространения для приложения указан в сертификате распространения, содержаемом в профиле подготовки. Сведения о создании профилей подготовки рассылки для разных каналов распространения см. в статье "Публикация приложения iOS для распространения App Store", публикация приложения iOS для нерегламентированного распространения и публикация приложения iOS для распространения в собственной среде

В процессе публикации может потребоваться разрешить codesign запуск на парном Компьютере Mac:

Allow codesign to sign your app on your paired Mac.

Устранение неполадок удаленной сборки

RuntimeIdentifier Если параметр не указан при удаленном создании из командной строки в Windows, будет использоваться архитектура компьютера Windows. Это происходит из-за того, что RuntimeIdentifier необходимо установить в начале процесса сборки, прежде чем сборка сможет подключиться к Mac, чтобы получить ее архитектуру.

RuntimeIdentifier Если при удаленном создании visual Studio в Windows не задано, интегрированная среда разработки обнаружит архитектуру удаленного Mac и присвоит ей соответствующее значение. Переопределение по умолчанию можно достичь, задав свойство сборки $(ForceSimulatorX64ArchitectureInIDE) :

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

Распространение приложения

IPA-файл можно распространить одним из следующих подходов:

  • Нерегламентированные приложения можно распространять с помощью Apple Configurator. Дополнительные сведения см . в руководстве пользователя Apple Configurator по support.apple.com. |
  • Приложения App Store можно отправлять в App Store через приложение, например Transporter. Для этого потребуется создать запись для приложения в App Store Подключение и создать пароль для конкретного приложения. Дополнительные сведения см. в статье "Создание записи приложения на developer.apple.com" и вход в приложения с помощью идентификатора Apple ID с помощью паролей для конкретного приложения на support.apple.com.
  • Внутренние приложения можно распространять через безопасный веб-сайт или через мобильные Управление устройствами (MDM). Оба этих подхода требуют, чтобы приложение было подготовлено к распространению, которое включает подготовку манифеста. Дополнительные сведения см. в разделе "Распространение собственных приложений на устройствах Apple" на support.apple.com.