App Store Validation Issue - CFBundleIcons App Icon20x20 - ios

I have been struggling with this issue for over a week. Whenever I try to validate a build or use application loader lately I have been getting this error:
iTunes Store operation failed.
Invalid Image Path - No image found at the path referenced under key 'CFBundleIcons':'AppIcon20x20'
Now, the problem is there is no AppIcon20x20 key in my plist.
Here's my AppIcon asset and attributes settings:
AppIcon, Attributes
Nowhere is a 20x20 asset even mentioned in my Plist, as seen by the source code version here :
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleIcons</key>
<dict>
<key>CFBundlePrimaryIcon</key>
<dict>
<key>CFBundleIconFiles</key>
<array>
<string>icon603x.png</string>
<string>icon602x.png</string>
<string>icon403x.png</string>
<string>icon402x.png</string>
<string>icon293x.png</string>
<string>icon292x.png</string>
<string>icon203x.png</string>
<string>icon203x.png</string>
</array>
</dict>
</dict>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSExceptionDomains</key>
<dict>
<key>https://millsfitnessapparel.myshopify.com/</key>
<string></string>
</dict>
</dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
</dict>
</plist>
And lastly, I have googled the heck out of this topic and they all say to just add CFBundleIcons to your plist, which I did, but it's still throwing the error. I have also done this in versions of this project where there are pods, no pods, workspaces, regular xcproj. files, and even with 1 view controller and just some icons [this latest build].
I have also tried to achive this build in xcode versions 8.1, 8.2, and 8.3, all receiving the same error.
Any help here would be greatly appreciated. These are apps for a client and I am currently late on delivering because of this issue. Thanks.

Its basically, that the 120px icon is not exactly 120px, I ended up recreating the icon and finally was able to get the app submitted to Apple Store.

Okay non of the steps online worked for me so I'm gonna post how I resolved my problem, I had a very old project which was originally created before iOS 5 but it was upgraded up until iOS 9 but it carried over old icon system.
Even though I didn't have CFBundleIcons nowhere in my plist file and have everything properly setup in the asset manager under AppIcon key but it was giving this message so this is what I did
I created CFBundleIcons key in the plist file by typing the exact key ( CFBundleIcons ) without selecting anything from suggestion window as that key no longer exist in the suggestion window.
After you hit enter Xcode translates you key into 'Icon Files ( iOS 5 )'
Then go to your project's target node where you can see the project's target settings.
In there you should see the Migrate button shows up in from of the 'App Icon Source'
Click to Migrate to the new Icon system ( eve though you may have
already done it before )
After you migrated create a new icon set in the assets manager or
point to an existing one if you have already created one.
This should clear out that issue, basically we just needed re-invoke the migration process to clean up what was left over.

Related

ERROR ITMS-90502 App Store Upload - Xcode

Suddenly our project is not uploading properly to the App Store and we are stopped at this point :
Error message:
ERROR ITMS-90502: "Invalid Bundle. Apps that only contain the arm64 slice must also have 'arm64' in the list of UIRequiredDeviceCapabilities in Info.plist."
We've tried all, this is our info.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>Optimio</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>2</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSAllowsArbitraryLoadsInWebContent</key>
<true/>
</dict>
<key>NSCameraUsageDescription</key>
<string>$(PRODUCT_NAME) upload your expense photos through camera and roll</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>$(PRODUCT_NAME) upload your expense photos through camera and roll</string>
<key>UILaunchStoryboardName</key>
<string>Uploaders</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>arm64</string>
<string>armv7</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
</dict>
</plist>
Also we have this build settings:
It may be a change in iTC that's causing it, but there does actually seem to be a fix.
I corrected the plists of ALL extensions in my (iOS11 only) project to include arm64 as a requirement (UIRequiredDeviceCapabilities).
And then added this post install hook for cocoapods:
https://twitter.com/aaron_pearce/status/966530631608881153
Now uploaded successfully and going through processing.
EDIT:
Whilst this solution is valid, and worked perfectly well, it is no longer necessary. It seems that iTC has been "fixed", and now accepts (again) builds that have not had these changes made.
https://forums.developer.apple.com/message/296129
(I did try the post install hook as suggested here but that didn't work)
Add the following xml to your main target's info.plist file,
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>arm64</string>
</array>
Then add the same xml to all your info.plist files in your pods project (if you have a pods project of course).
You should now be able to upload to iTunes connect.
This looks to be a recent change that Apple made with ITC validation. Previously it was enough to flag your main project as restricted to arm64, but now it looks like you need to ensure that even embedded projects are flagged as well. Meaning that Pods.proj and any Internal.proj files need to be restricted along with the main project file.
Unfortunately right now Cocoapods, by default, builds frameworks that support arm64, armv7, and armv7s which causes an issue here. I was able to solve this problem by adding the following lines to my Podfile.
post_install do |installer|
installer.pods_project.build_configurations.each do |config|
config.build_settings['VALID_ARCHS'] = 'arm64'
end
end
Hope this helps!
Source:
https://gist.github.com/alexpersian/e6ab115dc12f3d48eee0e7f27dfb567d
Edit: (2/23/2018)
This issue looks to have been resolved on the iTC side based on the following forum thread. https://forums.developer.apple.com/message/296129

Invalid Image Path - No image found at the path referenced under key 'CFBundleIcons':'AppIcon20x20' [duplicate]

This question already has answers here:
App Store Validation Issue - CFBundleIcons App Icon20x20
(2 answers)
Closed 5 years ago.
REPOSTING SINCE I AM GETTING NO ANSWERS ON THIS.
I have been struggling with this issue for over a week. Whenever I try to validate a build or use application loader lately I have been getting this error:
iTunes Store operation failed.
Invalid Image Path - No image found at the path referenced under key 'CFBundleIcons':'AppIcon20x20'
Now, the problem is there is no AppIcon20x20 key in my plist.
Here's my AppIcon asset and attributes settings:
AppIcon, Attributes
Nowhere is a 20x20 asset even mentioned in my Plist, as seen by the source code version here :
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleIcons</key>
<dict>
<key>CFBundlePrimaryIcon</key>
<dict>
<key>CFBundleIconFiles</key>
<array>
<string>icon603x.png</string>
<string>icon602x.png</string>
<string>icon403x.png</string>
<string>icon402x.png</string>
<string>icon293x.png</string>
<string>icon292x.png</string>
<string>icon203x.png</string>
<string>icon203x.png</string>
</array>
</dict>
</dict>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSExceptionDomains</key>
<dict>
<key>https://millsfitnessapparel.myshopify.com/</key>
<string></string>
</dict>
</dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
</dict>
</plist>
And lastly, I have googled the heck out of this topic and they all say to just add CFBundleIcons to your plist, which I did, but it's still throwing the error. I have also done this in versions of this project where there are pods, no pods, workspaces, regular xcproj. files, and even with 1 view controller and just some icons [this latest build].
I have also tried to achive this build in xcode versions 8.1, 8.2, and 8.3, all receiving the same error.
Any help here would be greatly appreciated. These are apps for a client and I am currently late on delivering because of this issue. Thanks.
you can simply create your app icons asset using https://makeappicon.com/. You have to supply a 1536x1536px image for the best result. It will automatically create all the app icons for your project
Also please refer to the following:-
Check the icon file's name is exactly same as the name in your info.plist. It's fine while running debug mode though, It doesn't work while you upload/ validate the build.
Please check your app's bundle identifier is correct.

The bundle's Info.plist does not contain a CFBundleVersion key or its value is not a string

Xcode is build the project and when build is success, I get this message "The bundle's Info.plist does not contain a CFBundleVersion key or its value is not a string". What is that mean. There is my info.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key></key>
<string></string>
<key>Additional_Version_String</key>
<string>Updated on build</string>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleDisplayName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIcons</key>
<dict/>
<key>CFBundleIcons~ipad</key>
<dict/>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>Commit_Short_Hash</key>
<string>Updated on build</string>
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSContactsUsageDescription</key>
<string>Vialer needs access to your contacts to make calling to your contacts possible</string>
<key>NSMicrophoneUsageDescription</key>
<string>Vialer needs access to your microphone to make calling possible</string>
<key>UIBackgroundModes</key>
<array>
<string>audio</string>
<string>fetch</string>
<string>remote-notification</string>
<string>voip</string>
</array>
<key>UIMainStoryboardFile</key>
<string>MainStoryboard</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
<key>UIRequiresPersistentWiFi</key>
<true/>
<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleBlackTranslucent</string>
<key>UIStatusBarTintParameters</key>
<dict>
<key>UINavigationBar</key>
<dict>
<key>Style</key>
<string>UIBarStyleDefault</string>
<key>Translucent</key>
<true/>
</dict>
</dict>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<true/>
</dict>
</plist>
I have the same issue with CFBuildVersion and than i found that in my project Target there is no build version inserted.
So i have just inserted build version and issue solved.
I followed solutions from everywhere and these are the steps I ended up with that worked for me:
Solution:
Open the terminal and fix any relevant issues flutter doctor displays:
Run flutter clean
Delete the Podfile, Podfile.lock and the Pods directory from your ios project
Open the Runner.xcworkspace project in Xcode
Update the build number as #Hardik Vyas mentioned
As #iDevOrz mentioned, Erase All Content and Settings from the simulator
Clean, build and run the app in Xcode
I have the same problem.
I fix it by Simulator menu -> Hardware -> Erase All Content and Setting.
Maybe it's a Simulator bug.
Just add version and build number
Xcode 12.5 - It might be a bug unrelated to the plist
I have Big Sur and Xcode 12.5 (not beta) and I created a new SwiftUI project.
To save time I dragged a folder containing a bunch of json files in my project navigator. The folder was named "Resources" but I hope it was not the issue.
Before dragging the folder the project compiled. After having the new folder it would not compile anymore and would give me the error as below. Oddest bug I found.
Solution, I added the files one by one and then I created the enclosing folder, then it worked. And it is reproducible! I spent 30 minutes today on this. Luckily it was at the very beginning of a project and could compare and see when it would stop compiling..
The fix for me was to add a build number to the target.
Click on your target, go to General, then underneath Identity is a field for Build.
You can use agvtool to fix theses error : https://developer.apple.com/library/archive/qa/qa1827/_index.html
So, to solve the CFBundleVersion issue, open terminal, go to the project root (iOS project), and type this command :
agvtool new-version -all 2.6.9
And hit enter.
Just Insert the build version to your project
add to info.plist in code mode worked for me
<plist version="1.0">
<string>1.0</string>
</plist>
I just added this key CFBundleVersion and copied the value from the above key as shown in the .plist (see project navigator on the left):
I just edit my project's ".plist" file and added a CFBundleShortVersionString entry with some value.
Inside your .plist, check whether you have this key or not.
Bundle version string (short)
I have the same issue with CFBuildVersion. I noticed my Target had no build version.
So I filled in the version and build, which solved my issue.
For me, it was crashing because of a missing SDK which was linked properly but I forgot to embed it in the application. The app should normally crash with dyld: not loaded ... but instead, it showed this totally unrelated Info.plist issue. 🤯
That said, I would say it is a bug on the Apple's side and pretty much everything that prevents the app from starting can produce this error.
Xcode 14.2, native M1 mode.
I hope it helps.

Xcode : Submission Failed - Invalid IPA

After many hours of research, I don't know why I can't submit my application from xCode (6.1).
At the end of the submission an error is returned:
ERROR ITMS-90072: "The IPA is invalid It does not include a Payload directory."
The two responses that I've read are located in the info.plist file
Two keys must be added :
- LSRequiresIPhoneOS: YES (Boolean)
- CFBundleInfoDictionaryVersion: 6.0 (String)
The project has been cleaned.
This is the contents of my file info.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>CFBundleDevelopmentRegion</key>
<string>fr_FR</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>com.forprodis.$(PRODUCT_NAME:rfc1034identifier)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>UILaunchStoryboardName</key>
<string>Main</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
<key>UIStatusBarHidden</key>
<true/>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
</dict>
</plist>
I have generated the IPA and unzip it. The folder contains two subfolders :
- Applications
- Symbols
Only the Payload folder should appear, isn't it ? (the wrapper)
Wikipedia describes the content like this :
An IPA has a built-in structure for iTunes and AppStore to recognize,
The example below shows the structure of an IPA:
/Payload/
/Payload/Application.app
/iTunesArtwork
/iTunesMetadata.plist
I just had the very same problem. It turned out that a missing entitlement for in-app purchases was the culprit.
Select your target and go to 'Capabilities'. Xcode highlighted the missing entitlement and offered to fix it. Then it finally worked.
I hope this works for you as well. I have spent the last couple of hours tearing my hair out.
I faced the same problem on an application that I've successfully submitted many times over the past few years. To correct it, I had to edit the Info.plist file to set:
Application requires iPhone environment = YES
Mine was set to NO. This does not restrict the application from deploying to iPad or iPod.

Set iOS Version for App Store submission (without Xcode!!!)

Dear stackoverflowers!
I am currently preparing an iPhone app for submission to the App store. It is a larger cross-platform C++ project, for which I had to ditch Xcode as IDE and move to a more "cross-platform type" build system. For now this is a simple Makefile. Everything worked just fine during the development process, just utilizing the XCode build chain, but not using XCode itself. However, now there is a last hurdle that I do not quite know how to pass:
After a lot of different other packaging related errors, that the Application Loader from Apple spit out about my .ipa file, there is this last one:
"The bundle is invalid. Apple is not currently accepting applications built with this version of the SDK or Xcode."
I have seen that I am clearly not the only one encountering this error, but most other articles, that describe how to solve this problem, are about solving it via Xcode settings, or are clearly outdated (2011 or earlier).
Facts about the app:
Two days ago, the app still was linked against the iOS 5.0 SDK. Given the error, I spent some time to link the app against the newest, fresh SDK, 6.1. So that is out the way, still the error (however, I did not expect that the server behind the apploader would try to 'parse' my executable to see which version I of the SDK link to... or does it, and there are some residual links to iOS 5.0?)
Next thing, my Info.plist. Well, here it is:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleDisplayName</key>
<string>Drone game</string>
<key>CFBundleExecutable</key>
<string>game</string>
<key>CFBundleIconFiles</key>
<array>
<string>icon.png</string>
<string>icon#2x.png</string>
<string>icon-iPad.png</string>
</array>
<key>CFBundleIdentifier</key>
<string>[The bundle identifier]</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleIconFile</key>
<string>icon.png</string>
<key>CFBundleName</key>
<string>Drone game</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSMainNibFile</key>
<string>MainView</string>
<key>CFBundleResourceSpecification</key>
<string>ResourceRules.plist</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UIApplicationExitsOnSuspend</key>
<true/>
<key>UIStatusBarHidden</key>
<true/>
<key>LSApplicationCategoryType</key>
<string></string>
<key>UIInterfaceOrientation</key>
<string>UIInterfaceOrientationLandscapeRight</string>
<key>MinimumOSVersion</key>
<string>6.1</string>
<key>LSRequiredIPhoneOS</key>
<true/>
<key>UILaunchImageFile</key>
<string>Default.png</string>
<key>CFBundleGetInfoString</key>
<string></string>
<key>UIDeviceFamily</key>
<array>
<integer>1</integer>
<integer>2</integer>
</array>
</dict>
</plist>
I assume that there are still some options missing in the property list for the app, that are detected by the Application Loader or some values are filled in the wrong way. Part of the problem is that Apple's developer guide is not really helpful when not using Xcode. There are a lot of keys that are marked with "do not use, filled in by Xcode", with only little explanation (example: MinimumOSVersion).
The question essentially is: Does someone know where the application loader gets the used SDK version from? Or does the Application Loader care about the "Xcode Version" and it needs to be specified somewhere? Any advice would be great!
The data is bases its decision on is probably not in Info.plist. As to where the information is, I don't know, as that part of the process is quite the black box, and there is no documentation regarding it.
To make things a lot easier and less complex, what I would suggest is to keep your cross-platform IDE for development and testing, but when you feel ready to publish, use Xcode. I have a couple reasons why you should do this:
Archiving versions is a breeze in Xcode. This keeps a nicely managed list of versions of the application you've archived, so that you have the dSYM and Code available to you for later debugging. This archive process is integrated to the App upload system, and helps keep track of what code you've published at that point in time.
The Application Loader is part of Xcode; to make sure everything is compatible etc, the .ipa should really be produced by the same version of Xcode. Then if the bundle is rejected, you simply need to try a different version, you know it's not a part of your build process.
It may seem like I'm skirting your question, but ultimately when you're going down the upload to the App Store route, Apple has that entirely covered. As such, we have to play by their rules. They want to prevent any sort of dodgy build making it to the App Store, and as such they have their curated upload process.
Cross Platform IDE/Development is a good route, and it seems like you have that all ironed out, but when it comes to uploading to a propriatary app store system, it can't be cross platform any more.
Okay, it took a while but I succeeded last week to submit my program using the Application Loader and without Xcode. The problem was a bunch of undocumented keys, that I reverse engineerd from XCode-built projects. For everyone, who wants to accomplish a similar thing, here the changed Info.plist that worked for me:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
New magic key with version string of the used OS. I do not know how to generate this string, this is the one Xcode wrote in another plist and I copied it.
<key>BuildMachineOSBuild</key>
<string>11G63b</string>
.
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleDisplayName</key>
<string>Drone game</string>
<key>CFBundleExecutable</key>
<string>game</string>
<key>CFBundleIconFiles</key>
<array>
<string>icon.png</string>
<string>icon#2x.png</string>
<string>icon-iPad.png</string>
</array>
<key>CFBundleIdentifier</key>
<string>[The bundle identifer]</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>NSHumanReadableCopyright</key>
<string>[Copyright notice]</string>
<key>CFBundleIconFile</key>
<string>icon.png</string>
<key>CFBundleName</key>
<string>Drone game</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
Here the real magic. Again some key that are documented nowhere, however, given the error message in the problem desciption, I suspect the keys DTSDKName and DTSDKBuild to be particulary important. Well yeah, but again version strings for Xcode (why does apple want to know that?) and the iphone; once again, I do not know how to generate these.
<key>DTCompiler</key>
<string></string>
<key>DTPlatformBuild</key>
<string>10B141</string>
<key>DTPlatformName</key>
<string>iphoneos</string>
<key>DTPlatformVersion</key>
<string>6.1</string>
<key>DTSDKBuild</key>
<string>10B141</string>
<key>DTSDKName</key>
<string>iphoneos6.1</string>
<key>DTXcode</key>
<string>0460</string>
<key>DTXcodeBuild</key>
<string>4H127</string>
Also changed this one, I think this is a copy-paste artifact since I cannot remember changing it....
<key>CFBundleSignature</key>
<string>ASDR</string>
.
<key>CFBundleVersion</key>
<string>1.0</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSMainNibFile</key>
<string>MainView</string>
<key>CFBundleResourceSpecification</key>
<string>ResourceRules.plist</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UIApplicationExitsOnSuspend</key>
<true/>
<key>UIStatusBarHidden</key>
<true/>
<key>LSApplicationCategoryType</key>
<string></string>
<key>UIInterfaceOrientation</key>
<string>UIInterfaceOrientationLandscapeRight</string>
Changed to old version, seemingly not resposible for the rejection by the Application Loader and 5.0 is correct anyway
<key>MinimumOSVersion</key>
<string>5.0</string>
.
<key>UILaunchImageFile</key>
<string>Default.png</string>
<key>CFBundleGetInfoString</key>
<string></string>
<key>UIDeviceFamily</key>
<array>
<integer>1</integer>
</array>
</dict>
</plist>
Bundling
Finally, assuming you can compile a valid ".app"-directory, you need to generate a bundle from this (check by try to execute the ".app"-directory on the simulator using ios-sim or to deploy it on your phone using fruitstrap - great tools!). I chose an ipa-bundle. I used the following script to generate it from the .app-directory:
#!/bin/bash
cp embedded.mobileprovision [.app directory]
codesign --force --sign "[Distribution Key Identifer]" --entitlements Entitlements.plist [.app directory]
cd [.app directory]
ln -s _CodeSignature/CodeResources CodeResources
cd ..
/usr/bin/xcrun -verbose -log -sdk iphoneos PackageApplication -v [.app directory] -o "$(pwd)/[bundle name].ipa" --sign "[Distribution Key Identifer]" --embed embedded.mobileprovision
embedded.mobileprovision is the the distribution provisioning profile you download from Apple's Mobile Provisioning Centre. Just copy-paste it in your .app directory.
[Distribution Key Identifer] is the identifier of your distribution signature from your keycahin.
Note, that code signing is executed twice, once as part of "PackageApplication" and once invoked manually. Clearly, I do not know what is required to build a valid .ipa, but this worked. Feel free to improve on this by stripping unnecessary steps.
Hope this will help someone who tries to achieve something similar, cheers!

Resources