Cómo construir para arquitecturas armv6 y armv7 con iOS 5

96

En iOS5, Apple elimina la arquitectura armv6 de ARCHS_STANDARD_32_BIT .

Para mantener el soporte para iPhone3G , todavía quiero compilar en armv6 incluso en iOS5.

¿Alguien encontró una solución para esto?

iGranDav
fuente

Respuestas:

96

Hoy acabo de construir algo que especifica un objetivo de implementación de iOS 4.0. Con solo armv7 especificado en Arquitecturas, Xcode me advirtió que para admitir cualquier cosa por debajo de iOS4.2 tenía que incluir armv6 en Arquitecturas. Simplemente edite ese campo, haga clic en el botón "+" cuando aparezca el cuadro de diálogo e ingrese el literal "armv6".

En mi caso, queremos que nuestra aplicación funcione con iOS4 e iOS5. Tuvimos que hacer algunas modificaciones para que funcionara correctamente en iOS5, pero todos esos cambios se realizaron con cambios de código compatibles con iOS4.

También agregamos algunas capacidades específicas de iOS5 de una manera que permite que la aplicación se ejecute sin fallar en iOS4. Específicamente, probamos las capacidades de iOS5 antes de intentar usarlas, y vinculamos bibliotecas exclusivas de iOS5 como Opcionales.

Por lo tanto, admitir iPhone3G en un mundo con iOS5 podría significar fácilmente "queremos que nuestra aplicación se ejecute en iOS4 y superior (independientemente del uso de funciones de iOS5)" en lugar de "queremos asegurarnos de que nuestra aplicación se ejecute en un dispositivo más antiguo con iOS5 ". Aquí hay una diferencia; Piénsalo. :-)

De todos modos, volver a agregar el soporte armv6 es muy fácil. Y supongo que el punto es este: en algún momento, cuando no haya más dispositivos armv6 de los que preocuparse (por el motivo que sea), no tendrás que construir para ello. La opinión de Apple es que todos deberían actualizarse al hardware más reciente lo antes posible. Entonces, en ese mundo, no hay necesidad de que las herramientas usen por defecto nada más que lo último y lo mejor también. :-) Afortunadamente (o no), los desarrolladores vivimos en el mundo real y reconocemos que tienes que soportar cosas más antiguas por un tiempo. Y supongo que el equipo de desarrollo de Xcode también lo sabe, por lo que puede volver a agregar el soporte armv6 de manera bastante simple.

Mark Granoff
fuente
3
Gracias por su respuesta precisa :-) De hecho, quiero poder ejecutar mi aplicación en un iPhone 3G con iOS 4.2.1 o inferior (limitado a 4.0) y tener algunas características específicas de iOS 5 para los dispositivos actuales. No intenté simplemente agregar "armv6" en arquitecturas, estaba buscando una variable de entorno como ARCHS_STANDARD_32_BIT y acabo de encontrar ARCHS_UNIVERSAL_IPHONE_OS pero no parece funcionar.
iGranDav
3
Quería agregar que muchas soluciones sugieren que debería decir "armv6 armv7"; esto no funcionó para mí. Actualmente, solo "armv6 $ (ARCHS_STANDARD_32_BIT)" funciona para mí, lo que significa que no se deshaga de lo que hay allí, simplemente agregue "armv6" a la configuración de Arquitecturas
brack
1
Hice todo esto y mi compilación seguía fallando, la razón era que tenía una compilación de lanzamiento (sin usar) configurada para un objetivo de implementación de iOS 5.0 mientras que la depuración y la distribución estaban configuradas en 3.0 y esto parece detener la compilación de xcode para armv6. Establecer el objetivo de implementación en 3.0 para todas las compilaciones solucionó el problema.
Simon East
6
No funcionó para mí (incluso después de agregar 'armv6'). La aplicación ni siquiera apareció en mi iPod touch. Pero luego descubrí que las 'Capacidades requeridas del dispositivo' (debajo de la pestaña de información) tenían armv7. Lo acabo de borrar y comenzó a funcionar perfectamente
Erpheus
1
Generalmente uso $ (VALID_ARCHS), que funciona para mí. Acabo de descubrir que los nuevos proyectos también agregan un requisito de capacidad 'arm7'. Acabo de borrar eso y todo funciona bien.
Gordon Dove
51

La respuesta simple es que tiene que cambiar la configuración actual de "Estándar (armv7) - $ (ARCHS_STANDARD_32_BIT)" para que sea simplemente "armv6" y "armv7". Vea la imagen a continuación. Tienes que eliminar la línea con la configuración anterior para que funcione.

Ajustes correctos para armv6 y armv7

adjwilli
fuente
3
Gracias por explicar esto con una imagen, realmente lo dejó claro.
Radven
11

también asegúrese de configurar esto en Proyecto Y Objetivos ... me costó una hora averiguarlo. lo había establecido para uno pero no para el otro. espero que esto ayude. GLTA

ubert
fuente
Además, si tiene alguna biblioteca, debe configurarla en el proyecto y los destinos allí.
William Jockusch
9

Creo que hay una razón por la que Apple eliminó armv6 de la configuración estándar.

He compilado armv7 / armv6 con iOS5 SDK, sin embargo, el compilador armv6 produjo un código incorrecto en el modo de lanzamiento. Después de horas de encontrar una solución alternativa (probando llvm o gcc con diferentes niveles de optimización) me rindo.

Por lo tanto, volveré a iOS SDK 4.x siempre que sea compatible con dispositivos armv6 más antiguos.

Ejemplo 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?)

Tal vez tenga algo de corrupción de memoria, sin embargo, en el compilador armv7 y en iOSSDK <5.0 se comporta como se esperaba.

Atentamente

jfieres
fuente
También veo errores extraños en las compilaciones de armv6 en dispositivos más antiguos. ¿Resolviste esto o realmente volviste a un XCode anterior? ¡También observo que ya no te permiten descargar los SDK más antiguos!
Craig McMahon
19
Este es un problema conocido con LLVM Compiler 3.0 en Xcode 4.2 y estructuras CGPoint / CGSize: devforums.apple.com/thread/122059?tstart=15 . Deshabilitar la construcción de Thumb en armv6 evita este tipo de errores.
Brad Larson
¡Guauu! Me alegro mucho por tu respuesta, esto también me está sucediendo.
Clafou
7

No estoy seguro de si esto es realmente una solución todavía, pero he descubierto que reemplazar la cadena definida en "arquitecturas", que era $ (ARCHS_STANDARD_32_BIT), con "armv6 armv7" me permitió compilar con iOS5 como base e iOS4 como implementación. objetivo y pasar la validación.

No estoy usando bibliotecas o llamadas exclusivas de IOS5, pero tengo la intención de hacerlo en mi próxima versión.

Peter Johnson
fuente
1

No necesitaba reemplazar $ (ARCHS_STANDARD_32_BIT) con solo armv7 para que la aplicación se compilara y se cargara en la App Store.

Como sugirió MarkGranoff, simplemente agregué armv6 como texto sin formato, presionando más y simplemente escribiéndolo en la línea dos.

Johan
fuente