ในiOS5แอปเปิ้ลหยดARMv6สถาปัตยกรรมจากARCHS_STANDARD_32_BIT
เพื่อให้การสนับสนุนiPhone3Gฉันยังคงต้องการรวบรวมในarmv6แม้ใน iOS5
มีใครหาวิธีแก้ปัญหานี้ไหม
ในiOS5แอปเปิ้ลหยดARMv6สถาปัตยกรรมจากARCHS_STANDARD_32_BIT
เพื่อให้การสนับสนุนiPhone3Gฉันยังคงต้องการรวบรวมในarmv6แม้ใน iOS5
มีใครหาวิธีแก้ปัญหานี้ไหม
คำตอบ:
วันนี้ฉันเพิ่งสร้างบางสิ่งบางอย่างโดยระบุเป้าหมายการปรับใช้ iOS 4.0 ด้วยเฉพาะ armv7 ที่ระบุไว้ในสถาปัตยกรรม Xcode เตือนฉันว่าเพื่อรองรับสิ่งที่ต่ำกว่า iOS4.2 ฉันต้องรวม armv6 ไว้ในสถาปัตยกรรม เพียงแก้ไขช่องนั้นคลิกปุ่ม "+" เมื่อกล่องโต้ตอบปรากฏขึ้นและป้อน "armv6" ตามตัวอักษร
ในกรณีของฉันเราต้องการให้แอปของเราทำงานภายใต้ iOS4 และ iOS5 เราต้องทำการปรับเปลี่ยนบางอย่างเพื่อให้มันทำงานได้อย่างถูกต้องภายใต้ iOS5 แต่การเปลี่ยนแปลงทั้งหมดนั้นทำได้ด้วยการเปลี่ยนแปลงโค้ดที่เป็นมิตรกับ iOS4
นอกจากนี้เรายังเพิ่มความสามารถเฉพาะของ iOS5 ในลักษณะที่ทำให้แอปทำงานได้โดยไม่หยุดทำงานภายใต้ iOS4 โดยเฉพาะอย่างยิ่งเราได้ทดสอบความสามารถของ iOS5 ก่อนที่จะลองใช้งานและเชื่อมโยงไลบรารี iOS5 เท่านั้นเป็นตัวเลือก
ดังนั้นการรองรับ iPhone3G ในโลก iOS5 อาจหมายความว่า "เราต้องการให้แอปของเราทำงานบน iOS4 ขึ้นไป (ไม่ว่าจะใช้ฟีเจอร์ iOS5 ใดก็ตาม)" แทนที่จะเป็น "เราต้องการให้แอปของเราทำงานบนอุปกรณ์รุ่นเก่าที่ใช้ iOS5 ". มีความแตกต่างที่นี่ ลองคิดดู :-)
อย่างไรก็ตามการเพิ่มการสนับสนุน armv6 กลับเข้ามานั้นง่ายมาก และฉันเดาว่าประเด็นก็คือเมื่อถึงจุดหนึ่งเมื่อไม่มีอุปกรณ์ armv6 อีกต่อไปให้ต้องกังวล (ไม่ว่าด้วยเหตุผลใดก็ตาม) คุณจะไม่ต้องสร้างมันขึ้นมา มุมมองของ Apple คือทุกคนควรอัปเกรดเป็นฮาร์ดแวร์รุ่นล่าสุดโดยเร็วที่สุด ดังนั้นในโลกนั้นจึงไม่จำเป็นต้องมีเครื่องมือใด ๆ ที่จะต้องใช้ค่าเริ่มต้นใด ๆ นอกจากสิ่งใหม่ล่าสุดและยิ่งใหญ่ที่สุดเช่นกัน :-) โชคดี (หรือเปล่า) นักพัฒนาของเราอาศัยอยู่ในโลกแห่งความเป็นจริงและตระหนักดีว่าคุณต้องสนับสนุนสิ่งที่เก่ากว่าสักพัก และฉันเดาว่าทีม Xcode dev ก็รู้เรื่องนี้เช่นกันนั่นคือเหตุผลที่คุณสามารถเพิ่มการสนับสนุน armv6 กลับได้อย่างง่ายดาย
คำตอบง่ายๆคือคุณต้องเปลี่ยนการตั้งค่าปัจจุบันจาก "Standard (armv7) - $ (ARCHS_STANDARD_32_BIT)" ให้เป็น "armv6" และ "armv7" ดูภาพด้านล่าง คุณต้องลบบรรทัดที่มีการตั้งค่าก่อนหน้านี้เพื่อให้ใช้งานได้
ตรวจสอบให้แน่ใจว่าคุณได้ตั้งค่านี้ในโครงการและเป้าหมาย ... ฉันเสียเวลาหนึ่งชั่วโมงในการคิดออก ได้ตั้งค่าไว้สำหรับหนึ่ง แต่ไม่ใช่อีกอัน หวังว่านี่จะช่วยได้ GLTA
ฉันคิดว่ามีเหตุผลที่ Apple ทิ้ง armv6 จากค่ามาตรฐาน
ฉันได้รวบรวม armv7 / armv6 ด้วย iOS5 SDK แล้วอย่างไรก็ตามคอมไพเลอร์ armv6 สร้างรหัสผิดในโหมดเผยแพร่ หลังจากผ่านไปหลายชั่วโมงในการค้นหาวิธีแก้ปัญหา (ลองใช้ llvm หรือ gcc ด้วยระดับการเพิ่มประสิทธิภาพที่แตกต่างกัน) ฉันยอมแพ้
ดังนั้นฉันจะกลับไปใช้ iOS SDK 4.x ตราบใดที่ฉันรองรับอุปกรณ์ armv6 รุ่นเก่า
ตัวอย่างรหัส:
// 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?)
บางทีฉันอาจมีความเสียหายของหน่วยความจำอย่างไรก็ตามในคอมไพเลอร์ armv7 และบน iOSSDK <5.0 จะทำงานตามที่คาดไว้
ขอแสดงความนับถืออย่างสูง
ไม่แน่ใจว่านี่เป็นวิธีแก้ปัญหาจริงหรือไม่ แต่ฉันได้ค้นพบว่าการแทนที่สตริงที่กำหนดใน "สถาปัตยกรรม" ซึ่งเป็น $ (ARCHS_STANDARD_32_BIT) ด้วย "armv6 armv7" ทำให้ฉันสามารถคอมไพล์โดยใช้ iOS5 เป็นฐานและ iOS4 เป็นการปรับใช้ เป้าหมายและผ่านการตรวจสอบความถูกต้อง
ฉันไม่ได้ใช้ไลบรารีหรือการโทรพิเศษเฉพาะ IOS5 แต่ตั้งใจจะใช้ในรุ่นถัดไป
ฉันไม่จำเป็นต้องแทนที่ $ (ARCHS_STANDARD_32_BIT) ด้วย armv7 เพื่อให้แอปรวบรวมและอัปโหลดไปยัง App Store
ตามที่ MarkGranoff แนะนำฉันเพียงแค่เพิ่ม armv6 เป็นข้อความธรรมดาโดยการกดปุ่มบวกแล้วพิมพ์ในบรรทัดที่สอง