Erstellen von Armv6- und Armv7-Architekturen mit iOS 5

96

In iOS5 löscht Apple die armv6- Architektur aus dem ARCHS_STANDARD_32_BIT .

Um die Unterstützung für iPhone3G beizubehalten, möchte ich auch in iOS5 in armv6 kompilieren.

Hat jemand eine Lösung dafür gefunden?

iGranDav
quelle

Antworten:

96

Ich habe heute gerade etwas erstellt, das ein Bereitstellungsziel von iOS 4.0 spezifiziert. Da nur armv7 in Architectures angegeben ist, warnte mich Xcode, dass ich armv6 in Architectures einbinden muss, um alles unter iOS4.2 zu unterstützen. Bearbeiten Sie einfach dieses Feld, klicken Sie auf die Schaltfläche "+", wenn der Dialog angezeigt wird, und geben Sie das Literal "armv6" ein.

In meinem Fall möchten wir, dass unsere App unter iOS4 und iOS5 funktioniert. Wir mussten einige Änderungen vornehmen, damit es unter iOS5 korrekt funktioniert, aber all diese Änderungen wurden mit iOS4-freundlichen Codeänderungen vorgenommen.

Wir haben auch einige iOS5-spezifische Funktionen hinzugefügt, damit die App unter iOS4 ohne Absturz ausgeführt werden kann. Insbesondere haben wir die iOS5-Funktionen getestet, bevor wir versucht haben, sie zu verwenden, und nur iOS5-Bibliotheken als optional verknüpft.

Die Unterstützung von iPhone3G in einer iOS5-Welt könnte also genauso gut bedeuten: "Wir möchten, dass unsere App auf iOS4 und höher ausgeführt wird (unabhängig von der Verwendung von iOS5-Funktionen)", anstatt "Wir möchten sicherstellen, dass unsere App auf einem älteren Gerät mit iOS5 ausgeführt wird." ". Hier gibt es einen Unterschied; Denk darüber nach. :-)

Wie auch immer, das Hinzufügen von Armv6-Unterstützung ist sehr einfach. Und ich denke, der Punkt ist folgender: Irgendwann, wenn es keine armv6-Geräte mehr gibt, über die man sich Sorgen machen muss (aus welchem ​​Grund auch immer), müssen Sie nicht mehr dafür bauen. Nach Ansicht von Apple sollte jeder so schnell wie möglich auf die neueste Hardware aktualisieren. In dieser Welt müssen die Tools nicht standardmäßig auf etwas anderes als das Neueste und Beste eingestellt werden. :-) Glücklicherweise (oder auch nicht) leben wir Entwickler in der realen Welt und erkennen, dass Sie ältere Dinge für eine Weile unterstützen müssen. Und ich denke, das Xcode-Entwicklerteam weiß das auch, weshalb Sie die Unterstützung für armv6 ganz einfach wieder hinzufügen können.

Mark Granoff
quelle
3
Vielen Dank für Ihre genaue Antwort :-) In der Tat möchte ich meine App auf einem iPhone 3G mit iOS 4.2.1 oder niedriger (maximal 4.0) ausführen und einige iOS 5-spezifische Funktionen für aktuelle Geräte haben. Ich habe nicht versucht, einfach "armv6" in Architekturen hinzuzufügen. Ich habe nach einer Umgebungsvariablen wie ARCHS_STANDARD_32_BIT gesucht und gerade ARCHS_UNIVERSAL_IPHONE_OS gefunden, aber es scheint nicht zu funktionieren.
iGranDav
3
Ich wollte hinzufügen, dass viele Lösungen darauf hindeuten, dass dort "armv6 armv7" stehen sollte - das hat bei mir nicht funktioniert. Derzeit werden nur „ARMv6 $ (ARCHS_STANDARD_32_BIT)“ funktioniert für mich, was bedeutet , nicht loswerden , was da ist, fügen Sie einfach „ARMv6“ auf die Architekturen einstellen
Brack
1
Ich habe dies alles getan und mein Build schlug immer noch fehl. Grund dafür war, dass ich einen (nicht verwendeten) Release-Build auf ein Bereitstellungsziel von iOS 5.0 festgelegt hatte, während Debug und Distribution auf 3.0 festgelegt waren, und dies scheint die Xcode-Erstellung für armv6 zu stoppen. Das Problem wurde behoben, indem das Bereitstellungsziel für alle Builds auf 3.0 festgelegt wurde.
Simon East
6
Es hat bei mir nicht funktioniert (auch nach dem Hinzufügen von 'armv6'). Die App erschien nicht einmal auf meinem iPod touch. Aber dann entdeckte ich, dass 'Erforderliche Gerätefunktionen' (unter der Registerkarte "Info") armv7 enthielt. Ich habe es gerade gelöscht und es lief perfekt
Erpheus
1
Ich benutze normalerweise $ (VALID_ARCHS), was für mich funktioniert. Ich habe gerade festgestellt, dass neue Projekte auch eine Fähigkeitsanforderung 'arm7' hinzufügen. Ich habe das gerade gelöscht und alles funktioniert gut.
Gordon Dove
51

Die einfache Antwort ist, dass Sie die aktuellen Einstellungen von "Standard (armv7) - $ (ARCHS_STANDARD_32_BIT)" so ändern müssen, dass sie nur "armv6" und "armv7" sind. Siehe das Bild unten. Sie müssen die Zeile mit den vorherigen Einstellungen löschen, damit sie funktioniert.

Korrigieren Sie die Einstellungen für armv6 und armv7

adjwilli
quelle
3
Vielen Dank, dass Sie dies mit einem Bild erklärt haben - es hat es wirklich deutlich gemacht.
Radven
11

Stellen Sie außerdem sicher, dass Sie dies in Projekt UND Ziele festlegen. Es kostet mich eine Stunde, um das herauszufinden. hatte es für den einen eingestellt, aber nicht für den anderen. hoffe das hilft. GLTA

ubert
quelle
Wenn Sie über Bibliotheken verfügen, müssen Sie diese in Projekt und Zielen dort festlegen.
William Jockusch
9

Ich denke, es gibt einen Grund, warum Apple armv6 von der Standardeinstellung gestrichen hat.

Ich habe armv7 / armv6 mit iOS5 SDK kompiliert, aber der armv6-Compiler hat im Release-Modus falschen Code erzeugt. Nachdem ich stundenlang eine Problemumgehung gefunden habe (ich versuche llvm oder gcc mit verschiedenen Optimierungsstufen), gebe ich auf.

Daher gehe ich zurück zu iOS SDK 4.x, solange ich ältere armv6-Geräte unterstütze.

Beispiel für 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?)

Möglicherweise habe ich eine Speicherbeschädigung, aber auf dem armv7-Compiler und auf iOSSDK <5.0 verhält es sich wie erwartet.

Freundliche Grüße

jfieres
quelle
Ich sehe auch seltsame Fehler in armv6-Builds auf älteren Geräten. Haben Sie das herausgefunden oder sind Sie wirklich zu einem früheren XCode zurückgekehrt? Außerdem stelle ich fest, dass Sie die älteren SDKs nicht mehr herunterladen können!
Craig McMahon
19
Dies ist ein bekanntes Problem mit dem LLVM Compiler 3.0 in Xcode 4.2- und CGPoint / CGSize-Strukturen: devforums.apple.com/thread/122059?tstart=15 . Das Deaktivieren des Gebäudes für Thumb auf armv6 verhindert diese Art von Fehlern.
Brad Larson
Beeindruckend! Ich bin so froh über deine Antwort, das passiert mir auch.
Clafou
7

Ich bin mir noch nicht sicher, ob dies tatsächlich eine Lösung ist, aber ich habe festgestellt, dass das Ersetzen der definierten Zeichenfolge in "Architekturen", die $ (ARCHS_STANDARD_32_BIT) war, durch "armv6 armv7" es mir ermöglichte, mit iOS5 als Basis und iOS4 als Bereitstellung zu kompilieren Ziel und Validierung bestehen.

Ich verwende keine exklusiven IOS5-Bibliotheken oder -Aufrufe, beabsichtige dies jedoch in meiner nächsten Version.

Peter Johnson
quelle
1

Ich musste $ (ARCHS_STANDARD_32_BIT) nicht durch nur armv7 ersetzen, damit die App kompiliert und in den App Store hochgeladen werden konnte.

Wie von MarkGranoff vorgeschlagen, habe ich armv6 einfach als einfachen Text hinzugefügt, indem ich auf Plus geklickt und es einfach in Zeile zwei eingegeben habe.

Johan
quelle