Não é possível gerar o arquivo do aplicativo iOS no xcode

175

Estou com um problema ao gerar um arquivo do aplicativo iOS a partir de um aplicativo. O aplicativo compila muito bem e até funciona no simulador. Agora eu queria fazer um teste ad hoc e não conseguir gerar o iOS App Archive. Quando clico em Produto -> Arquivo, ele gera um arquivo xcode genérico. Alguém pode me ajudar. Devo mencionar que já gerei um arquivo de aplicativos para iOS deste aplicativo. Parou de gerar o arquivo iOS por algum motivo. Muito obrigado.

Filip Majernik
fonte
7
Mesmo que a pergunta seja sobre a geração de arquivos a partir do xcode, eu enfrentei esse problema usando xcodebuild. A solução é especificar o destino:xcodebuild -destination generic/platform=iOS
db42
Obrigado @ db42, que conseguiu!
Fab15 /
1
você pode elaborar a resolução - onde você faz a alteração?
Jlo-gmail
Se você tiver algum arquivo .xcodeproj em Projeto> Destinos> Construir fases> dependências de destino, remova-o de lá e construa seu ipa. Funciona para mim. Cheers
Kalpesh Panchasara,

Respostas:

316

Verifique as configurações de compilação:

  1. Ignorar instalação é NÃO para o principal destino do projeto
  2. Ignorar instalação é SIM para destinos de estrutura (subprojetos)
  3. Em Fases de construção para subprojetos, os Cabeçalhos de cópia precisam estar no Projeto, não em Público (não se aplica se a construção de biblioteca estática)
  4. O diretório de instalação em Implantação é válido (/ Aplicativos, por exemplo)
Alex L
fonte
2
Esta é a resposta mais completa que incorpora as respostas parciais acima. Obrigado Alex L! Eu acho que essa deve ser a resposta escolhida para esta pergunta.
Brandon
3
Como uma meta questão, como você descobriu isso? Parece que eu confio no Stackoverflow para todas as minhas perguntas relacionadas à compilação.
philipkd
4
Lindo! Eu pensei que este era um problema com perfis de provisionamento, mas isso funcionou muito bem. O subprojeto foi a ramificação mapbox do route-me / MapView. os cabeçalhos de cópia foram essenciais, como afirma a postagem abaixo, pode ser encontrada nas fases de construção do subprojeto.
Rcarver 23/05
7
O problema 3 corrigiu meu problema, mas eu também precisava mover arquivos de Privado para Projeto antes que meu arquivo fosse construído como um Arquivo de Aplicativos para iOS.
Thomas Hajcak
4
Tecnicamente, o problema não é que os cabeçalhos sejam Públicos em Copiar cabeçalhos, é que Configurações de compilação> Caminho da pasta de cabeçalhos públicos está definido como padrão /usr/local/include. Se você estiver construindo uma biblioteca estática, os cabeçalhos devem ser Públicos, portanto, é mais correto alterar o Caminho da Pasta de Cabeçalhos Públicos para algo mais sensato include/$(TARGET_NAME). O @CopperCash observa isso em uma resposta abaixo.
bcattle
75

Isso pode acontecer se você adicionou uma estrutura / biblioteca ... você precisa editar o Target-> Build Settings dessa biblioteca e definir a configuração 'Ignorar instalação' como 'Sim'. Ao arquivar novamente, o XCode deve começar a produzir um 'iOS App Archive' novamente em vez de um 'arquivo genérico xcode'.

delany
fonte
mas "Ignorar Instalar" não está disponível no Xcode 4.4.1, pelo menos eu sou incapaz de encontrar pular intall na minha xcode
Mashhadi
2
O mesmo se aplica aos pacotes configuráveis ​​adicionados.
Mark Horgan
62

Além de Pular instalação para Sim, e caso você tenha aberto outro projeto lib / framwork no seu aplicativo, você deve mover os cabeçalhos (se houver) de público para projeto na fase de criação / copiar cabeçalhos .

fase de construção do seu destino lib / framwork

ebtokyo
fonte
3
Eu estava prestes a perder a esperança, pois o Skip Install to Yes não funcionou para mim. Copiar cabeçalhos para o Project fez o truque para mim. Obrigado!
Ksm
10
Para ajudar a localizar o subprojeto defeituoso do Xcode, você pode mostrar o arquivo genérico do Xcode no Finder e explorar o pacote. Dentro do .xcarchive, você verá os cabeçalhos com defeito em Produtos / usr / local / include.
precisa
1
Por que colocar alguns arquivos para copiar cabeçalhos para o público estragou tudo?
mskw
mskw, acho que se o artefato criado contiver um ou mais cabeçalhos públicos, ele não poderá se tornar um arquivo "implementável por dispositivo" (iOS App Archive a partir do qual você gera um IPA). Continua sendo um arquivo de projeto do Xcode. Graças
ebtokyo
1
caramba, graças, ths trabalharam para mim .. eu me pergunto como diabos você conseguir encontrar este tipo de soluções :)
Fabio Napodano
45

Fiz o seguinte para fazê-lo funcionar para mim:

  1. Eu tinha uma biblioteca estática three20, usei cocoapods para incluir os arquivos no projeto principal
  2. seguiu a instalação ignorar para todos os outros subprojetos / bibliotecas estáticas e alternou os cabeçalhos de cópia de público para projeto, conforme indicado acima
  3. o mais importante: em cada biblioteca que o seu projeto usa, vá para criar fases -> Copiar arquivos e garantir que o destino seja alterado de Absolute pathpara products directory. Nota: veja a dica abaixo para restringir sua pesquisa e encontrar a biblioteca que está causando esse erro.

e foi isso!

dica: para ter uma idéia dos arquivos incorretos que estão fazendo com que o seu archive crie um arquivo em vez de um ipa, faça o seguinte:

  1. Selecione o arquivo morto e clique no botão Distribuir.
  2. Selecione a opção 'Salvar produtos construídos'.
  3. Clique em Avançar e salve.
  4. Procure o diretório criado no Finder.
  5. O subdiretório 'libraries' identificará as bibliotecas necessárias para definir Skip Skip como Yes.
  6. em alguns casos usr/local/include, identificará os arquivos de cabeçalho culpados que você precisa mover de Público para Projeto ou os arquivos que você precisa alterar do caminho absoluto para o diretório de produtos (ou mesmo os arquivos que você esqueceu de definir a opção Ignorar instalação como Sim). mas esse diretório (ou seja, usr / local / include) varia de acordo com a estrutura de diretórios da sua sub-biblioteca. Em muitos casos .. você verá todos os arquivos listados em Copiar arquivos na etapa 3 acima listados aqui. Se você os encontrar aqui, terá uma resposta definitiva para a causa do seu problema.

atualize para a dica: para tornar a vida ainda mais simples .. quaisquer arquivos que aparecem na etapa 4 da dica acima .. simplesmente procure-o na pesquisa global do xcode .. e você deverá obter resultados imediatos para o que deseja .. por exemplo, esse era o conteúdo da minha pasta (seguindo as etapas na dica acima):

insira a descrição da imagem aqui

Então, eu poderia dizer que isso tem algo a ver com as bibliotecas de criptografia e ssl .. procurando por elas:

insira a descrição da imagem aqui

me fez perceber que eu esqueci de definir skip install para yes.

abbood
fonte
Ótima dica! Eu havia mudado alguns cabeçalhos de estrutura para 'Privado'; por alguma razão, isso estava fazendo com que eles fossem copiados ./usr/local/include.
21913 Ben Mosher
1
é sempre um prazer poder ajudar para fora @BenMosher :)
abbood
1
A melhor resposta que recebi. Obrigado pela dica, salvou o meu dia. !
Neywen 3/08
Definitivamente, a resposta que eu estava procurando - salvar produtos de construção me indicou a causa exata do problema.
Dennis L
Esta resposta abrangente com "Salvar produtos construídos" é muito útil - @abbood, muito obrigado. Espero poder retribuir o favor algum dia.
22416 Scott Scadadden
21

Se você exportar o arquivo, abra-o e veja /urs/local/includeem Produtos, tente esta sugestão :

Em cada cápsula, sob Packaging, Private Headers Folder Pathe Public Headers Folder Pathé definido como /usr/local/include. Se eu limpá-los, recebo um arquivo válido.

insira a descrição da imagem aqui

Trabalhou para mim depois de atualizar meu aplicativo React Native para 0.11.0, Xcode 7e CocoaPods 0.39.0.beta.4.

Josh Habdas
fonte
1
Eu posso confirmar que isso funciona! Desde que você lembre de limpar os caminhos de cabeçalho públicos e privados. Também é bastante fácil, se você selecionar todos os pods, procurar o caminho do cabeçalho e limpá-los ao mesmo tempo.
DIDs
1
Eu também posso confirmar que isso funciona, salvo me muito tempo, isso aconteceu quando eu atualizei meu pods para a versão 0.39.0.beta
Bryan P
Impressionante. Trabalhou para mim :) Eu estava lutando desde 1 dia e meio. Obrigado, obrigado, obrigado :) :) :) #
314 Srikanth
Eu acho que este é o que funcionou para mim Xcode 7.0 iOS9. Não tenho cocoapods, mas isso resolveu o problema. Obrigado cara
Geoff H
Além disso, eu tive que definir SKIP_INSTALL como Sim na minha extensão e aplicativo do WatchKit para que isso funcionasse.
Snowman
12

Se você estiver usando o CocoaPods, o WatchKit ou uma extensão Today, há um problema em aberto no repositório do CocoaPods que explica qual pode ser o seu problema.

A solução para mim foi remover a Copy Pod Resourcesfase dos destinos WatchKit Extension e Today Extension abaixo Build Phases. O projeto foi compilado e arquivado conforme o esperado, uma vez que eu fiz isso.

Espero que isso ajude alguém, isso me deixou perplexo por um dia inteiro!

rebello95
fonte
1
@ Lewis42 pode sempre adicionar uma recompensa;)
rebello95
Não vejo uma opção para, um voto no seu comentário terá que fazer;)
lewis
@ Lewis42 você teria que adicionar a recompensa para a questão e atribuí-lo a um lol resposta
rebello95
@ rebello95, você é demais!
Matt
10

Se alguma das respostas acima não funcionar, é provável que o seu problema esteja cocoaPods. A atualização mais recente 0.38.1estragou tudo para mim, mas depois fiz o downgrade 0.37.1e as coisas voltaram ao normal. UsandoXcode 6.3.1

Edição posterior: a atualização para 0.38.2também corrigirá isso. Mais informações sobre o que causou esse problema aqui: O Cocoapods 0.38.1 falhou ao criar um arquivo válido

Ehmad Zubair
fonte
3
Atualizei 0.38.2e ainda tenho problemas. Você está no Xcode 7?
Porter Hoskins
@PorterHoskins Acabei de escrever este problema, pois o Xcode 7 NÃO criará um arquivo válido a partir do mesmo projeto que cria um arquivo válido no Xcode 6 . Estou usando o Cocoa Pods 0.38.2, ao usar o Xcode 6 tudo está bem, mas com o Xcode 7 o arquivo não é criado corretamente. Você verificou sua estrutura de pastas para ver se possui um arquivo .appex fora do seu .app no ​​pacote?
Urso Polar
Eu tenho uma estrutura em /Library/Frameworks. Eu acho que pode ter algo a ver com as vagens de cacau do Google não sendo construídas como uma estrutura dinâmica. Parece semelhante ao github.com/CocoaPods/CocoaPods/issues/3889
Porter Hoskins
3
Mudei para todos os cabeçalhos de pod em Build Fhases / Headers para a seção de projeto do público e funcionou. Então, de fato, o problema pode estar no CocoaPods.
Denis Kutlubaev
7

Embora eu esteja usando o Xcode5 e o que o classificou para mim foi a edição do esquema de compilação - tentar todas as sugestões acima aplicáveis ​​não ajudou no meu caso.

Eu tinha dois alvos, digamos, "App" e "App FREE". Meus problemas com o arquivo genérico ocorreram quando eu estava tentando arquivar a versão GRATUITA, que eu adicionei após a versão 'normal' do aplicativo. No meu caso, quando selecionei seu esquema na barra de ferramentas e escolhi Editar esquema ... vi que a seção Build tinha dois destinos, a saber, App e App FREE.

Desmarquei todas as colunas do App, deixando apenas as colunas do App FREE marcadas e cliquei em OK. Da próxima vez que escolhi Produto> Arquivo, recebi meu aplicativo GRATUITAMENTE, em vez de um arquivo genérico. :)

Stephen Watson
fonte
7

Se você tiver apenas um projeto, talvez essa solução seja útil. Esse problema ocorreu quando eu dupliquei o alvo. Como resultado, tive dois alvos construídos em paralelo. Isso estava causando o problema. O arquivo IOS genérico foi criado.

Para desligar o paralelo, vá para

  • Gerenciar esquemas,
  • Editar esquema,
  • Construir,
  • Remova o outro alvo.
roman777
fonte
5

Eu tive esse problema depois de atualizar para o iOS 9 e o Xcode 7. A solução de Josh H funcionou para mim:

Em cada pod, em Empacotamento, Caminho da Pasta de Cabeçalhos Privados e Caminho da Pasta de Cabeçalhos Públicos é definido como / usr / local / include. Se eu limpá-los, recebo um arquivo válido.

Também fiz um script de pós-instalação para o meu Podfile fazer isso automaticamente!

    post_install do |installer_representation|
        installer_representation.pods_project.targets.each do |target|
            target.build_configurations.each do |config|
                config.build_settings['PUBLIC_HEADERS_FOLDER_PATH'] = [""];
                config.build_settings['PRIVATE_HEADERS_FOLDER_PATH'] = [""];
            end
        end
    end

Basta adicioná-lo ao final do seu Podfile e executar pod install

julianwyz
fonte
5

Tenho vários projetos no meu espaço de trabalho (GTL, Pods e meu projeto principal) e é isso que funcionou para mim:

Selecione o projeto, haverá dois tipos, o projeto e os alvos .

Para projetos que não é a sua principal como GTLou PODS:

Projetos:

Skip Install = NO
Installation Directory = /Applications
// For pods
Private Headers Folder Path = ""
Public Headers Folder Path = ""

Metas:

Skip Install = YES
Installation Directory = /Applications
// For pods
Private Headers Folder Path = ""
Public Headers Folder Path = ""

Para o projeto principal (que geralmente é nomeado igual ao nome do seu produto):

Projetos:

Skip Install = NO
Installation Directory = /Applications

Metas:

Skip Install = NO
Installation Directory = /Applications

Verifique o destino de implementação do ios em cada projeto e destino para garantir que todos sejam iguais.

Bryan P
fonte
Agradecimento por explicar passo a passo. isso realmente me ajudou a resolver meu problema.
Arslan #
4

Eu tive esse problema. No meu caso, isso foi causado pela manutenção de um destino de aplicativo para Mac como uma dependência do aplicativo para iOS.

A razão pela qual foi configurada dessa maneira foi que o aplicativo Mac era uma ferramenta usada para gerar alguns dados para o aplicativo iOS, que foi incluído no pacote.

Tive que remover essa dependência e criar a ferramenta separadamente antes de criar o próprio aplicativo iOS.

Tomas Andrle
fonte
Bibliotecas como lippd vêm com ambos os ios e metas OSX, eu esqueci de remover o destino OSX ... doh
james_alvarez
4

No meu cenário, eu estava obtendo o "Arquivo Genérico" incorreto somente depois que comecei a incluir o código Swift no meu projeto predominantemente Objective-C. Após muita solução de problemas e análise do arquivo que o Xcode estava lançando, notei que o arquivoSwiftSupport pasta (com os dylibs necessários para o tempo de execução Swift) estava em um local diferente no meu arquivo do que em um arquivo de aplicativo de projeto Swift novinho em folha da baunilha .

Encontrei a Installation Directoryconfiguração de compilação e notei que ela estava definida como um caminho personalizado no meu projeto. Simplesmente excluí-o (definindo-o como seu valor genérico de /Applications) e o próximo Build -> Archive funcionou conforme o esperado e me deu um iOS App Archive adequado.

TL; DR: verifique se a Installation Directoryconfiguração de compilação está definida como seu valor padrão /Applicationsao incluir o código Swift no seu aplicativo, especialmente se você está começando com um arquivo de projeto mais antigo que pode ter algumas configurações de compilação herdadas inesperadas.

Ryan Dorshorst
fonte
3

Deixando isso aqui para salvar outras pessoas da mesma jornada.

Descobri que também era necessário remover a mesma fase de criação de recursos de pod de cópia de um destino de biblioteca estática no meu espaço de trabalho.

Michael
fonte
depois de tentar um monte de coisas acima, isso funcionou para mim (Xcode 7)
humphriesj
2

Além da resposta de Alex L.

Ponto 3. Altere 'Build Settings' -> 'Public Header Folder Path' para 'include / xxx' também funciona.

CopperCash
fonte
Isso é mais correto que o nº 3 acima. Os cabeçalhos precisam estar público, se você está construindo uma biblioteca estática
bcattle
2

Se nenhuma das opções acima o ajudou ... depois de muito tempo .......

Excluí o valor no Info.plist para a versão do pacote porque estava feliz o suficiente com apenas o Bundle Version Short 1.0. Ruim. Não faça isso.

* Observe que eu realmente fiz isso editando-o na interface do usuário à direita, sem perceber que colocaria uma chave vazia no arquivo Info.plist. Eu acho que isso torna inválido. Meu pacote apareceu como outros itens durante o arquivamento e não tinha ícone, e não foi possível fazer o upload para qualquer lugar.

Isso se resume a valores inválidos no Info.plist. Se não for um arquivo válido, tente descompactar um arquivo antigo e soltar / substituir o atual e ver se ele o corrige ao reconstruir o arquivo.

ohc192
fonte
1
  1. Vá para Configurações de compilação e adicione

    yourAppName / Resources / dist.plist aos direitos de assinatura de código

  2. Pressione cmd + B com o dispositivo iOS ou um dispositivo real selecionado como destino da compilação

  3. Quando terminar -> role para a pasta "Produtos" e clique com o botão direito em yourAppName.app

  4. Escolha "Mostrar no localizador"

  5. Crie uma pasta com o nome Payload ( capital "P" )

  6. Copie yourAppName para sua pasta Payload

  7. Crie um zip a partir da sua pasta Payload

  8. Renomeie o zip para yourAppName.ipa

FEITO

LoVo
fonte
1

Depois de tentar praticamente tudo:

  • Limpo, Arquivo
  • excluir DerivedData, Archive
  • reiniciar o Xcode (eu estava usando o XCode7), Archive
  • combinações acima ...

Percebi então que minha partição de inicialização estava com pouco espaço livre em disco ... cerca de 1 GB. Reiniciei e recebi cerca de 18 GB de graça.

Em seguida, abri o Xcode e o projeto, executei o Archive ... e, surpreendentemente (depois de uma hora tentando criar um Archive), finalmente consegui um Archive não genérico.

Não faço ideia se é um problema de disco livre que o corrigiu ou uma reinicialização do macOS que o corrigiu, mas funcionou para mim.

Peter Li
fonte
0

No meu caso, tive que mover o FMDB e o BlocksKit para bibliotecas estáticas. Anteriormente, eles foram construídos como subprojetos. Lembre-se de que você pode usar o lipo para criar bibliotecas universais. Ao construir os produtos finais, o código do simulador será retirado automaticamente.

Maciej Swic
fonte
0

Outro motivo possível para isso é ter referências em "Dependências de destino" a projetos para uma plataforma diferente. No meu caso particular, eu estava trabalhando em um projeto que compartilha código para OSX e iOS. Em um dos destinos do iOS, adicionei acidentalmente um destino OSX como dependência.

miguelSantirso
fonte
0

Para ser completo, estou postando minha solução.

Eu experimentei exatamente o mesmo problema ao tentar criar um arquivo morto de um projeto iOS no Xcode 5.1.1 (5B1008). Nenhuma das sugestões acima resolveu o problema, e a maioria delas era irrelevante (eu não adicionei nenhuma estrutura e não tinha nenhuma entrada pública na seção Copiar cabeçalhos das minhas fases de construção).

No meu caso, corrigir o problema consistia em simplesmente fechar meu projeto, excluir todos os arquivos que eu criara anteriormente, ir para Preferências> Contas, remover minha conta de desenvolvedor, sair do Xcode, reiniciar, adicionar novamente minha conta de desenvolvedor, iniciar o processo de arquivamento novamente. Isso corrigiu meu problema imediatamente.

Ade Ward
fonte
0

Mais uma solução, uma vez que todas as opções acima não funcionaram para mim ...

Alterou o User Header Search Paths(suponho Header Search Pathsque funcionaria com a mesma elegância) para"$(BUILT_PRODUCTS_DIR)/BlocksKit" .

fundo :

No BlockKit, os desenvolvedores estruturaram os cabeçalhos no projeto principal de maneira diferente da estrutura na implantação. Portanto, você não pode fazer referência aos cabeçalhos no projeto e deve fazer referência aos cabeçalhos copiados no diretório de construção.

Mazyod
fonte
0

Como isso funcionou para mim no (Xcode 5), eu tinha dois destinos e, quando editei o esquema, no painel esquerdo do editor de esquemas, você verá os itens [BUILD, RUN, TEST, PERFILE XXX.APP, ANALYZE, ARCHIVE ] no painel BUILD, você verá os destinos do seu projeto listados em uma lista. No extremo direito, você verá as seleções de ARQUIVO, verifique se apenas um destino está selecionado para arquivamento.

Eu selecionei duas das minhas metas no meu projeto, verifiquei apenas a meta que queria no produto e funcionou!

dexijones
fonte
0

Resolvi esse erro abrindo apenas o projeto do aplicativo no XCode, ou seja. não abrir um espaço de trabalho inclua o aplicativo e outros projetos / bibliotecas / estruturas.

Tendo 2 projetos separados, uma estrutura ou biblioteca compartilhada e um aplicativo iOS, tive que abrir 2 janelas XCode diferentes, cada uma abrindo diretamente o arquivo .xcodeproj em vez do espaço .xcworkspace comum , a fim de construir cada uma delas.

Como um bom efeito colateral, o XCode não reconstrói mais todos os destinos de todos os projetos depois que eu faço uma Limpeza , resultando em tempos de construção reduzidos.

Antecedentes: estou criando um SDK de código aberto e um aplicativo iOS de demonstração. Os dois abriram em um único espaço de trabalho. Definir Ignorar instalação como YES nos destinos do SDK impediria qualquer pessoa de criar um arquivo morto, pois ele estaria vazio; portanto, essa não era uma opção. Usar o Project em vez de cabeçalhos públicos levaria a um arquivo ausente dos arquivos de cabeçalho que deveriam ser distribuídos, portanto, essa também não era uma opção.

ofavre
fonte
0

Pois era porque eu estava trabalhando em um espaço de trabalho. O projeto foi arquivado, mas não seria exibido na janela do organizador. Fechei a área de trabalho e abro o projeto por conta própria. O arquivo foi aberto no organizador ... espero que seja de ajuda.

Pierre-Yves Guillemet
fonte
0

No meu caso, eu tinha um script personalizado que copiava alguns arquivos temporários em:

${TARGET_BUILD_DIR}/myTempDir

Isso significava que, depois de investigar o arquivo para inspecionar seu conteúdo, encontrei ao lado do arquivo .app uma pasta myTempDir. Uma vez que modifiquei o script para salvar em outro lugar, as coisas foram classificadas.

Eli
fonte
0

Tente definir os cabeçalhos $ (PROJECT_NAME) no caminho da pasta de cabeçalhos públicos do projeto do Framework. Você precisa criar configurações do destino da biblioteca e editar o caminho da pasta Public Headers como $ (PROJECT_NAME) Headers.

Inco Mob
fonte
0

Se estiver usando o Xcode 7 com cocoapods v.0.38.2 . Tente remover copy pod resourcesdo seu destino de extensão hoje.

insira a descrição da imagem aqui

CoderPug
fonte
0

Encontrei esse problema depois de adicionar uma ferramenta de linha de comando do OS X ao projeto do meu aplicativo iOS e o Skip Install foi definido como NO por padrão para o destino da ferramenta de linha de comando. Como você obviamente não pode instalar um binário do OS X em um dispositivo iOS, o arquivamento padrão é um arquivo Xcode genérico. A configuração de Ignorar instalação como SIM para este destino corrigiu o problema.

Brian Stewart
fonte