Distribuição do App Center – atualizações do MAUI e do Xamarin no aplicativo
Importante
O Visual Studio App Center está programado para ser desativado em 31 de março de 2025. Embora você possa continuar a usar o Visual Studio App Center até que ele seja totalmente desativado, há várias alternativas recomendadas para as quais você pode considerar a migração.
A Distribuição do App Center permitirá que os usuários instalem uma nova versão do aplicativo quando você distribuí-la por meio do App Center. Com uma nova versão do aplicativo disponível, o SDK apresentará uma caixa de diálogo de atualização aos usuários para baixar ou adiar a nova versão. Depois que eles optarem por atualizar, o SDK começará a atualizar seu aplicativo.
Aviso
O Google Play considera o código de atualização no aplicativo como um comportamento mal-intencionado, mesmo que ele não seja usado em runtime. Use uma variante do SDK de Distribuição conforme indicado nesta seção antes de enviar seu aplicativo para o Google Play. A falha ao não remover o código de atualização no aplicativo pode levar à não conformidade e à remoção do aplicativo do Google Play.
Observação
Se você estiver executando testes automatizados de interface do usuário, as atualizações habilitadas no aplicativo bloquearão seus testes de interface do usuário automatizados, pois tentarão se autenticar no back-end do App Center. Recomendamos não habilitar a Distribuição do App Center para seus testes de interface do usuário.
Adicionar atualizações no aplicativo ao seu aplicativo
Siga a seção Introdução se você ainda não configurou e iniciou o SDK em seu aplicativo.
1. Adicionar o módulo Distribuir do App Center
O SDK do App Center foi projetado com uma abordagem modular – um desenvolvedor só precisa integrar os módulos dos serviços nos quais está interessado.
Visual Studio para Mac
- Abra o Visual Studio para Mac.
- Clique em Abrir Arquivo> e escolha sua solução.
- No navegador da solução, clique com o botão direito do mouse na seção Pacotes e escolha Adicionar pacotes NuGet....
- Pesquise pelo App Center e instale o App Center Distribute.
- Clique em Adicionar Pacotes.
Visual Studio para Windows
- Abra o Visual Studio para Windows.
- Clique em Abrir Arquivo> e escolha sua solução.
- No navegador da solução, clique com o botão direito do mouse em Referências e escolha Gerenciar Pacotes NuGet.
- Pesquise pelo App Center e instale o Microsoft.AppCenter.Distribute.
Console do Gerenciador de Pacotes
- Abra o console no Visual Studio. Para fazer isso, escolha FerramentasDo Console do Gerenciador de Pacotes>>NuGet.
- Se você estiver trabalhando em Visual Studio para Mac, verifique se instalou as Extensões de Gerenciamento de Pacotes NuGet. Para isso, escolhaExtensões do Visual Studio>, pesquise NuGet e instale, se necessário.
- Digite o seguinte comando no console:
Install-Package Microsoft.AppCenter.Distribute
Observação
Se você usar o SDK do App Center em um projeto portátil (como o Xamarin.Forms), deverá instalar os pacotes em cada um dos projetos: os portáteis, Android e iOS. Para fazer isso, você deve abrir cada subprojeto e seguir as etapas correspondentes descritas nas seções Visual Studio para Mac ou Visual Studio para Windows.
Observação
O Android 10 ou superior tem restrições sobre a atividade de inicialização em segundo plano. Consulte o artigo sobre restrições de atividades iniciais em segundo plano.
Observação
Os aplicativos em execução no Android 10 (edição Go) não podem receber a permissão SYSTEM_ALERT_WINDOW . Consulte o artigo sobre SYSTEM_ALERT_WINDOW em dispositivos Go.
Observação
A partir do Android 11, ACTION_MANAGE_OVERLAY_PERMISSION
as intenções sempre levam o usuário para a tela Configurações de nível superior, em que o usuário pode conceder ou revogar as SYSTEM_ALERT_WINDOW
permissões para aplicativos. Consulte o artigo sobre atualizações de permissões no Android 11.
2. Iniciar Distribuição do App Center
Configure o SDK do App Center chamando AppCenter.Start(...)
conforme descrito no guia Introdução.
Para seu aplicativo iOS, abra e AppDelegate.cs
adicione a seguinte linha antes da chamada para LoadApplication
:
Distribute.DontCheckForUpdatesInDebug();
Esta etapa não é necessária no Android em que a configuração de depuração é detectada automaticamente em runtime.
Para habilitar atualizações no aplicativo para builds de depuração no Android, chame o método a seguir no arquivo MainActivity.cs do projeto, no OnCreate
método e antes LoadApplication
de .
Distribute.SetEnabledForDebuggableBuild(true);
Observação
Esse método afeta apenas builds de depuração e não tem impacto sobre builds de versão.
2.3 [Somente para iOS] Modifique o Info.plist do projeto
O SDK do App Center verifica as URLs redirecionadas para o aplicativo para evitar o sideload, portanto, para que as atualizações distribuídas por meio do portal sejam tratadas corretamente, você precisará especificar CFBundleURLSchemes
na CFBundleURLTypes
seção do Info.plist
arquivo:
Observação
Info.plist
ou um arquivo de lista de propriedades de informações é um arquivo de texto estruturado que contém informações de configuração essenciais para um executável empacotado.
Você pode encontrar mais informações sobre isso na documentação do desenvolvedor da Apple.
- Adicione uma nova chave para
URL types
ouCFBundleURLTypes
no arquivo Info.plist (caso o Xcode exiba seu Info.plist como código-fonte). - Altere a chave do primeiro item filho para
URL Schemes
ouCFBundleURLSchemes
. - Insira
appcenter-${APP_SECRET}
como o esquema de URL e substitua${APP_SECRET}
pelo Segredo do Aplicativo do seu aplicativo.
Dica
Se você quiser verificar se modificou o Info.plist corretamente, abra-o como código-fonte. Ele deve conter a seguinte entrada com o Segredo do Aplicativo em vez de ${APP_SECRET}
:
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>appcenter-${APP_SECRET}</string>
</array>
</dict>
</array>
Remover atualizações no aplicativo para builds do Google Play
O Google Play considera o código de atualização no aplicativo como um comportamento mal-intencionado, mesmo que ele não seja usado em runtime. A falha ao não remover o código de atualização no aplicativo pode levar à não conformidade e à remoção do aplicativo do Google Play. Para facilitar, fornecemos a versão do SDK de Distribuição do App Center com APIs com stubbed, portanto, a única alteração para você é uma troca de dependência.
Adicione uma nova configuração de build chamada
GooglePlay
para seu Xamarin.Android e projetos compartilhados. Verifique se a configuração de build de projetos está mapeada corretamente para a configuração de solução apropriada. Consulte Instruções do Visual Studio ou Visual Studio para Mac para obter mais detalhes.Abra o Xamarin.Android e os projetos compartilhados em
.csproj
qualquer editor de texto e mova a referência de distribuição para o grupo de itens condicionais:<ItemGroup Condition=" '$(Configuration)' != 'GooglePlay' "> <PackageReference Include="Microsoft.AppCenter.Distribute" Version="3.3.0" /> </ItemGroup> <ItemGroup Condition=" '$(Configuration)' == 'GooglePlay' "> <PackageReference Include="Microsoft.AppCenter.DistributePlay" Version="3.3.0" /> </ItemGroup>
Observação
Se você estiver usando o formato antigopackages.config para gerenciar referências do NuGet, poderá migrar para um formato PackageReference , siga a instrução de migração.
Salve suas alterações e restaure os pacotes NuGet.
Você pode alterar a configuração na barra de comandos na parte superior do IDE.
Usar grupo de distribuição privado
Por padrão, Distribuir usa um grupo de distribuição público. Se você quiser usar um grupo de distribuição privado, precisará defini-lo explicitamente por meio da UpdateTrack
propriedade .
Distribute.UpdateTrack = UpdateTrack.Private;
Observação
O valor padrão é UpdateTrack.Public
. Essa propriedade só pode ser atualizada antes da chamada do AppCenter.Start
método. As alterações na faixa de atualização não são persistentes quando o processo do aplicativo é reiniciado e, portanto, se a propriedade nem sempre for atualizada antes da AppCenter.Start
chamada, ela será pública, por padrão.
Após essa chamada, uma janela do navegador será aberta para autenticar o usuário. Todas as verificações de atualização subsequentes obterão a versão mais recente na faixa privada. A faixa de atualização não é persistente no SDK entre as inicializações do aplicativo.
Se um usuário estiver no caminho privado, isso significa que, após a autenticação bem-sucedida, ele obterá a versão mais recente de qualquer grupo de distribuição privado do qual seja membro. Se um usuário estiver no caminho público, isso significa que ele obterá a versão mais recente de qualquer grupo de distribuição pública.
Desabilitar a Verificação Automática para Atualização
Por padrão, o SDK verifica automaticamente novas versões:
- Quando o aplicativo é iniciado.
- Quando o aplicativo entra em segundo plano, em primeiro plano novamente.
- Ao habilitar o módulo Distribuir se estiver desabilitado anteriormente.
Se você quiser marcar para novas versões manualmente, poderá desabilitar o marcar automático para atualização. Para fazer isso, chame o seguinte método antes do SDK iniciar:
Distribute.DisableAutomaticCheckForUpdate();
Observação
Esse método deve ser chamado antes da chamada do AppCenter.Start
método.
Em seguida, você pode usar a CheckForUpdate
API descrita na seção a seguir.
Verificar manualmente se há atualização
Distribute.CheckForUpdate();
Observação
Um marcar manual para a chamada de atualização funciona mesmo quando as atualizações automáticas estão habilitadas. Um marcar manual para atualização será ignorado se outro marcar já estiver sendo feito. O marcar manual para atualização não será processado se o usuário tiver adiado as atualizações (a menos que a versão mais recente seja uma atualização obrigatória).
Personalizar ou localizar a caixa de diálogo de atualização no aplicativo
1. Personalizar ou localizar texto
Você pode fornecer facilmente suas próprias cadeias de caracteres de recurso se quiser localizar o texto exibido na caixa de diálogo de atualização. Examine os arquivos de cadeia de caracteres para iOS neste arquivo de recurso e aqueles para Android neste arquivo de recurso. Use o mesmo nome/chave de cadeia de caracteres e especifique o valor localizado a ser refletido na caixa de diálogo em seus próprios arquivos de recurso de aplicativo.
2. Personalizar a caixa de diálogo de atualização
Você pode personalizar a aparência da caixa de diálogo de atualização padrão implementando o ReleaseAvailable
retorno de chamada. Você precisa registrar o retorno de chamada antes de chamar AppCenter.Start
, conforme mostrado no exemplo a seguir:
// In this example OnReleaseAvailable is a method name in same class
Distribute.ReleaseAvailable = OnReleaseAvailable;
AppCenter.Start(...);
Aqui está um exemplo da implementação de retorno de chamada que substitui a caixa de diálogo do SDK por uma personalizada:
bool OnReleaseAvailable(ReleaseDetails releaseDetails)
{
// Look at releaseDetails public properties to get version information, release notes text or release notes URL
string versionName = releaseDetails.ShortVersion;
string versionCodeOrBuildNumber = releaseDetails.Version;
string releaseNotes = releaseDetails.ReleaseNotes;
Uri releaseNotesUrl = releaseDetails.ReleaseNotesUrl;
// custom dialog
var title = "Version " + versionName + " available!";
Task answer;
// On mandatory update, user can't postpone
if (releaseDetails.MandatoryUpdate)
{
answer = Current.MainPage.DisplayAlert(title, releaseNotes, "Download and Install");
}
else
{
answer = Current.MainPage.DisplayAlert(title, releaseNotes, "Download and Install", "Maybe tomorrow...");
}
answer.ContinueWith((task) =>
{
// If mandatory or if answer was positive
if (releaseDetails.MandatoryUpdate || (task as Task<bool>).Result)
{
// Notify SDK that user selected update
Distribute.NotifyUpdateAction(UpdateAction.Update);
}
else
{
// Notify SDK that user selected postpone (for 1 day)
// This method call is ignored by the SDK if the update is mandatory
Distribute.NotifyUpdateAction(UpdateAction.Postpone);
}
});
// Return true if you're using your own dialog, false otherwise
return true;
}
Notas de implementação do Xamarin.Android:
Conforme mostrado no exemplo, você deve chamar Distribute.NotifyUpdateAction(UpdateAction.UPDATE);
ou Distribute.NotifyUpdateAction(UpdateAction.POSTPONE);
se o retorno de chamada retornar true
.
Se você não chamar NotifyUpdateAction
, o retorno de chamada será repetido em cada alteração de atividade.
O retorno de chamada poderá ser chamado novamente com a mesma versão se a atividade for alterada antes que a ação do usuário seja notificada para o SDK.
Esse comportamento é necessário para abranger os seguintes cenários:
- Seu aplicativo é enviado para o segundo plano (como pressionar HOME) e, em seguida, retomado em uma atividade diferente.
- Sua atividade é coberta por outra sem sair do aplicativo (como clicar em algumas notificações).
- Outros cenários semelhantes.
Nesse caso, a atividade que hospeda a caixa de diálogo pode ser substituída sem interação do usuário. Portanto, o SDK chama o ouvinte novamente para que você possa restaurar a caixa de diálogo personalizada.
3. Executar código se nenhuma atualização for encontrada
Nos casos em que o SDK verifica se há atualizações e não encontra atualizações disponíveis mais recentes do que a usada atualmente, um NoReleaseAvailable
retorno de chamada é invocado. Isso permite que você execute código personalizado nesses cenários.
Você precisa registrar o retorno de chamada antes de chamar AppCenter.Start
, conforme mostrado no exemplo a seguir:
// In this example OnNoReleaseAvailable is a method name in same class
Distribute.NoReleaseAvailable = OnNoReleaseAvailable;
AppCenter.Start(...);
void OnNoReleaseAvailable()
{
AppCenterLog.Info(LogTag, "No release available callback invoked.");
}
Habilitar ou desabilitar a Distribuição do App Center em runtime
Você pode habilitar e desabilitar a Distribuição do App Center em runtime. Se você desabilitá-lo, o SDK não fornecerá nenhuma funcionalidade de atualização no aplicativo, mas você ainda poderá usar Distribuir serviço no portal do App Center.
Distribute.SetEnabledAsync(false);
Para habilitar a Distribuição do App Center novamente, use a mesma API, mas passe true
como um parâmetro.
Distribute.SetEnabledAsync(true);
Você não precisa aguardar essa chamada para tornar consistentes outras chamadas à API (como IsEnabledAsync
).
O estado é persistido no armazenamento do dispositivo entre as inicializações do aplicativo.
Observação
Esse método só deve ser usado depois Distribute
de ter sido iniciado.
Verificar se a Distribuição do App Center está habilitada
Você também poderá marcar se a Distribuição do App Center estiver habilitada ou não:
bool enabled = await Distribute.IsEnabledAsync();
Observação
Esse método só deve ser usado depois Distribute
de ter sido iniciado, ele sempre retornará false
antes de iniciar.
Executar limpo antes que o aplicativo seja fechado para atualização (somente iOS)
Registre o retorno de chamada conforme mostrado no exemplo a seguir:
// In this example, OnWillExitApp is a method name in same class
Distribute.WillExitApp = OnWillExitApp;
void OnWillExitApp()
{
// Perform clean up here
}
Com isso, OnWillExitApp()
será invocado quando Distribute estiver prestes a fechar.
Como funcionam as atualizações no aplicativo?
Observação
Para que as atualizações no aplicativo funcionem, um build de aplicativo deve ser baixado do link. Ele não funcionará se instalado de um IDE ou manualmente.
O recurso de atualizações no aplicativo funciona da seguinte maneira:
Esse recurso funciona apenas com builds release (por padrão) que são distribuídos usando o serviço Distribuição do App Center . Ele não funcionará se o recurso de Acesso Guiado do iOS estiver ativado.
Depois de integrar o SDK, compilar a versão de lançamento do aplicativo e carregar no App Center, os usuários desse grupo de distribuição serão notificados sobre a nova versão por email.
Quando cada usuário abrir o link em seu email, o aplicativo será instalado em seu dispositivo. É importante que eles usem o link de email para instalar – não damos suporte ao sideload. Quando um aplicativo é baixado do link, o SDK salva informações importantes de cookies para marcar para atualizações posteriormente, caso contrário, o SDK não tem essas informações de chave.
Se o aplicativo definir a faixa como privada, um navegador será aberto para autenticar o usuário e habilitar atualizações no aplicativo. O navegador não será aberto novamente, desde que as informações de autenticação permaneçam válidas mesmo ao alternar de volta para a faixa pública e voltar para privadas novamente mais tarde. Se a autenticação do navegador for bem-sucedida, o usuário será redirecionado de volta para o aplicativo automaticamente. Se a faixa for pública (que é o padrão), a próxima etapa ocorrerá diretamente.
- No iOS 9 e 10, uma instância do
SFSafariViewController
será aberta no aplicativo para autenticar o usuário. Ele se fechará automaticamente depois que a autenticação for bem-sucedida. - No iOS 11, a experiência do usuário é semelhante ao iOS 10, mas o iOS 11 solicitará ao usuário sua permissão para acessar informações de logon. Essa é uma caixa de diálogo no nível do sistema e não pode ser personalizada. Se o usuário cancelar a caixa de diálogo, ele poderá continuar a usar a versão que está testando, mas não receberá atualizações no aplicativo. Eles serão solicitados a acessar as informações de logon novamente quando iniciarem o aplicativo na próxima vez.
- No iOS 9 e 10, uma instância do
Uma nova versão do aplicativo mostra a caixa de diálogo de atualização no aplicativo solicitando que os usuários atualizem seu aplicativo se for:
iOS:
- um valor mais alto de
CFBundleShortVersionString
ou - um valor igual de
CFBundleShortVersionString
, mas um valor mais alto deCFBundleVersion
. - as versões são as mesmas, mas o identificador exclusivo de build é diferente.
- um valor mais alto de
Android:
- um valor mais alto de
versionCode
ou - um valor igual de
versionCode
, mas um valor diferente deversionName
.
- um valor mais alto de
Dica
Se você carregar o mesmo apk/ipa uma segunda vez, a caixa de diálogo NÃO aparecerá, pois os binários são idênticos. No iOS, se você carregar um novo build com as mesmas propriedades de versão, ele mostrará a caixa de diálogo de atualização. O motivo disso é que ele é um binário diferente . No Android, os binários serão considerados os mesmos se ambas as propriedades de versão forem as mesmas.
Como fazer testar atualizações no aplicativo?
Você precisa carregar builds de versão (que usam o módulo Distribuir do SDK do App Center) no Portal do App Center para testar atualizações no aplicativo, aumentando os números de versão a cada vez.
- Crie seu aplicativo no Portal do App Center, caso ainda não tenha feito isso.
- Crie um novo grupo de distribuição e nomeie-o, para que você possa reconhecer que ele destina-se a testar o recurso de atualização no aplicativo.
- Adicione a si mesmo (ou a todas as pessoas que você deseja incluir no teste do recurso de atualização no aplicativo). Use um endereço de email novo ou descartado para isso, que não foi usado para esse aplicativo no App Center. Isso garante que sua experiência esteja próxima da experiência de seus testadores reais.
- Crie um novo build do seu aplicativo que inclua o App Center Distribute e contenha a lógica de configuração, conforme descrito abaixo. Se o grupo for privado, não se esqueça de definir a faixa de atualização privada no aplicativo antes de começar a usar a
UpdateTrack
propriedade . - Clique no botão Distribuir nova versão no portal e carregue a compilação do aplicativo.
- Depois que o upload for concluído, clique em Avançar e selecione o Grupo de distribuição que você criou como o Destino dessa distribuição de aplicativo.
- Examine a Distribuição e distribua o build para o grupo de testes no aplicativo.
- Pessoas nesse grupo receberão um convite para serem testadores do aplicativo. Depois de aceitar o convite, eles poderão baixar o aplicativo do Portal do App Center de seu dispositivo móvel. Depois que as atualizações no aplicativo estiverem instaladas, você estará pronto para testar as atualizações no aplicativo.
- Aumentar a versão do seu aplicativo (
CFBundleShortVersionString
ouCFBundleVersion
para iOS,versionCode
para Android) - Crie a versão de lançamento do seu aplicativo e carregue um novo build do seu aplicativo como você fez na etapa anterior e distribua isso para o Grupo de Distribuição criado anteriormente. Os membros do Grupo de Distribuição serão solicitados a obter uma nova versão na próxima vez que o aplicativo for iniciado.
Dica
Confira as informações sobre como utilizar a Distribuição do App Center para obter informações mais detalhadas sobre grupos de distribuição etc. Embora seja possível usar a Distribuição do App Center para distribuir uma nova versão do seu aplicativo sem adicionar nenhum código, adicionar a Distribuição do App Center ao código do aplicativo resultará em uma experiência mais perfeita para seus testadores e usuários à medida que eles obtêm a experiência de atualização no aplicativo.
Desabilitar o encaminhamento automático dos métodos do delegado do aplicativo para os serviços do App Center
O App Center usa o swizzling para encaminhar automaticamente os métodos do delegado do aplicativo para os serviços do App Center para melhorar a integração do SDK. Há uma possibilidade de conflitos com outras bibliotecas de terceiros ou com o próprio delegado do aplicativo. Nesse caso, talvez você queira desabilitar o encaminhamento do delegado de aplicativo do App Center para todos os serviços do App Center seguindo as etapas abaixo:
- Abra o arquivo Info.plist do projeto.
- Adicione
AppCenterAppDelegateForwarderEnabled
a chave e defina o valor como0
. Isso desabilita o encaminhamento de representantes de aplicativos para todos os serviços do App Center. - Adicione
OpenUrl
retorno de chamada ao arquivoAppDelegate.cs
.
public override bool OpenUrl(UIApplication application, NSUrl url, string sourceApplication, NSObject annotation)
{
Distribute.OpenUrl(url);
return true;
}