Jak budować dla architektur armv6 i armv7 z iOS 5


96

W iOS5 Apple usuwa architekturę armv6 z ARCHS_STANDARD_32_BIT .

Aby zachować wsparcie dla iPhone3G , nadal chcę kompilować w armv6 nawet w iOS5.

Czy ktoś znalazł na to rozwiązanie?

Odpowiedzi:


96

Właśnie dzisiaj stworzyłem coś, określając cel wdrożenia iOS 4.0. Ponieważ w Architectures określono tylko armv7, Xcode ostrzegł mnie, że aby obsługiwać wszystko poniżej iOS4.2, muszę dołączyć armv6 do architektur. Po prostu edytuj to pole, kliknij przycisk „+”, gdy pojawi się okno dialogowe i wprowadź literał „armv6”.

W moim przypadku chcemy, aby nasza aplikacja działała pod iOS4 i iOS5. Musieliśmy wprowadzić pewne modyfikacje, aby działał poprawnie pod iOS5, ale wszystkie te zmiany zostały wprowadzone za pomocą zmian w kodzie przyjaznych dla iOS4.

Dodaliśmy również pewne funkcje specyficzne dla iOS5 w sposób, który pozwala aplikacji działać bez awarii pod iOS4. W szczególności przetestowaliśmy możliwości systemu iOS5 przed próbą ich użycia i połączyliśmy biblioteki tylko dla iOS5 jako opcjonalne.

Tak więc obsługa iPhone3G w świecie iOS5 może równie łatwo oznaczać „chcemy, aby nasza aplikacja działała na iOS4 i nowszych wersjach (bez względu na jakąkolwiek funkcję iOS5)”, a nie „chcemy się upewnić, że nasza aplikacja działa na starszym urządzeniu z systemem iOS5 ”. Tutaj jest różnica; Pomyśl o tym. :-)

W każdym razie dodanie obsługi armv6 z powrotem jest bardzo łatwe. I myślę, że chodzi o to: w pewnym momencie, gdy nie ma już urządzeń armv6, o które można się martwić (z jakiegokolwiek powodu), nie będziesz musiał ich budować. Apple uważa, że ​​każdy powinien jak najszybciej zaktualizować sprzęt do najnowszego. Tak więc w tym świecie nie ma potrzeby, aby narzędzia domyślnie ustawiały się na cokolwiek poza najnowszymi i najlepszymi. :-) Na szczęście (lub nie) my, programiści, żyjemy w prawdziwym świecie i zdajemy sobie sprawę, że przez jakiś czas trzeba wspierać starsze rzeczy. Wydaje mi się, że zespół programistów Xcode też o tym wie, dlatego po prostu możesz dodać obsługę armv6 z powrotem.


3
Dziękuję za dokładną odpowiedź :-) Rzeczywiście, chcę mieć możliwość uruchomienia mojej aplikacji na iPhonie 3G z iOS 4.2.1 lub starszym (ograniczenie do 4.0) i mieć pewne specyficzne funkcje iOS 5 dla obecnych urządzeń. Nie próbowałem po prostu dodawać "armv6" w architekturach, szukałem zmiennej środowiskowej, takiej jak ARCHS_STANDARD_32_BIT i właśnie znalazłem ARCHS_UNIVERSAL_IPHONE_OS, ale wydaje się, że nie działa.
iGranDav

3
Chciałem dodać, że wiele dostępnych rozwiązań sugeruje, że powinno być napisane „armv6 armv7” - to nie działa dla mnie. Obecnie działa tylko „armv6 $ (ARCHS_STANDARD_32_BIT)”, co oznacza, że ​​nie należy pozbywać się tego, co tam jest, wystarczy dodać „armv6” do ustawienia Architektury
nawias

1
Zrobiłem to wszystko i moja kompilacja nadal zawodziła - powodem było to, że miałem (nieużywaną) kompilację wydania ustawioną na cel wdrożenia systemu iOS 5.0, podczas gdy debugowanie i dystrybucja były ustawione na 3.0 i wydaje się, że zatrzymało to budowanie xcode dla armv6. Ustawienie celu wdrożenia na 3,0 dla wszystkich kompilacji rozwiązało problem.
Simon East

6
U mnie nie działało (nawet po dodaniu „armv6”). Aplikacja nie pojawiła się nawet na moim iPodzie touch. Ale potem odkryłem, że „Wymagane możliwości urządzenia” (pod zakładką informacji) zawierało armv7. Właśnie go
usunąłem

1
Zwykle używam $ (VALID_ARCHS), który działa dla mnie. Właśnie odkryłem, że nowe projekty dodają również wymaganie dotyczące zdolności „arm7”. Właśnie to usunąłem i wszystko działa dobrze.
Gordon Dove

51

Prosta odpowiedź jest taka, że ​​musisz zmienić bieżące ustawienia z „Standard (armv7) - $ (ARCHS_STANDARD_32_BIT)” na „armv6” i „armv7”. Zobacz obrazek poniżej. Musisz usunąć linię z poprzednimi ustawieniami, aby działała.

Prawidłowe ustawienia dla armv6 i armv7


3
Dziękuję za wyjaśnienie tego za pomocą obrazu - to naprawdę było jasne.
radven

11

upewnij się również, że ustawiłeś to w Project AND Targets ... kosztowało mnie to godzinę, aby to rozgryźć. ustawił to dla jednego, ale nie dla drugiego. mam nadzieję że to pomoże. GLTA


Ponadto, jeśli masz jakieś biblioteki, musisz ustawić je w projekcie i tam w celach.
William Jockusch,

9

Myślę, że jest powód, dla którego Apple usunął armv6 ze standardowego ustawienia.

Skompilowałem armv7 / armv6 z iOS5 SDK, jednak kompilator armv6 wygenerował zły kod w trybie wydania. Po godzinach szukania obejścia (wypróbowanie llvm lub gcc z różnymi poziomami optymalizacji) poddaję się.

Więc wracam do iOS SDK 4.x, o ile obsługuję starsze urządzenia armv6.

Przykład kodu:

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

Może mam jakieś uszkodzenie pamięci, jednak na kompilatorze armv7 i na iOSSDK <5.0 zachowuje się zgodnie z oczekiwaniami.

Z poważaniem


Widzę również dziwne błędy w kompilacjach armv6 na starszych urządzeniach. Rozgryzłeś to, czy naprawdę wróciłeś do wcześniejszego XCode? Zwracam też uwagę, że nie pozwalają już na pobieranie starszych SDK!
Craig McMahon

19
Jest to znany problem z kompilatorem LLVM 3.0 w Xcode 4.2 i strukturach CGPoint / CGSize: devforums.apple.com/thread/122059?tstart=15 . Wyłączenie kompilacji dla Thumb w armv6 zapobiega tego rodzaju błędom.
Brad Larson

Łał! Tak się cieszę z twojej odpowiedzi, to też się ze mną dzieje.
Clafou

7

Nie jestem pewien, czy jest to jeszcze rozwiązanie, ale odkryłem, że zastąpienie zdefiniowanego ciągu znaków w „architekturach”, czyli $ (ARCHS_STANDARD_32_BIT), na „armv6 armv7”, pozwoliło mi skompilować się z iOS5 jako bazą i iOS4 jako wdrożeniem docelowy i pozytywny.

Nie używam żadnych bibliotek ani wywołań wyłącznie dla IOS5, ale zamierzam to zrobić w mojej następnej wersji.


1

Nie musiałem zamieniać $ (ARCHS_STANDARD_32_BIT) tylko na armv7, aby aplikacja mogła się skompilować i przesłać do App Store.

Jak zasugerował MarkGranoff, po prostu dodałem armv6 jako zwykły tekst, naciskając plus i po prostu wpisując go w drugim wierszu.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.