I want to limit my universal-build app to iPhone4 / iPad, and I've set UIRequiredDeviceCapabilities to include "armv7", accordingly. In the build settings I've set:
"Architectures" = "Optimized (armv7)"
"Valid Architectures" = "armv7"
But the Release and Distribution builds of my universal app are generating this warning:
warning: iPhone apps should include an armv6 architecture (current ARCHS = "armv7")
Is this even a real problem? Can I safely ignore the warning? Why doesn't my debug build exhibit the same warning - the build config has the same settings?
I'm building with XCode 3.2.5, 4.2 SDK.
Similar to this question, but not quite:
"Warning: iPhone apps should include an armv6 architecture" even with build config set
I was having the same issue. I set the project settings accordingly but was still getting the error when building the Release version. I had to edit the Target settings and found that 'Build Active Architecture Only' was checked for the Release configuration. Unchecking it resolved the warning. I hope this helps someone.
Build Active Architecture only is really best used just for debug and simulator builds.
The iOS deployment target version is what determines the required architectures. iOS 4.2 and earlier included support for armv6 processors; therefore Xcode wants you to build for that architecture for builds that might be distributed.
If you really don't want armv6 code, and understand that the app store will reject your app if it targets iOS 4.2 or earlier and does not have armv6, then I'd suggest just changing the "Architectures" setting in the target to armv7 only.
You can stay with arm7 only if you want, but if you want to limit to iPhone 4 / iPad it's because you have a good reason ? To limit to devices you need to use UIRequiredDeviceCapabilities in your Info.plist, otherwise people with previous iPhone will find your app and it will not work.
PS: It's not easy to find a device capability for both iPad and iPhone, you can for example said that you want devices with a front facing camera but this will limit to iPhone 4 and iPad 2 (and not iPad 1)
Related
This problem has been driving us nuts for some time. We have applications, all built with Titanium (I'm mentioning this because I'm not 100% sure that the problem doesn't come from there). The applications are up on the store, we updated them a few times since the every launch.
Right now, they supports armv6 and armv7.
For the next update, we want to add support for the iphone 5, which means that we have to drop support for armv6. Which is absolutly fine. We also don't mind setting the minimum OS version to 4.3.
So we changed the build settings in xcode to armv7 armv7s, set the minimum os to 4.3, added the retina screens and so one, builded the app. We left everything else as it were. When we try to validate the app, we get this message :
this bundle does not support one or more of the devices that were supported in the previous bundle for this app
With a link to the apple manual page : http://developer.apple.com/library/ios/#qa/qa1623/_index.html
Which told us that the error might be because :
When you see this error message, you have changed the "Targeted Device Family" build setting (which modifies the UIDeviceFamily info.plist key.)"
But we did not.
Also, a few line below (in Targeting the latest iOS):
For example, if your app is no longer built with armv6, you should not add armv7 to your UIRequiredDeviceCapabilities. This may cause Xcode or iTunes Connect to erroneously reject your update.
Of course, we did not do that.
We even tried to make to change the app version to the next major one, as someone stated it solved it.
Has anyone a clue on how we remove armv6 support for good ? The only solution we found would be to delete the application and recreate it with only armv7 this time. This, of course, would not be acceptable as we would lose comments, ratings and so on.
Did you remove armv6 from both the 'Architectures' and the 'Valid Architectures' setting?
Ok I manage to get it to work and now I'm wondering what went wrong when we tried the first times. Here is what I finaly did (nothing more):
took the current version in Titanium
Cleaned it up
set the version in Titanium to the next major one (2.0 in our case)
reseted environment to use xcode 4.5 (it was already the case, but I was willing to be on the safe side)
builded the package through publish, with the SDK set to 6.0
The build process confirmed that this was ok ([INFO] Minimum iOS version: 4.3 linked iOS Version 6.0)
Once done, validated the package in xcode and uploaded it
And here are all the things I did not do this time:
Changed anything in the info.plist
Changed anything in the build architectures
actually anything in xcode except validate and upload
I am using Xcode 4.2 to develop my apps. My current ongoing project is set to run on ios4.2, but i only have a iPhone 3G (not 'S') to test my app. The problem is that when i try to run my app in my device, xcode says it was compiled and running on device but the app doenst even install in my iPhone.
I have read on other posts that i have to change the armvX configuration, so how do I do that in order for my app to run in a iPhone 3G?
Thanks.
This is a hardware issue rather than an iOS version issue.
In the Architectures section of your build configuration it probably just says armv7.
You need it so have two entries, armv6 and armv7. Select Other from the architectures menu then delete the default then add two new entries, one that just says armv6, on that just says armv7.
This creates a fat binary (essentially two binaries) which will contain the v6 code the 3G needs.
Go to the project view. (Short cut key: Command-1)
Select the project to see its summary.
Under iOS Application Target, there should be a Deployment Target.
Select the version 3.1.3 or whatever the desired minimum version.
I dont have my Mac in front of me but i believe in the Target settings for the project
(click on the project in Xcode and under targets select your project name)
In the settings there you will see it more then liekly saying armv7 change to a lower number armv and i believe it will work.
though i cant be sure
In XCode, when I open project settings, I only see the following two choices for the setting "Architectures": 'Standard (armv6 armv7)' and 'Optimized (armv7)'.
How can I get the choice of 'Optimized (armv6 armv7)' to appear?
I'm using XCode 3.2.3.
It's misleading. Choose armv6&7 if you're developing for iPhone 3G or earlier. 3GS and later, including iPad, use arm7, so if those are the devices you're targeting, you can get code more optimized for those newer devices by choosing armv7, no backward compatibility. (For targeting all devices, old and new, choose armv6&7.)
With the iOS SDK for 4.0.x, Apple renamed the old "Optimized (armv6 armv7)" to "Standard (armv6 armv7)", so you've already got it to appear, just under a different name.
What is this selection for? I have the Architectures set to Optimized (armv6 armv7) so a fat binary should be getting build with both, right?
So why does this need to set this in the menu? What does it do?
Well mostly you do not need it, but even if you are building fat binaries you may not always be building both versions.
If you check the Build settings for the target there is an option in the Architectures section named "Build Active Architecture Only". I think by default this is selected when you are building for debug. The idea being that if you have armv6 device plugged in Xcode is smart enough to detect that and only build that version saving you some time.
Of course when you are building for distribution the option will not be checked to ensure you build for both architectures (not just the active one).
So I guess the short answer is that you do need to mess with it as Xcode will set it for you based on which device you have plugged in.
armv6 is compatible with all iPhone/iPod touch/iPad devices.
armv7 is for newer devices which support OpenGL ES 2.0, including iPhone 3GS, recent iPod touch and iPad devices.
Xcode detects which devices you have connected and will set the active architecture accordingly. So if you plug a 2nd generation iPod Touch into your computer Xcode should set the active architecture to armv6.
When you create a Distribution configuration for publishing to the App Store you should make sure this option is not set so that you build the fat universal binary
What would be the settings to build and have accepted an universal app for both the iPad and iPhone?
That is, what would be the settings in Project X Info > Build for
Architectures [ARCHS] ("Standard(armv6)" or "Optimized(armv6 armv7)" or other)
Valid Architectures [VALID_ARCHS] ("armv6 armv7" or other)
Build Active Architecture Only (checked or unchecked)
and what would we select in the dropdown (Device - 3.2|Distribution|armv?) ?
We're either getting warnings at build time that we haven't built for armv7, or the app upload is rejected on account of
"The binary you uploaded was invalid. When supporting iPhone, the executable must include support for the armv6 architecture".
Thank you for your help.
This site gives a good information how to make a universal binary.
http://iphonedevelopment.blogspot.com/2010/04/converting-iphone-apps-to-universal.html
almost the same question, and I answered myself.
How to start a project with both outputs iPhone & iPad ?
maybe can help someone
For Universal you want:
iPhone OS 3.1.x
Architectures to armv6 and armv7
For more details on the topic check the TUAW Dev Clinic. click on the play button to review the chat discutions of the dev clinic for ipad.