UIRequiredDeviceCapabilities armv6 and armv7 - iphone

I snapshot my settings below. In my project settings, i am targeting arm6 and 7. Does this mean i need to include both armv6 and armv7 keys even though the descriptions by apple state "is compiled only for the armv6 instruction set":
armv6
Include this key if your application is compiled only for the armv6 instruction set. (iOS v3.1 and later.)
armv7
Include this key if your application is compiled only for the armv7 instruction set. (iOS v3.1 and later.)

No, as you're compiling for both architectures, you don't require either of them. You would only include the requirement if you compiled for just one architecture.

In xCode 4.2 it is not possible to switch the Architecture to armv6, Standard is armv7 and cannot be changed. I'm not sure whether the "armv6 armv7" value in the field "Valid Architectures" is enough for supporting all devices. Therefore I included the (array-)string value "armv6" as described by peterept in the key "UIRequiredDevicesCapabilities". I hope that like that my app will be compatible with all (iPhone) devices.
Other experiences? Cheers.

Related

Is ARMV7s mandatory for app store publication?

I noticed that our application had became much bigger lately, partially due to the presence of multiple binaries.
I understand arm64 is now mandatory, and armv7 mandatory to support older models, but what about armv7s ? Can I safely remove it from my app, thus making it a few Mo lighter ?
You can remove armv7s. armv7 and arm64 are enough. In fact, in Xcode 6.2 these are now the Standard architectures. If that's not an endorsement, I don't know what is.

Can Xcode's 'Architecture' and 'Valid Architectures' exclude armv6 devices from downloading the app?

We recently set the minimum iOS support to 4.0 and started using the LLVM compiler for a new update of a current available app.
Will setting 'Architecture' and 'Valid Architectures' to only armv7 exclude armv6 devices such as iPhone 3G from downloading the update?
I have tried with UIRequiredDeviceCapabilities but Apple does not let you set this for app updates, only for new apps, which is unfortunate.
We also don't have access to an armv6 device to test the app as I have read reports that the new compiler might cause some issues with this older architecture, thus we want to exclude armv6 from updating the app as we still have a small number of users running on armv6.
Just set the minimum required OS to iOS 4.3. That will exclude all armv6 devices as Apple dropped armv6 in iOS 4.3.

Any defect if using armv6 ONLY in Xcode 4.2 to support both old and new devices?

I'm developing an app supporting since iOS 3.0. With Xcode 4.2, I have to add armv6 manually to Architectures. So is armv7 optimized for new devices the only advantage to compile with "armv6 armv7"? The size will be bigger than with only armv6 ?
Using only armv6 is not optimal - but it will work on older iOS devices (i.e. no defect).
An alternative is to provide both armv6 and armv7 binaries so newer devices will use the armv7 code. Of course that will double the size of the application code. It might be worth it depending on your application (e.g. if speed is an issue) but it will not affect compatibility.

With an ARMv6 only build to I need to include UIRequiredDeviceCapabilities: armv6?

I am building ARMv6 only (to keep the app size down), and it all runs fine on all iPhones/iPads.
My question is, when I submit it to AppStore, do I need or not need to update UIRequiredDeviceCapabilities to say it is an Armv6 build?
The docs here:
http://developer.apple.com/library/ios/#documentation/General/Reference/InfoPlistKeyReference/Articles/iPhoneOSKeys.html
say:
armv6: Include this key if your application is compiled only for the armv6 instruction set. (iOS v3.1 and later.)
BUT, does this mean if I include this key it will only work on ARMv6 platforms (eg: iPhone 3G) or does it just mean only ARMv6 code is in this app, but all phones compatible with that will still work?
Any help appreciated, I don't want to wait for the usual rejection.
Thanks,
Peter
If you include the armv6 key, your application will still work on armv7 devices like the iPad and iPhone 4. As far as I know, the original iPhone is armv6 as well, so there's no hardware restriction imposed by adding that key at all. It just means that any version of iOS which doesn't support the armv6 instruction set will not be able to download your app (pre-iOS 3.1, as they mentioned).
In xCode 4.2 it is possible to switch the Architecture to support armv6 manually, Standard is armv7. Just select it under Architecture, select other, delete existing one and add manually armv6 and armv7.
When I removed the complete "UIRequiredDevicesCapabilities" out of the source code view of my .plist file and switched back to the summary view of my project, xcode crashed and the whole project became unusable. After doing the same using the "Property List" view did not cause the same problem.

XCode 4.2. issue: Standard (armv7)

I want to update my app in the App Store but when I try to upload it I get an error that armv6 is not supported in my app. The problem is I cannot even choose Armv6 as an Architecture.
I have the following Architecture settings:
Architectures: Standard (armv7)
Base SDK: Latest iOS (iOS 5.0)
Build Active Architecture Only : NO
Valid Architectures : armv6 armv7 armv7f armv7k
I thought because of 3 and 4 everything is set right.
I can NOT change 1 for something else.
What can I do?
It's better to downgrade back to stable version of SDK for Distribution builds. Apple even wrote about that in previous beta builds notes.
I partially fixed that problem by setting Architecture to "armv6 armv7". After that i could build universal binary, but simulator builds is broken. :)
The way we fixed ours was to go into the target build settings, select the Architectures list and select other... Then hit the "+" button to add your own called "armv6" without the quotes. Hit done, clean targets and archive.
Keep in mind that nothing needs to be "selected" in the Architectures list. It is only a list of architectures supported and should contain just two entries.
this is the best solution, yeahhh!
Select a "Architectures: Standard (armv7)"
Select a "Other..."
Select a "+" button
add a "armv6"
select a "Done"
Some back story for everyone seeing duplicate symbol errors and/or warnings about armv6 is missing.
armv6 is required if your apps supports deployment targets below iOS 4.3.
The latest Xcode 4.2 by default has architecture = $(ARCHS_STANDARD_32_BIT) which maps to armv7.
Xcode 4.1 has the same env variable, but it map to armv6 and armv7.
Doing a armv6+armv7 in Xcode 4.2 requires some trickery...
A) add in "armv6" to the list of Architectures. However this breaks builds for Xcode 4.1 since "armv6" + $(ARCHS_STANDARD_32_BIT) = armv6 armv6 armv7 -> duplicate symbol errors
B) use the variable $(VALID_ARCHS) which maps to armv6 armv6 (and i386 for simulator builds)
Remove all architecture from xcode then it will take arm v6 and arm v7.
Select a "Architectures: Standard (armv7)"
Select a "Other..."
Select a "+" button
add a "armv6"
select a "Done"
Good luck
Remove environment variable $(ARCHS_STANDARD_32_BIT) from Architectures setting.
The add "armv6" and "armv7" to the list of Architectures.
If you're building your own libs - they need to have those settings too.