My binary was rejected with the error above as the reason. I checked my xcode settings and under the "General" tab of info I have the Project Format set to Xcode 3.2 compatible which is the highest available. I have the Base SDK Configurations set to iPhone Device 4.0 - also the highest available. In the "Build" tab, I have the Base SDK set to iPhone Device 4.0. I have all of them set to the highest, how can they not be receiving these types of apps?
EDIT: I confirmed that I am using the newest version of Xcode (3.2.3) and I never had the beta test version installed - this is my first app. I have confirmed that every single place that I can find - the OS is set to 4.0. No matter what I seem to do - I still get that same error message when trying to upload the binary.
Decompress your app (via show contents) and have a look at info.plist in a text editor such as textMate (its a binary file). Search for the key iphoneos the following numbers are the version.
This will confirm what version it was built with.
Are you sure you are using the latest version of Xcode and the SDK to compile? Maybe you still have one of the beta versions installed and that's the reason for the rejection.
A certain combination needs to be made. The Base SDK needs to be set to 4.0 and the target SDK needs to be set to 3.2.
Related
I'm unable to choose the lower than 4 version of SDK simulator in the simulator selection list in xcode4. There are iOS SDK 4+ (for iPhone) and iOS SDK 3.2 (for iPad) simulator versions only. I have set IPHONEOS_DEPLOYMENT_TARGET = 3.1 but nothing changes.
In the project editor choose your build target and then choose the summary pane. In the summary pane there is a drop down box where you can choose the deployment target. This may or may not help because it sounds like you're already changing the variable directly in the build settings.
Seems like we need to download and install previous version of Xcode and SDK. All the versions could be found on Apple's developer site. Also, there is one simple instruction that can be found here:
http://iosdevelopertips.com/xcode/download-and-install-older-versions-of-xcode-xcode-previous-releases.html
I've just updated xcode to release 4.0. A lot of the frameworks in my App are now highlighted in red, they appear to be missing. i.e. MapKit.framework
Is 4.0 not backward compatible with 3.1.3 ?
Regards,
Stephen
If your project is working with 3.1.3 well, then do the following:
1. In XCode left pane, select your project name, right click (control click) and select "Get Info".
2. In Build tab, change the Base SDK to iPhone Device 4.0 (your latest downloaded SDK)
3. Similarly also repeat above steps after selecting "Project" menu -> Edit active target.
Then close your XCode and restart XCode.
All your frameworks will be available now.
However this change (by itself) will prevent your app from loading on a 3.1.x device. That's because the new setting "iOS Deployment Target" (introduced with the 4.x SDK) will default to the same value as the Base SDK you just set. You have to change this new setting (it's in the "Deployment" group) to the earliest iOS device your app will support.
Now your app will run on any device running that version or later of iOS. But there's a new wrinkle. If you add code to your project that uses classes or methods introduced in 4.x, you'll get no warning of that in the Simulator, yet it will crash when called by your 3.x device. You have to wrap such calls with code that tests the runtime version of the device, and only make the calls if the runtime version supports those calls.
This is all discussed in detail here: Install xCode 3.2.3 w/ iPhone SDK 4, get "Base SDK missing", can't see other SDKs, which includes links to discussions of how best to code these runtime checks.
I am going through the Apple provisioning profile walkthrough documentation to create the binary to submit to the app store but came across a very visible problem.
The documentation shows that when the user clicks on the "Overview" tab in Xcode they should have a list of options such as:
Device - iPhone OS 2.0,
Device - iPhone OS 2.1,
Device - iPhone OS 2.2 (Project Settings),
Simulator - iPhone OS 2.0,
Simulator - iPhone OS 2.1,
Simulator - iPhone OS 2.2
However, in my version of Xcode, the "Overview" tab brings up this:
Device,
Simulator
I am wondering if this could possibly be contributing to the reason that the app store will not accept my binary - the error stating that "Apple is not currently accepting apps built in this version of the OS." Any ideas on what I am doing wrong?
EDIT:I have checked everything that I can possibly think of - this is the final SDK 4.0 that is the most current. I have tried almost every combination of base SDK and target SDK that is allowed in the build menu - although I am pretty sure the correct way is to have the base SDK at 4.0 and the target SDK at the lowest that it would possibly work - none of this works. Is there some sort of help desk I can call at Apple because I have been working on this one tiny problem now for about 10 hours and I am not making any progress at all.
Seams that you have and old SDK, try to download SDK4 final (not the beta).
Or your compiling options are old, to edit them right click on the project icon in the left column and click "Get info".
In the second tab (build) you should find all the options you need.
Must have been some recent changes to xcode. Everything worked once I set the Base SDK to 4.0 and the target SDK to 3.2.
If I have built an app for 3.1.3 (using for instance the frameworks within the 3.1.3 folders) how do i then target a version below that (3.1.2) for the ad hoc and distribution builds?
Do change the Base SDK in the Project Info (Distribution) settings or the Target Info (Distribution) settings? (I've always been unclear on the diff between these two windows)
Base SDK must be 4.0 (or 3.2 for iPad). You don't get any other choice with the new SDK.
Therefore it is the "iPhone OS target" value you must change, found within the project settings. Here you can wind right back to OS2.0 if you wanted!
When you do this and set any earlier version than 4.0/3.2, any new calls for the later versions will be loosely bound; in other words, it will run on the old OS but will crash if any new calls are executed. Therefore you need to check if newer calls are supported. Use the -respondsToSelector method, or alternatively check UIDevice to see what OS version is currently running.
Edit: if you're using Xcode 3.2.2 or earlier then you get a wider choice of Base SDK. If you set a lower base SDK then any new commands won't be available/won't compile. This can be useful for example if you want to guarantee an app running in iPhone OS3.0. However this option disappears for historic OS numbers in Xcode 3.2.3 as mentioned above.
I know that parts of this question was asked in several variation but I want to make sure I got it right.
Here are my assumptions and understandings which I want to know if they are correct before submitting.
My application assumes features supported by all OS, and so I should:
Set the Active SDK to be the latest (currently SDK 3.0).
Set the Deployment Target to be the lower I want to be supported - iPhone 2.0 and higher?
What exactly is the Base SDK for? should I ignore it if I chose Active SDK to be different and where do I see the Active SDK in the Projects settings?
One final question - is apple allowing to choose iPhone OS 2.0 as the Deployment Target?
Thanks in advance,
BTW - one of my main reason for this question is because when compiling with earlier SDKs apple seems to have a problem releasing the memory for UIImageView animation array when this animation was saved for multiple time usage. This is a known problem that was fixed with SDK 3.0 (by simply setting the UIImageView animation array to nil)
The difference between the Base and Active SDK is that the former is the default SDK set for the project and the latter is the SDK you are currently building against. So it is possible for your Active SDK to be the Base SDK, at which point XCode will use the SDK you specified for the project.
In order to build your app for the widest set of devices possible, you are correct:
Set the Base SDK to the lastest SDK possible (3.0, 3.0.1)
Set the Deployment Target to the earliest SDK possible (2.0)
Apple does allow you to specify iPhone 2.0 as the Deployment Target, but keep in mind any API or framework released after iPhone 2.0 you will not have available to you for use by default. There are techniques to use features from later SDKs, however they are nontrivial.
You should set the Base SDK build setting to the latest SDK that contains all of the features that you intend to use (usually, the latest available SDK), and set the "iPhone Deployment Target" build setting to the earliest version of the OS on which you want to run.
You then need to make sure that you check, at runtime, for any features that may not exist on the earlier OSes.
"Base SDK" is the Maximum SDK you application can support. There's a hard limit here - you can't select a future, unreleased SDK.
"Deployment Target" is the Minimum SDK you are willing to support. It how far back in time you are willing to go.
Xcode appear to create a spurious dependency on "Deployment Target." For example, I can't develop on my iOS 5.1.1 iPod with Xcode 4.5.2 (Xcode 4.5.2 is paired with iOS 6.0), even though the 4.3, 5.0, and 5.1 APIs and Simulators are installed on this installation. I need to use the simulator or jack in my iOS 6.0 iPhone.
The games Apple is playing appears to be causing problems with apps, too. My purchased copy of Elements will not sync via iTunes to the iPod because Elements needs a newer version of iOS to run (it syncs and runs fine on my iOS 6.0 iPhone).
I've got two iPads and one is 4.3. I shudder to think what a mess it will cause.
In general;
Set the BASE SDK to the very latest SDK you are willing to support and test.
Set the Deployment Target to the lowest version of iOS you are willing to support and test.
If you happen to use Base SDK features not available on the deployment target SDK, the app will crash at runtime on older devices, so testing is vital.
An alternative / complementary process would be to use Deploymate http://www.deploymateapp.com/ which does static code analysis to identify problems.
If you are from the android world the analogies are such;
TargetSDK -> Base SDK
MinSDK -> Deployment Target
Lint -> Deploymate