Como construir arquiteturas armv6 e armv7 com iOS 5

96

No iOS5, a Apple descarta a arquitetura armv6 do ARCHS_STANDARD_32_BIT .

Para manter o suporte para iPhone3G , ainda quero compilar no armv6 mesmo no iOS5.

Alguém encontrou uma solução para isso?

iGranDav
fonte

Respostas:

96

Acabei de construir algo hoje especificando um destino de implantação do iOS 4.0. Com apenas armv7 especificado em Architectures, o Xcode me avisou que para oferecer suporte a qualquer coisa abaixo de iOS4.2 eu precisava incluir armv6 em Architectures. Apenas edite esse campo, clique no botão "+" quando a caixa de diálogo for exibida e digite o "armv6" literal.

No meu caso, queremos que nosso aplicativo funcione em iOS4 e iOS5. Tivemos que fazer algumas modificações para que funcionasse corretamente no iOS5, mas todas essas alterações foram feitas com alterações de código compatíveis com iOS4.

Também adicionamos alguns recursos específicos do iOS5 de uma maneira que permite que o aplicativo seja executado sem travar no iOS4. Especificamente, testamos os recursos do iOS5 antes de tentar usá-los e vinculamos as bibliotecas apenas do iOS5 como opcionais.

Portanto, o suporte ao iPhone3G em um mundo iOS5 poderia facilmente significar "queremos que nosso aplicativo seja executado no iOS4 e superior (independentemente do uso de qualquer recurso do iOS5)" em vez de "queremos ter certeza de que nosso aplicativo é executado em um dispositivo mais antigo executando iOS5 " Há uma diferença aqui; pense nisso. :-)

De qualquer forma, adicionar suporte para armv6 é muito fácil. E eu acho que o ponto é este: em algum ponto, quando não houver mais dispositivos armv6 com os quais se preocupar (por qualquer motivo), você não terá que construir para ele. A opinião da Apple é que todos devem atualizar para o hardware mais recente o mais rápido possível. Portanto, naquele mundo, não há necessidade de as ferramentas serem padronizadas para nada além das melhores e mais recentes. :-) Felizmente (ou não), nós, desenvolvedores, vivemos no mundo real e reconhecemos que você precisa suportar coisas mais antigas por um tempo. E eu acho que a equipe de desenvolvimento do Xcode também sabe disso, é por isso que você pode adicionar o suporte armv6 de volta de forma bastante simples.

Mark Granoff
fonte
3
Obrigado por sua resposta precisa :-) Na verdade, eu quero ser capaz de executar meu aplicativo em um iPhone 3G com iOS 4.2.1 ou inferior (limitado a 4.0) e ter alguns recursos específicos do iOS 5 para os dispositivos atuais. Eu não tentei simplesmente adicionar "armv6" em arquiteturas, eu estava procurando por uma variável de ambiente como ARCHS_STANDARD_32_BIT e acabei de encontrar ARCHS_UNIVERSAL_IPHONE_OS, mas não parece funcionar.
iGranDav de
3
Queria acrescentar que muitas soluções por aí sugerem que deveria dizer "armv6 armv7" - isso não funcionou para mim. Atualmente, apenas "armv6 $ (ARCHS_STANDARD_32_BIT)" funciona para mim, o que significa não se livrar do que está lá, apenas adicione "armv6" à configuração de arquiteturas
colchete de
1
Eu fiz tudo isso e minha compilação ainda estava falhando - o motivo era que eu tinha uma compilação de lançamento (não usada) definida para um destino de implantação do iOS 5.0 enquanto a depuração e distribuição estavam definidas para 3.0 e isso parece interromper a construção do xcode para armv6. Definir a meta de implantação para 3.0 para todas as compilações corrigiu o problema.
Simon East
6
Não funcionou para mim (mesmo depois de adicionar 'armv6'). O aplicativo nem apareceu no meu iPod touch. Mas então eu descobri que 'Recursos necessários do dispositivo' (na guia de informações) tinha armv7 nele. Acabei de excluí-lo e ele começou a funcionar perfeitamente
Erpheus,
1
Eu geralmente uso $ (VALID_ARCHS), que funciona para mim. Acabei de descobrir que novos projetos também adicionam um requisito de capacidade 'arm7'. Acabei de deletar isso e tudo funciona bem.
Gordon Dove
51

A resposta simples é que você deve alterar as configurações atuais de "Standard (armv7) - $ (ARCHS_STANDARD_32_BIT)" para ser apenas "armv6" e "armv7". Veja a imagem abaixo. Você deve excluir a linha com as configurações anteriores para que funcione.

Configurações corretas para armv6 e armv7

adjwilli
fonte
3
Obrigado por explicar isso com uma imagem - realmente deixou isso claro.
radven
11

também certifique-se de definir isso em Projeto E metas ... me custou uma hora para descobrir isso. tinha definido para um, mas não para o outro. espero que isto ajude. GLTA

ubert
fonte
Além disso, se você tiver alguma biblioteca, terá que defini-la no projeto e os destinos lá.
William Jockusch
9

Acho que há uma razão pela qual a Apple retirou o armv6 da configuração padrão.

Compilei armv7 / armv6 com iOS5 SDK, no entanto, o compilador armv6 produziu código errado no modo de lançamento. Depois de horas tentando encontrar uma solução alternativa (tentando llvm ou gcc com diferentes níveis de otimização), desisto.

Portanto, voltarei ao iOS SDK 4.x, desde que ofereça suporte a dispositivos armv6 mais antigos.

Exemplo de código:

// myView center=(160, 100)
CGPoint p=myView.center;  
// now p=(100,100) (what the heck?)
p.x=myView.center.x;
p.y=myView.center.y;
// now p=(160,100) 
p.y+=100;
// now p =(200,200) (what the heck?)

Talvez eu tenha alguma corrupção de memória, no entanto, no compilador armv7 e no iOSSDK <5.0 ele se comporta conforme o esperado.

Cumprimentos

Jfieres
fonte
Também estou vendo bugs estranhos em compilações armv6 em dispositivos mais antigos. Você descobriu isso ou realmente voltou a um XCode anterior? Também observo que eles não permitem mais o download dos SDKs mais antigos!
Craig McMahon,
19
Este é um problema conhecido com o LLVM Compiler 3.0 nas estruturas Xcode 4.2 e CGPoint / CGSize: devforums.apple.com/thread/122059?tstart=15 . Desativar a construção para Thumb no armv6 evita esses tipos de erros.
Brad Larson
Uau! Estou tão feliz pela sua resposta, isso está acontecendo comigo também.
Clafou
7

Não tenho certeza se isso é realmente uma solução ainda, mas descobri que substituir a string definida em "arquiteturas", que era $ (ARCHS_STANDARD_32_BIT), por "armv6 armv7" me permitiu compilar com iOS5 como base e iOS4 como implantação alvo e passar na validação.

Não estou usando nenhuma biblioteca ou chamada exclusiva do IOS5, mas pretendo usar no meu próximo lançamento.

Peter Johnson
fonte
1

Não precisei substituir $ (ARCHS_STANDARD_32_BIT) por apenas armv7 para o aplicativo compilar e ser carregado na App Store.

Conforme sugerido por MarkGranoff, eu simplesmente adicionei armv6 como texto simples, pressionando o botão de adição e apenas digitando na linha dois.

João
fonte