Cara membangun arsitektur armv6 dan armv7 dengan iOS 5

96

Di iOS5 Apple menjatuhkan arsitektur armv6 dari ARCHS_STANDARD_32_BIT .

Untuk menjaga dukungan untuk iPhone3G saya masih ingin mengkompilasi di armv6 bahkan di iOS5.

Adakah yang menemukan solusi untuk ini?

iGranDav
sumber

Jawaban:

96

Saya baru saja membuat sesuatu hari ini dengan menentukan target penerapan iOS 4.0. Dengan hanya armv7 yang ditentukan dalam Arsitektur, Xcode memperingatkan saya bahwa untuk mendukung apa pun di bawah iOS4.2 saya harus menyertakan armv6 dalam Arsitektur. Cukup edit bidang itu, klik tombol "+" saat dialog muncul dan masukkan "armv6" literal.

Dalam kasus saya, kami ingin aplikasi kami berfungsi di bawah iOS4 dan iOS5. Kami harus membuat beberapa modifikasi sehingga akan berfungsi dengan benar di bawah iOS5, tetapi semua perubahan itu dilakukan dengan perubahan kode yang ramah iOS4.

Kami juga menambahkan beberapa kemampuan khusus iOS5 dengan cara yang memungkinkan aplikasi berjalan tanpa mogok di iOS4. Secara khusus, kami menguji kemampuan iOS5 sebelum mencoba menggunakannya, dan menautkan pustaka khusus iOS5 sebagai Opsional.

Jadi, mendukung iPhone3G di dunia iOS5 bisa dengan mudah berarti "kami ingin aplikasi kami berjalan di iOS4 dan di atasnya (terlepas dari penggunaan fitur iOS5)" daripada "kami ingin memastikan aplikasi kami berjalan di perangkat lama yang menjalankan iOS5 ". Ada perbedaan di sini; Pikirkan tentang itu. :-)

Bagaimanapun, menambahkan kembali dukungan armv6 sangat mudah. Dan saya kira intinya adalah ini: Pada titik tertentu, ketika tidak ada lagi perangkat armv6 di luar sana yang perlu dikhawatirkan (untuk alasan apa pun) Anda tidak perlu membuatnya untuk itu. Pandangan Apple adalah setiap orang harus meningkatkan ke perangkat keras terbaru secepat mungkin. Jadi di dunia itu, tidak perlu alat untuk default ke apa pun kecuali yang terbaru dan terhebat juga. :-) Untungnya (atau tidak), kami para pengembang hidup di dunia nyata dan menyadari bahwa Anda harus mendukung hal-hal lama untuk sementara waktu. Dan saya kira tim pengembang Xcode juga mengetahui hal ini, itulah sebabnya Anda dapat menambahkan kembali dukungan armv6 dengan cukup sederhana.

Mark Granoff
sumber
3
Terima kasih atas jawaban tepat Anda :-) Memang saya ingin dapat menjalankan aplikasi saya di iPhone 3G dengan iOS 4.2.1 atau lebih rendah (terbatas pada 4.0) dan memiliki beberapa fitur khusus iOS 5 untuk perangkat saat ini. Saya tidak mencoba hanya dengan menambahkan "armv6" dalam arsitektur, saya sedang mencari variabel lingkungan seperti ARCHS_STANDARD_32_BIT dan saya baru saja menemukan ARCHS_UNIVERSAL_IPHONE_OS tetapi tampaknya tidak berhasil.
iGranDav
3
Ingin menambahkan bahwa banyak solusi di luar sana menyarankan bahwa itu harus mengatakan "armv6 armv7" - ini tidak berhasil untuk saya. Saat ini hanya "armv6 $ (ARCHS_STANDARD_32_BIT)" yang berfungsi untuk saya, artinya jangan singkirkan apa yang ada di sana, cukup tambahkan "armv6" ke pengaturan Arsitektur
tanda kurung
1
Saya melakukan semua ini dan build saya masih gagal - alasannya adalah saya memiliki build Rilis (tidak terpakai) yang disetel ke Target Penerapan iOS 5.0 sementara Debug dan Distribusi disetel ke 3.0 dan ini tampaknya menghentikan pembuatan xcode untuk armv6. Menetapkan target Deployment ke 3.0 untuk semua build memperbaiki masalah tersebut.
Simon East
6
Itu tidak berhasil untuk saya (bahkan setelah menambahkan 'armv6'). Aplikasi itu bahkan tidak muncul di iPod touch saya. Tetapi kemudian saya menemukan bahwa 'Kemampuan Perangkat yang Diperlukan' (di bawah tab info) memiliki armv7 di dalamnya. Saya baru saja menghapusnya dan mulai berjalan dengan sempurna
Erpheus
1
Saya biasanya menggunakan $ (VALID_ARCHS), yang cocok untuk saya. Saya baru saja menemukan bahwa proyek baru juga menambahkan persyaratan kemampuan 'arm7'. Saya baru saja menghapusnya dan semuanya berfungsi dengan baik.
Gordon Dove
51

Jawaban sederhananya adalah Anda harus mengubah pengaturan saat ini dari "Standar (armv7) - $ (ARCHS_STANDARD_32_BIT)" menjadi "armv6" dan "armv7". Lihat gambar di bawah. Anda harus menghapus baris dengan pengaturan sebelumnya agar berfungsi.

Pengaturan yang benar untuk armv6 dan armv7

adjwilli
sumber
3
Terima kasih telah menjelaskan ini dengan gambar - itu benar-benar membuatnya jelas.
radven
11

juga pastikan Anda menetapkan ini di Proyek DAN Target ... saya butuh waktu satu jam untuk mengetahuinya. telah mengaturnya untuk satu tapi tidak untuk yang lain. semoga ini membantu. GLTA

ubert
sumber
Juga, jika Anda memiliki pustaka apa pun, Anda harus mengaturnya dalam proyek dan target di sana.
William Jockusch
9

Saya pikir ada alasan mengapa Apple menjatuhkan armv6 dari pengaturan standar.

Saya telah mengkompilasi armv7 / armv6 dengan iOS5 SDK, namun, compiler armv6 menghasilkan kode yang salah dalam mode rilis. Setelah berjam-jam menemukan solusi (mencoba llvm atau gcc dengan tingkat pengoptimalan yang berbeda) saya menyerah.

Jadi, saya akan kembali ke iOS SDK 4.x selama saya mendukung perangkat armv6 yang lebih lama.

Contoh kode:

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

Mungkin saya mengalami kerusakan memori, namun, pada kompiler armv7 dan pada iOSSDK <5.0 itu berperilaku seperti yang diharapkan.

salam Hormat

jfieres
sumber
Saya juga melihat bug aneh di armv6 yang dibangun di perangkat lama. Apakah Anda mengetahui hal ini, atau benar-benar kembali ke Xcode sebelumnya? Juga saya perhatikan bahwa mereka tidak mengizinkan Anda mengunduh SDK yang lebih lama lagi!
Craig McMahon
19
Ini adalah masalah yang diketahui dengan LLVM Compiler 3.0 di Xcode 4.2 dan struct CGPoint / CGSize: devforums.apple.com/thread/122059?tstart=15 . Menonaktifkan pembuatan untuk Thumb di armv6 akan mencegah jenis kesalahan ini.
Brad Larson
Wow! Saya sangat senang atas jawaban Anda, ini juga terjadi pada saya.
Clafou
7

Belum yakin apakah ini sebenarnya adalah solusi, tetapi saya telah menemukan bahwa mengganti string yang ditentukan dalam "arsitektur", yaitu $ (ARCHS_STANDARD_32_BIT), dengan "armv6 armv7" memungkinkan saya untuk mengompilasi dengan iOS5 sebagai basis dan iOS4 sebagai penerapan target, dan lulus validasi.

Saya tidak menggunakan pustaka atau panggilan eksklusif IOS5, tetapi bermaksud untuk itu di rilis berikutnya.

Peter Johnson
sumber
1

Saya tidak perlu mengganti $ (ARCHS_STANDARD_32_BIT) hanya dengan armv7 agar aplikasi dapat dikompilasi dan diunggah ke App Store.

Seperti yang disarankan oleh MarkGranoff, saya hanya menambahkan armv6 sebagai teks biasa, dengan menekan plus dan hanya mengetiknya di baris dua.

Johan
sumber