Corrigindo rejeições de ícones na App Store: sRGB, canais alfa e outras armadilhas
A validação de ícones do App Store Connect falha silenciosamente. Você faz o upload de um PNG 1024×1024 que parece perfeito em todos os editores de imagem que você usa, e a resposta é uma variação de “A imagem não pôde ser processada.” Nenhuma menção ao espaço de cor. Nenhuma referência ao alfa. Apenas uma barreira entre seu envio e a App Store.
Na realidade, o validador verifica um conjunto restrito de propriedades técnicas, e a falha em qualquer uma delas produz o mesmo erro genérico. As três causas mais comuns são: um perfil de cor diferente de sRGB (geralmente Display P3 de ferramentas de design modernas), um canal alfa que a loja proíbe explicitamente, e – com menos frequência – um modo de cor indexado que não deveria aparecer em um ícone produzido em 2025, mas ainda aparece quando arquivos passam por pipelines de otimização mais antigos. Os três problemas podem ser corrigidos pelo terminal em menos de um minuto quando você sabe o que verificar.
O que o App Store Connect realmente exige
Os requisitos da Apple para o ícone da página do app na App Store são específicos. O arquivo deve ser um PNG. As dimensões devem ser 1024×1024 pixels. Não deve haver canal alfa – nem um canal parcialmente transparente, nem um totalmente opaco: nenhum dado alfa. O espaço de cor recomendado é sRGB: as Human Interface Guidelines da Apple também listam Display P3 e Gray Gamma 2.2 como espaços de cor compatíveis com ícones de apps, mas, na nossa experiência, sRGB é a opção mais segura para o ícone da App Store. E o modo de cor recomendado é RGB TrueColor, não uma paleta indexada.
A restrição ao alfa existe porque o App Store Connect aplica seu próprio arredondamento dos cantos e composição aos ícones. Um ícone com canal alfa interferiria nesse processo. A restrição ao sRGB existe porque a loja renderiza ícones em uma ampla variedade de dispositivos com diferentes perfis de exibição; o sRGB é a linha de base comum. Display P3, o espaço de cor de ampla gama de cores da Apple, é uma opção de exportação comum em ferramentas como Figma, Sketch e Affinity Designer e, na nossa experiência, ícones com a identificação P3 estão por trás de muitas das falhas abordadas neste guia.
Diagnosticando o problema com sips
O macOS vem com o sips (Scriptable Image Processing System), uma ferramenta de linha de comando que pode inspecionar e transformar imagens sem nenhuma dependência de terceiros. É a maneira mais rápida de ver exatamente o que seu arquivo de ícone contém.
sips --getProperty all icon.png
A saída é uma lista simples de propriedades. Os campos que importam para a validação na App Store são hasAlpha, space e profile. Um arquivo com problemas normalmente mostra algo assim:
hasAlpha: yes
space: RGB
profile: Display P3
Essa combinação vai falhar. O valor space: RGB não distingue entre RGB genérico e sRGB – o campo de perfil é o que permite distinguir os dois. Um ícone limpo pronto para upload deve mostrar hasAlpha: no e um perfil identificado como “sRGB IEC61966-2.1” ou equivalente.
Você também pode consultar propriedades individuais se quiser uma verificação mais rápida durante um script de build:
sips --getProperty hasAlpha icon.png
sips --getProperty profile icon.png
O problema do perfil de cor
A causa mais comum de rejeição é um perfil de cor Display P3. As telas dos Macs modernos suportam P3, e as ferramentas de design podem exportar com um perfil de ampla gama de cores, a menos que você escolha sRGB explicitamente. O Figma removeu a opção “Unmanaged” em agosto de 2023; agora cada arquivo usa sRGB ou Display P3, e as exportações usam o perfil do arquivo, a menos que você o altere nas configurações de exportação. O Sketch tem uma configuração similar por documento. Se seu designer está trabalhando em um MacBook Pro e exporta sem verificar essa configuração, o PNG resultante é P3.
A correção é converter o arquivo para sRGB – não apenas atribuir esse perfil a ele. Há uma distinção importante aqui. O sinalizador sips -s profile incorpora um perfil diferente nos metadados sem transformar os valores dos pixels. Isso produz uma mentira: os pixels são codificados como P3, mas rotulados como sRGB. O sinalizador correto é --matchTo, que realiza uma conversão real do espaço de cor:
sips --matchTo '/System/Library/ColorSync/Profiles/sRGB Profile.icc' icon.png --out icon-srgb.png
Isso lê os pixels de origem como P3, os converte para equivalentes sRGB e salva um novo arquivo. A mudança de cor é imperceptível na maioria das telas, mas importa para a conformidade com o validador. Após executar isso, confirme o resultado:
sips --getProperty profile icon-srgb.png
O perfil agora deve indicar “sRGB IEC61966-2.1”.
Removendo o canal alfa
O sips não consegue remover canais alfa. Ele pode inspecioná-los e pode adicionar um perfil a um arquivo que os possua, mas remover a camada alfa requer uma ferramenta diferente. O convert do ImageMagick lida com isso de forma limpa:
convert icon-srgb.png -background white -alpha remove -alpha off icon-final.png
Os sinalizadores funcionam em sequência. -background white define a cor de fundo que substituirá os pixels transparentes. -alpha remove compõe a imagem sobre esse fundo, eliminando a transparência. -alpha off remove o canal alfa da saída completamente. O resultado é um PNG sem transparência que o validador da App Store aceita.
Se o seu ícone não tem transparência real – todos os pixels são totalmente opacos – mas o arquivo ainda carrega um canal alfa em sua estrutura, você pode usar o pngcrush em vez disso. Sua redução sem perdas do tipo de cor, ativada por padrão desde o pngcrush 1.8.0, regrava uma imagem RGBA totalmente opaca como RGB sem alterar nenhum valor de pixel:
pngcrush -ow -rem alla icon.png
O canal alfa é composto por dados de pixels, não é um bloco de metadados, portanto o sinalizador -rem alla não o remove. Esse sinalizador remove todos os blocos auxiliares conhecidos, exceto tRNS, incluindo qualquer perfil de cor incorporado; por isso, verifique o perfil novamente depois. -ow sobrescreve o arquivo original. Isso é mais rápido e sem perdas, mas a redução só ocorre quando não há transparência real para achatar. Se identify -verbose icon.png | grep Alpha mostrar pixels não opacos, use o ImageMagick.
O caso especial do modo de cor indexado
O RGB TrueColor armazena cada pixel como três valores independentes de canal de 8 bits (ou 16 bits). O modo indexado armazena uma paleta de cores e as referencia por índice inteiro – um formato projetado para GIFs pequenos em 1989, não para ícones de aplicativos. A maioria das ferramentas de design nunca produz PNGs indexados, mas alguns pipelines de otimização web – especialmente os mais antigos que usam ferramentas como pngquant de forma agressiva – podem converter ícones TrueColor para indexados como efeito colateral da quantização de paleta.
Para verificar o modo de cor com o ImageMagick:
identify -verbose icon.png | grep -E "^ Type"
Um arquivo TrueColor relata Type: TrueColor ou Type: TrueColorAlpha. Um arquivo indexado relata Type: Palette. Se você vir Palette, converta:
convert icon.png -type TrueColor icon-truecolor.png
Na prática, essa é a razão menos comum de rejeição, mas aparece regularmente em bases de código onde os ícones foram processados por um script de otimização de recursos gráficos em algum momento de sua história.
O pipeline de correção combinado
Quando um ícone tem os três problemas – perfil P3, canal alfa e possivelmente metadados desatualizados – a abordagem mais limpa é um pipeline curto: sips para a conversão de cor, seguido de um comando do ImageMagick para todo o resto:
sips --matchTo '/System/Library/ColorSync/Profiles/sRGB Profile.icc' icon.png --out /tmp/icon-srgb.png && convert /tmp/icon-srgb.png -type TrueColor -background white -alpha remove -alpha off -strip icon-final.png
O sinalizador -strip no final remove todos os perfis incorporados, comentários e blocos de metadados auxiliares da saída. Nesse ponto, os pixels já foram convertidos para sRGB, o que produz um PNG pequeno, sem metadados desnecessários; se quiser manter a identificação sRGB explícita recomendada acima, omita -strip. Após executar isso, um sips --getProperty all icon-final.png final deve confirmar hasAlpha: no, space: RGB e nenhum perfil ou o perfil sRGB explicitamente incorporado.
Corrigindo o problema na origem
As correções pela linha de comando funcionam, mas a solução real é configurar sua ferramenta de design para exportar corretamente da primeira vez. No Figma, defina o perfil de cor do arquivo como sRGB, ou escolha sRGB nas configurações de exportação, antes de exportar qualquer recurso gráfico. No Sketch, clique em uma área vazia da tela e ajuste Color Profile no Inspector. No Affinity Designer, abra File → Document Setup, escolha a aba Color e certifique-se de que o perfil esteja definido como sRGB IEC61966-2.1.
Para ícones da App Store especificamente, a exportação deve ser PNG, 1024×1024, sem escalonamento aplicado, com o perfil sRGB ativo. Se o seu pipeline de CI/CD faz upload para o App Store Connect via xcrun altool ou diretamente pela API do App Store Connect, adicione uma etapa de validação antes do upload que execute sips --getProperty hasAlpha e interrompa o build com erro se o alfa estiver presente. Detectar esse problema antes da chamada de API economiza o tempo de ida e volta e a investigação manual.
A lição subjacente aqui é que a validação do App Store Connect está fazendo exatamente o que a Apple documentou. O problema é que a documentação não é exibida durante o fluxo de upload, e as mensagens de erro não correspondem a condições de falha específicas. Uma vez que você conhece as três propriedades verificadas, o processo de validação deixa de ser misterioso e se torna uma lista de verificação simples.
Artigos relacionados
- Do conceito SwiftUI à App Store em semanas – O cronograma mais amplo e as decisões envolvidas em enviar um aplicativo para publicação, incluindo o processo de provisionamento e avaliação.
- Criando um aplicativo de preparação para exames com milhares de perguntas – Decisões de arquitetura para um aplicativo iOS modular com backend Supabase e capacidade offline.
- Concorrência no Swift 6: um guia prático de migração – Migrando aplicativos SwiftUI para a concorrência estrita do Swift 6, com avisos reais do compilador e suas correções.