Info.plist é um arquivo de configuração XML para aplicativos iOS e macOS que contém metadados, permissões e configurações de inicialização. Ele é processado pelo sistema antes da inicialização do código do aplicativo. De acordo com Apple Developer, 2025, sem um Info.plist configurado corretamente, o aplicativo não passa na revisão da App Store. Info.plist define o identificador do pacote, a versão de compilação, as permissões solicitadas e as orientações de tela suportadas.
Principais pontos
Info.plist é um arquivo no formato XML com elemento raiz dict contendo pares chave-valor na forma de property list. Ele está localizado dentro do pacote do aplicativo e é lido pelo sistema a cada inicialização antes da execução do código. O formato plist suporta strings, números, arrays, dicionários, datas e valores booleanos, permitindo descrever configurações complexas.
A Apple usa Info.plist para definir a identidade, capacidades e requisitos do aplicativo. Alterar algumas chaves requer a reconstrução do pacote, pois elas afetam metadados verificados pela App Store ao enviar uma compilação. Por exemplo, alterar CFBundleVersion ou CFBundleIdentifier após a publicação pode quebrar o processo de atualização do aplicativo, pois o App Store Connect usa esses valores para identificar versões.
As chaves básicas são criadas automaticamente ao criar um projeto no Xcode, mas a maioria das configurações são adicionadas manualmente à medida que a funcionalidade do aplicativo evolui. O Xcode fornece um editor gráfico do Info.plist com listas suspensas para chaves padrão, reduzindo o risco de erros de digitação. No entanto, para configurações complexas como Scene Manifest ou Background Modes, é recomendado editar o XML diretamente.
Algumas chaves do Info.plist são obrigatórias para publicar na App Store. Sua ausência leva à rejeição da compilação na fase de validação. A Apple verifica essas chaves automaticamente ao enviar um arquivo através do Xcode Organizer ou Transporter. O desenvolvedor deve garantir que todos os campos obrigatórios estejam corretamente preenchidos antes de enviar para revisão.
A chave CFBundleIdentifier define um identificador único do aplicativo em notação de domínio reverso (com.company.appname). É usada para assinatura de código, notificações push, CloudKit, App Groups e muitos outros serviços da Apple. Alterar o identificador após a publicação faz com que a App Store o considere um novo aplicativo, e os usuários existentes não receberão a atualização. Portanto, o identificador deve permanecer inalterado durante todo o ciclo de vida do aplicativo.
<key>CFBundleIdentifier</key>
<string>com.itsectr.myapp</string>
As chaves CFBundleShortVersionString (versão exibida) e CFBundleVersion (número de compilação) são usadas pelo App Store Connect e pelo sistema para gerenciar atualizações. A versão é especificada no formato major.minor.patch. O número de compilação deve aumentar a cada compilação enviada ao App Store Connect, mesmo que a versão do aplicativo não mude. A Apple usa CFBundleVersion para determinar se uma compilação é nova ou duplica uma já enviada. Se o número de compilação corresponder a um já enviado, o erro ITMS-90161 é retornado.
<key>CFBundleShortVersionString</key>
<string>1.2.0</string>
<key>CFBundleVersion</key>
<string>42</string>
As chaves UISupportedInterfaceOrientations definem as orientações de tela suportadas para iPhone. Para iPad, é usada uma chave separada UISupportedInterfaceOrientations~ipad com o sufixo do dispositivo. Cada orientação é especificada como string: UIInterfaceOrientationPortrait, UIInterfaceOrientationLandscapeLeft, UIInterfaceOrientationLandscapeRight, UIInterfaceOrientationPortraitUpsideDown. Se um aplicativo suporta apenas orientação retrato e não é exclusivo para iPhone, a App Store rejeitará a compilação se apenas retrato for especificado para iPad.
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
</array>
Desde o iOS 10, a Apple exige uma descrição para cada permissão solicitada através de chaves com o prefixo NS (NeXTStep). A descrição é exibida ao usuário em um diálogo do sistema na primeira solicitação de acesso a APIs privadas. A ausência da chave NS correspondente ao chamar uma API que requer permissão causa o encerramento imediato do aplicativo com uma exceção registrada apenas nos logs de falhas.
| Chave | Propósito |
|---|---|
| NSCameraUsageDescription | Acesso à câmera para fotos e vídeo |
| NSPhotoLibraryUsageDescription | Acesso à biblioteca de fotos |
| NSLocationWhenInUseUsageDescription | Geolocalização durante o uso |
| NSMicrophoneUsageDescription | Acesso ao microfone para gravação de áudio |
| NSContactsUsageDescription | Acesso aos contatos do dispositivo |
Cada chave de privacidade deve conter uma descrição compreensível para o usuário do motivo da solicitação. Textos vazios ou genéricos, como “Para funcionamento do aplicativo” ou “Precisa de acesso”, levam à rejeição da App Store. A descrição deve explicar a funcionalidade específica: “O acesso à câmera é necessário para digitalizar QR codes e criar fotos de perfil.” Recomenda-se usar versões localizadas das descrições através de arquivos InfoPlist.strings para cada idioma suportado.
A ausência de uma chave NS necessária ao chamar uma API que acessa dados privados causa uma falha no aplicativo. O sistema encerra o processo com uma exceção, perceptível apenas nos logs de relatórios de falhas do Xcode ou Firebase Crashlytics. O usuário vê apenas um fechamento repentino do aplicativo sem qualquer explicação. Portanto, antes de adicionar nova funcionalidade que use câmera, microfone ou geolocalização, primeiro deve-se adicionar a chave de privacidade correspondente no Info.plist e depois implementar a chamada de API.
A chave CFBundleURLTypes registra esquemas de URL personalizados para links profundos no aplicativo. Isso permite abrir o aplicativo a partir do navegador, email ou outros aplicativos através de links como myapp://profile/123. Cada esquema identifica o aplicativo de forma única: se dois aplicativos registrarem o mesmo esquema, o sistema mostra ao usuário um diálogo para escolher qual usar.
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>com.itsectr.myapp</string>
<key>CFBundleURLSchemes</key>
<array>
<string>myapp</string>
</array>
</dict>
</array>
Para suportar Universal Links, é necessária a chave com.apple.developer.associated-domains no arquivo Entitlements, não no Info.plist. Os Universal Links funcionam apenas se existir um arquivo apple-app-site-association configurado no servidor, vinculando o domínio ao aplicativo. Diferente dos esquemas de URL personalizados, os Universal Links não mostram um diálogo de confirmação e não entram em conflito com outros aplicativos, pois usam links HTTPS em vez de esquemas personalizados. No entanto, exigem um domínio com certificado SSL válido.
Os esquemas personalizados podem entrar em conflito com os esquemas padrão do iOS. Recomenda-se usar esquemas de pelo menos 4 caracteres para minimizar colisões com outros aplicativos. Por exemplo, o esquema “fb” é muito curto e pode gerar conflitos. É melhor usar notação reversa: myapp:// em vez de app://. Também lembre-se de que se o aplicativo for excluído mas outro aplicativo tiver registrado o mesmo esquema, o usuário pode experimentar comportamento inesperado ao navegar por um link.
A chave UIBackgroundModes declara as capacidades em segundo plano do aplicativo. Cada modo requer uma descrição correspondente no Info.plist e confirmação nas capacidades do projeto Xcode. Sem especificar um modo, o sistema pode forçar o encerramento da tarefa em segundo plano após 30 segundos ou quando faltarem recursos.
<key>UIBackgroundModes</key>
<array>
<string>fetch</string>
<string>remote-notification</string>
<string>location</string>
<string>processing</string>
</array>
A chave UIApplicationSupportsMultipleScenes ativa o suporte à multitarefa no iPad e Mac Catalyst. Sem esta chave, o aplicativo não pode usar SwiftUI ScenePhase ou UIKit UISceneDelegate para gerenciar várias janelas. No iPadOS, os usuários podem abrir várias janelas do mesmo aplicativo, arrastar conteúdo entre elas e usar Split View. Se o aplicativo não suportar o modo multijanela, definir esta chave como false desativa a funcionalidade correspondente.
A chave LSRequiresIPhoneOS impede a instalação do aplicativo no iPad. É usada para aplicativos exclusivos para iPhone que não suportam a interface do iPad ou não foram adaptados para uma tela grande. No entanto, a Apple não recomenda usar esta chave desnecessariamente, pois os usuários esperam que os aplicativos funcionem em todos os dispositivos com iOS e iPadOS. Se o aplicativo ainda estiver limitado ao iPhone, certifique-se de que este requisito seja tecnicamente justificado e indicado na descrição da App Store.
A chave UIViewControllerBasedStatusBarAppearance controla o estilo da barra de status. Se definido como NO, o estilo da barra de status é definido globalmente através da chave UIStatusBarStyle do Info.plist. Se YES (padrão desde iOS 7), cada ViewController pode gerenciar sua própria barra de status sobrescrevendo preferredStatusBarStyle. Para aplicativos modernos, recomenda-se manter YES para ter diferentes estilos de barra de status em diferentes telas, por exemplo claro em fundo escuro e escuro em fundo claro.
A chave UIApplicationExitsOnSuspend força o aplicativo a encerrar completamente ao entrar em segundo plano em vez de suspender. É raramente usada, apenas para aplicativos com altos requisitos de segurança: aplicativos bancários ou que lidam com dados confidenciais. Neste caso, o usuário perde a capacidade de retornar rapidamente ao aplicativo, e cada inicialização ocorre a partir de um estado limpo. A App Store pode solicitar justificativa para usar esta chave durante a revisão.
A chave NSAppTransportSecurity gerencia as conexões de rede do aplicativo. Desde o iOS 9, o App Transport Security (ATS) bloqueia todas as conexões HTTP por padrão, exigindo HTTPS. Para permitir temporariamente requisições HTTP a domínios específicos, usa-se o dicionário NSExceptionDomains dentro de NSAppTransportSecurity. Para desenvolvimento, a desativação completa do ATS via NSAllowsArbitraryLoads = true é permitida, mas a Apple exige justificativa e não permite tais compilações sem um motivo válido. Em compilações de produção, o ATS deve estar ativado para todos os domínios que lidam com dados do usuário.
Perguntas frequentes
O arquivo Info.plist está localizado na pasta do projeto com o nome correspondente ao nome do aplicativo. No Xcode, ele é exibido no navegador de projetos dentro do grupo Supporting Files com um ícone de livro azul. Também pode ser encontrado através da pesquisa Spotlight no projeto.
Sim, o Info.plist pode ser editado em qualquer editor de texto ou através da interface gráfica do Xcode. A edição manual oferece controle total sobre o conteúdo, mas requer atenção à sintaxe XML: cada diretiva de abertura <key> deve ter sua correspondente </key>, e os tipos de dados devem corresponder ao que a Apple espera.
Em projetos SwiftUI, o Info.plist funciona de forma idêntica aos projetos UIKit. Adicionalmente, a chave UIApplicationSceneManifest pode ser necessária para configuração de cenas se o projeto não usar o protocolo App para gerenciamento de cenas. O protocolo App do SwiftUI gera automaticamente a configuração de cenas, mas a personalização requer adição manual de chaves.
Abra o Info.plist no Xcode, clique no botão mais e digite o nome da chave. Para chaves personalizadas, use um prefixo da empresa para evitar conflitos com chaves do sistema da Apple, por exemplo ITSCustomKey em vez de apenas CustomKey. O tipo de valor (String, Number, Array, Dictionary) é escolhido com base no formato de dados esperado.
Razões típicas: falta de chaves de privacidade para as permissões solicitadas, CFBundleIdentifier incorreto, incompatibilidade de versão entre Info.plist e App Store Connect, valores vazios em chaves NS. Verifique todas as chaves NS para as APIs utilizadas e garanta que cada descrição contenha uma explicação significativa no idioma de localização do aplicativo.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também