Publicar um aplicativo iOS usando a linha de comando

Para publicar seu aplicativo a partir da linha de comando em um Mac, abra um terminal e navegue até a pasta do seu projeto de aplicativo .NET Multi-platform App UI (.NET MAUI). Execute o dotnet publish comando, fornecendo os seguintes parâmetros:

Parâmetro Valor
-f ou --framework A estrutura de destino, que é net8.0-ios.
-c ou --configuration A configuração de compilação, que é Release.

Aviso

A tentativa de publicar uma solução .NET MAUI resultará na tentativa do comando de publicar cada projeto na dotnet publish solução individualmente, o que pode causar problemas quando você tiver adicionado outros tipos de projeto à sua solução. Portanto, o comando deve ter o dotnet publish escopo definido para seu projeto de aplicativo .NET MAUI.

Parâmetros de compilação adicionais podem ser especificados na linha de comando, se eles não forem fornecidos em um arquivo de <PropertyGroup> projeto. A tabela a seguir lista alguns dos parâmetros comuns:

Parâmetro Valor
-p:ApplicationTitle O nome visível do usuário para o aplicativo.
-p:ApplicationId O identificador exclusivo do aplicativo, como com.companyname.mymauiapp.
-p:ApplicationVersion A versão da compilação que identifica uma iteração do aplicativo.
-p:ApplicationDisplayVersion O número da versão do aplicativo.
-p:RuntimeIdentifier O identificador de tempo de execução (RID) para o projeto. Use ios-arm64.
-p:ArchiveOnBuild Um valor booleano que indica se o arquivo morto do aplicativo deve ser produzido. Use true para produzir o .ipa.
-p:CodesignKey O nome da chave de assinatura de código.
-p:CodesignProvision O perfil de provisionamento a ser usado ao assinar o pacote de aplicativos.
-p:CodesignEntitlements O caminho para o arquivo de direitos que especifica os direitos exigidos pelo aplicativo.

Para obter uma lista completa de propriedades de compilação, consulte Propriedades do arquivo de projeto.

Importante

Os valores desses parâmetros não precisam ser fornecidos na linha de comando. Eles também podem ser fornecidos no arquivo de projeto. Quando um parâmetro é fornecido na linha de comando e no arquivo de projeto, o parâmetro de linha de comando tem precedência. Para obter mais informações sobre como fornecer propriedades de compilação em seu arquivo de projeto, consulte Definir propriedades de compilação em seu arquivo de projeto.

Por exemplo, use o seguinte comando para criar e assinar um .ipa em um 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"

Observação

No .NET 8, o dotnet publish comando assume como padrão a Release configuração. Portanto, a configuração de compilação pode ser omitida da linha de comando. Além disso, o comando também usa como padrão o dotnet publishios-arm64RuntimeIdentifier. Portanto, o RuntimeIdentifier também pode ser omitido da linha de comando.

A publicação compila e assina o aplicativo e, em seguida, copia o .ipa para a pasta bin/Release/net8.0-ios/ios-arm64/publish/. O canal de distribuição do aplicativo é especificado no certificado de distribuição contido no perfil de provisionamento. Para obter informações sobre como criar perfis de provisionamento para os diferentes canais de distribuição, consulte Publicar um aplicativo iOS para distribuição da App Store, Publicar um aplicativo iOS para distribuição ad-hoc e Publicar um aplicativo iOS para distribuição interna.

Para obter mais informações sobre o dotnet publish comando, consulte dotnet publish.

Identificadores de tempo de execução

Se o parâmetro não for especificado na linha de comando ou no arquivo de projeto, o RuntimeIdentifier processo de compilação assumirá como padrão um identificador de tempo de execução do simulador. Além disso, passar o identificador de tempo de execução na linha de comando pode resultar na falha de restauração da compilação se houver várias estruturas de destino no arquivo de projeto. Para obter mais informações, consulte Especificando -f e -r para dotnet build falha ao restaurar se várias estruturas estiverem presentes no arquivo de projeto.

Uma solução para esses problemas é adicionar o seguinte <PropertyGroup> ao arquivo de projeto:

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

Em seguida, use o seguinte comando para publicar seu aplicativo:

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

Uma solução alternativa para esses problemas é adicionar o seguinte <PropertyGroup> ao arquivo de projeto:

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

Em seguida, use o seguinte comando para publicar seu aplicativo:

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

Definir propriedades de compilação no arquivo de projeto

Uma alternativa para especificar parâmetros de compilação na linha de comando é especificá-los em seu arquivo de projeto em um <PropertyGroup>arquivo . A tabela a seguir lista algumas das propriedades de compilação comuns:

Propriedade Valor
<ApplicationTitle> O nome visível do usuário para o aplicativo.
<ApplicationId> O identificador exclusivo do aplicativo, como com.companyname.mymauiapp.
<ApplicationVersion> A versão da compilação que identifica uma iteração do aplicativo.
<ApplicationDisplayVersion> O número da versão do aplicativo.
<RuntimeIdentifier> O identificador de tempo de execução (RID) para o projeto. Use ios-arm64.
<ArchiveOnBuild> Um valor booleano que indica se o arquivo morto do aplicativo deve ser produzido. Use true para produzir o .ipa.
<CodesignKey> O nome da chave de assinatura de código.
<CodesignProvision> O perfil de provisionamento a ser usado ao assinar o pacote de aplicativos.
<CodesignEntitlements> O caminho para o arquivo de direitos que especifica os direitos exigidos pelo aplicativo.

Para obter uma lista completa de propriedades de compilação, consulte Propriedades do arquivo de projeto.

Importante

Os valores para essas propriedades de compilação não precisam ser fornecidos no arquivo de projeto. Eles também podem ser fornecidos na linha de comando quando você publica o aplicativo. Isso permite que você omita valores específicos do arquivo de projeto.

O exemplo a seguir mostra um grupo de propriedades típico para criar e assinar seu aplicativo iOS com seu perfil de provisionamento:

<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>

Este exemplo <PropertyGroup> adiciona uma verificação de condição, impedindo que as configurações sejam processadas, a menos que a verificação de condição seja aprovada. A verificação de condição procura dois itens:

  1. A estrutura de destino é definida como algo que contém o texto -ios.
  2. A configuração de compilação é definida como Release.

Se uma dessas condições falhar, as configurações não serão processadas. Mais importante, as <CodesignKey> configurações e <CodesignProvision> não estão definidas, impedindo que o aplicativo seja assinado.

Publicar um aplicativo iOS do Windows

Criar aplicativos iOS nativos usando o .NET MAUI requer acesso às ferramentas de compilação da Apple, que só são executadas em um Mac. Devido a isso, o Visual Studio 2022 deve se conectar a um Mac acessível em rede para criar aplicativos iOS .NET MAUI. Para obter mais informações, consulte Emparelhar com Mac para desenvolvimento iOS.

Observação

Na primeira vez que o Emparelhar com Mac faz logon em um host de compilação do Mac a partir do Visual Studio 2022, ele configura chaves SSH. Com essas chaves, logons futuros não exigirão um nome de usuário ou senha.

Para publicar seu aplicativo a partir da linha de comando no Windows, abra um terminal e navegue até a pasta do seu projeto de aplicativo .NET MAUI. Execute o dotnet publish comando, fornecendo os mesmos parâmetros de linha de comando, ou propriedades de compilação no arquivo de projeto, que você forneceria ao publicar a partir de um Mac. Além disso, você deve fornecer os seguintes parâmetros de linha de comando:

Parâmetro Valor
-p:ServerAddress O endereço IP do host de compilação do Mac.
-p:ServerUser O nome de usuário a ser usado ao fazer login no host de compilação do Mac. Use seu nome de usuário do sistema em vez do nome completo.
-p:ServerPassword A senha do nome de usuário usado para fazer login no host de compilação do Mac.
-p:TcpPort A porta TCP a ser usada para se comunicar com o host de compilação do Mac, que é 58181.
-p:_DotNetRootRemoteDirectory A pasta no host de compilação do Mac que contém o SDK do .NET. Use /Users/{macOS username}/Library/Caches/Xamarin/XMA/SDKs/dotnet/.

Importante

Os valores para esses parâmetros também podem ser fornecidos no arquivo de projeto como propriedades de compilação. No entanto, os valores de , <ServerUser>, <ServerPassword>e <_DotNetRootRemoteDirectory> normalmente serão fornecidos na linha de comando por motivos de <ServerAddress>segurança.

Por exemplo, use o seguinte comando para criar e assinar um .ipa do 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/

Observação

No .NET 8, o dotnet publish comando assume como padrão a Release configuração. Portanto, a configuração de compilação pode ser omitida da linha de comando. Além disso, o comando também usa como padrão o dotnet publishios-arm64RuntimeIdentifier. Portanto, o RuntimeIdentifier também pode ser omitido da linha de comando.

Observação

Se o ServerPassword parâmetro for omitido de uma chamada de compilação de linha de comando, Emparelhar com Mac tentará fazer login no host de compilação do Mac usando suas chaves SSH salvas.

A publicação compila e assina o aplicativo e, em seguida, copia o .ipa para a pasta bin\Release\net8.0-ios\ios-arm64\publish em sua máquina Windows. O canal de distribuição do aplicativo é especificado no certificado de distribuição contido no perfil de provisionamento. Para obter informações sobre como criar perfis de provisionamento de distribuição para os diferentes canais de distribuição, consulte Publicar um aplicativo iOS para distribuição da App Store, Publicar um aplicativo iOS para distribuição ad-hoc e Publicar um aplicativo iOS para distribuição interna

Durante o processo de publicação, talvez seja necessário permitir a codesign execução em seu Mac emparelhado:

Allow codesign to sign your app on your paired Mac.

Solucionar problemas de uma compilação remota

Se um RuntimeIdentifier não for especificado ao criar remotamente a partir da linha de comando no Windows, a arquitetura da máquina Windows será usada. Isso ocorre porque o RuntimeIdentifier tem que ser definido no início do processo de compilação, antes que a compilação possa se conectar ao Mac para derivar sua arquitetura.

Se um RuntimeIdentifier não for especificado ao criar remotamente usando o Visual Studio no Windows, o IDE detectará a arquitetura do Mac remoto e a definirá de acordo. A substituição do padrão pode ser obtida definindo a $(ForceSimulatorX64ArchitectureInIDE) propriedade build:

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

Distribuir o aplicativo

O arquivo .ipa pode ser distribuído com uma das seguintes abordagens:

  • Aplicativos ad-hoc podem ser distribuídos usando o Apple Configurator. Para obter mais informações, consulte o Guia do usuário do Apple Configurator sobre support.apple.com. |
  • Os aplicativos da App Store podem ser carregados na App Store por meio de um aplicativo como o Transporter. Isso exigirá que você tenha criado um registro para o aplicativo no App Store Connect e crie uma senha específica do aplicativo. Para obter mais informações, consulte Criar um registro de aplicativo no developer.apple.com e Iniciar sessão em aplicações com o seu ID Apple utilizando palavras-passe específicas da aplicação no support.apple.com.
  • Os aplicativos internos podem ser distribuídos por meio de um site seguro ou por meio do Gerenciamento de Dispositivos Móveis (MDM). Ambas as abordagens exigem que o aplicativo esteja preparado para distribuição, o que inclui a preparação de um manifesto. Para obter mais informações, consulte Distribuir aplicativos internos proprietários para dispositivos Apple no support.apple.com.