Comment construire pour les architectures armv6 et armv7 avec iOS 5

96

Dans iOS5, Apple supprime l' architecture armv6 de ARCHS_STANDARD_32_BIT .

Afin de conserver le support pour iPhone3G, je souhaite toujours compiler dans armv6 même sous iOS5.

Quelqu'un a-t-il trouvé une solution à cela?

iGranDav
la source

Réponses:

96

Je viens de créer quelque chose aujourd'hui en spécifiant une cible de déploiement d'iOS 4.0. Avec seulement armv7 spécifié dans Architectures, Xcode m'a averti que pour prendre en charge tout ce qui est inférieur à iOS4.2, je devais inclure armv6 dans Architectures. Modifiez simplement ce champ, cliquez sur le bouton "+" lorsque la boîte de dialogue apparaît et entrez le littéral "armv6".

Dans mon cas, nous voulons que notre application fonctionne sous iOS4 et iOS5. Nous avons dû apporter quelques modifications pour que cela fonctionne correctement sous iOS5, mais tous ces changements ont été effectués avec des changements de code compatibles avec iOS4.

Nous avons également ajouté des fonctionnalités spécifiques à iOS5 de manière à permettre à l'application de s'exécuter sans se bloquer sous iOS4. Plus précisément, nous avons testé les capacités iOS5 avant d'essayer de les utiliser, et avons lié les bibliothèques iOS5 uniquement comme facultatif.

Ainsi, la prise en charge d'iPhone3G dans un monde iOS5 pourrait tout aussi bien signifier "nous voulons que notre application fonctionne sur iOS4 et supérieur (quelle que soit l'utilisation de toute fonctionnalité iOS5)" plutôt que "nous voulons nous assurer que notre application fonctionne sur un appareil plus ancien exécutant iOS5 ". Il y a une différence ici; Pensez-y. :-)

Quoi qu'il en soit, il est très facile d'ajouter le support armv6. Et je suppose que le point est le suivant: à un moment donné, quand il n'y a plus d'appareils armv6 à craindre (pour une raison quelconque), vous n'aurez pas à construire pour cela. Le point de vue d'Apple est que tout le monde devrait passer au matériel le plus récent dès que possible. Donc, dans ce monde, il n'est pas nécessaire que les outils par défaut soient autre chose que le dernier et le meilleur. :-) Heureusement (ou pas), nous, les développeurs, vivons dans le monde réel et reconnaissons que vous devez supporter des éléments plus anciens pendant un certain temps. Et je suppose que l'équipe de développement Xcode le sait aussi, c'est pourquoi vous pouvez ajouter le support armv6 tout simplement.

Mark Granoff
la source
3
Merci pour votre réponse précise :-) En effet, je souhaite pouvoir exécuter mon application sur un iPhone 3G avec iOS 4.2.1 ou inférieur (limité à 4.0) et avoir des fonctionnalités spécifiques à iOS 5 pour les appareils actuels. Je n'ai pas essayé d'ajouter simplement "armv6" dans les architectures, je cherchais une variable d'environnement comme ARCHS_STANDARD_32_BIT et je viens de trouver ARCHS_UNIVERSAL_IPHONE_OS mais cela ne semble pas fonctionner.
iGranDav
3
Je voulais ajouter que beaucoup de solutions suggèrent qu'il devrait dire "armv6 armv7" - cela n'a pas fonctionné pour moi. Actuellement, seul "armv6 $ (ARCHS_STANDARD_32_BIT)" fonctionne pour moi, ce qui signifie ne vous débarrassez pas de ce qu'il y a, ajoutez simplement "armv6" au paramètre Architectures
brack
1
J'ai fait tout cela et ma construction échouait toujours - la raison était que j'avais une version de version (inutilisée) définie sur une cible de déploiement d'iOS 5.0 alors que le débogage et la distribution étaient définis sur 3.0 et cela semble arrêter la construction de xcode pour armv6. La définition de la cible de déploiement sur 3.0 pour toutes les versions a résolu le problème.
Simon East
6
Cela n'a pas fonctionné pour moi (même après avoir ajouté «armv6»). L'application n'apparaît même pas sur mon iPod touch. Mais ensuite, j'ai découvert que `` Capacités de périphérique requises '' (sous l'onglet info) contenait armv7. Je viens de le supprimer et il a commencé à fonctionner parfaitement
Erpheus
1
J'utilise généralement $ (VALID_ARCHS), ce qui fonctionne pour moi. Je viens de découvrir que les nouveaux projets ajoutent également une exigence de capacité «arm7». Je viens de supprimer cela et tout fonctionne bien.
Gordon Dove
51

La réponse simple est que vous devez changer les paramètres actuels de "Standard (armv7) - $ (ARCHS_STANDARD_32_BIT)" pour être simplement "armv6" et "armv7". Voir l'image ci-dessous. Vous devez supprimer la ligne avec les paramètres précédents pour que cela fonctionne.

Corriger les paramètres pour armv6 et armv7

adjwilli
la source
3
Merci d'avoir expliqué cela avec une image - cela a vraiment été clair.
radven
11

assurez-vous également de définir cela dans Project AND Targets ... cela me coûte une heure pour le comprendre. l'avait fixé pour l'un mais pas pour l'autre. J'espère que cela t'aides. GLTA

ubert
la source
De plus, si vous avez des bibliothèques, vous devez les définir dans le projet et les cibles là-bas.
William Jockusch
9

Je pense qu'il y a une raison pour laquelle Apple a supprimé armv6 du paramètre standard.

J'ai compilé armv7 / armv6 avec le SDK iOS5, cependant, le compilateur armv6 a produit un code erroné en mode version. Après des heures à trouver une solution de contournement (en essayant llvm ou gcc avec différents niveaux d'optimisation), j'abandonne.

Donc, je reviens au SDK iOS 4.x tant que je prends en charge les anciens appareils armv6.

Exemple de code:

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

Peut-être que j'ai une certaine corruption de mémoire, cependant, sur le compilateur armv7 et sur iOSSDK <5.0, il se comporte comme prévu.

Meilleures salutations

jfieres
la source
Je vois également d'étranges bogues dans les versions armv6 sur des appareils plus anciens. Avez-vous compris cela ou êtes-vous vraiment revenu à un XCode antérieur? Je note également qu'ils ne vous permettent plus de télécharger les anciens SDK!
Craig McMahon
19
Il s'agit d'un problème connu avec le compilateur LLVM 3.0 dans les structures Xcode 4.2 et CGPoint / CGSize: devforums.apple.com/thread/122059?tstart=15 . La désactivation de la construction pour Thumb sur armv6 empêche ce type d'erreurs.
Brad Larson
Hou la la! Je suis tellement content de votre réponse, cela m'arrive aussi.
Clafou
7

Je ne sais pas si c'est encore une solution, mais j'ai découvert que le remplacement de la chaîne définie dans "architectures", qui était $ (ARCHS_STANDARD_32_BIT), par "armv6 armv7" m'a permis de compiler avec iOS5 comme base et iOS4 comme déploiement cible et passez la validation.

Je n'utilise pas de bibliothèques ou d'appels exclusifs à IOS5, mais j'ai l'intention de le faire dans ma prochaine version.

Peter Johnson
la source
1

Je n'ai pas eu besoin de remplacer $ (ARCHS_STANDARD_32_BIT) par juste armv7 pour que l'application soit compilée et téléchargée sur l'App Store.

Comme suggéré par MarkGranoff, j'ai simplement ajouté armv6 en texte brut, en appuyant sur plus et en le tapant simplement sur la ligne deux.

Johan
la source