亲爱的stackoverflowers!
我目前正准备一个iPhone应用程序提交到App商店。这是一个更大的跨平台C ++项目,我不得不抛弃Xcode作为IDE并转向更“跨平台类型”的构建系统。现在这是一个简单的Makefile。在开发过程中一切正常,只是利用XCode构建链,但不使用XCode本身。然而,现在有一个最后的障碍,我不知道如何通过:
在很多不同的其他与包装相关的错误之后,Apple的Application Loader吐出了关于我的.ipa文件,还有最后一个:
"The bundle is invalid. Apple is not currently accepting applications built with this version of the SDK or Xcode."
我已经看到我显然不是唯一遇到此错误的人,但大多数描述如何解决此问题的文章都是关于通过Xcode设置解决它,或者显然是过时的(2011年或更早)。 / p>
关于该应用的事实:
两天前,该应用仍然与iOS 5.0 SDK相关联。鉴于错误,我花了一些时间将应用程序与最新的SDK 6.1链接起来。所以这是错误的,但仍然是错误(但是,我没想到apploader后面的服务器会试图'解析'我的可执行文件,看看我链接到哪个版本的链接...或者它是什么,然后那里是iOS 5.0的一些剩余链接?)
接下来,我的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>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>
我假设应用程序的属性列表中仍然缺少一些选项,这些选项由Application Loader检测到,或者某些值以错误的方式填充。部分问题是,Apple的开发人员指南在不使用Xcode时并没有真正的帮助。有很多键标有“不使用,由Xcode填充”,只有很少的解释(例如:MinimumOSVersion)。
问题本质上是:有人知道应用程序加载器从哪里获取使用过的SDK版本?或者Application Loader是否关心“Xcode版本”并且需要在某处指定?任何建议都会很棒!
答案 0 :(得分:0)
数据是其决定的基础可能不在Info.plist中。至于信息的位置,我不知道,因为这个过程的一部分就是黑盒子,而且没有关于它的文件。
为了使事情变得更容易和更简单,我建议保留用于开发和测试的跨平台IDE,但是当您准备好发布时,请使用Xcode。我有几个理由说明你应该这样做:
在Xcode中轻松存档版本。这样可以保存您已归档的应用程序版本的管理良好的列表,以便您可以使用dSYM和代码进行以后的调试。此存档过程已集成到App上传系统,并有助于跟踪您在该时间点发布的代码。
Application Loader是Xcode的一部分;为了确保所有内容都兼容,.ipa应该由相同版本的Xcode生成。然后,如果捆绑被拒绝,您只需要尝试不同的版本,您知道它不是构建过程的一部分。
看起来我似乎正在回避你的问题,但最终当你上传到App Store路线时,Apple完全覆盖了这个问题。因此,我们必须按照他们的规则行事。他们想要阻止任何形式的狡猾的构建到App Store,因此他们有他们策划的上传过程。
跨平台IDE /开发是一条很好的路线,似乎你已经解决了这个问题,但是当涉及到上传到专有的应用程序商店系统时,它不再是跨平台的。
答案 1 :(得分:0)
好的,花了一段时间,但我上周成功使用Application Loader并没有Xcode提交我的程序。问题是一堆未记录的密钥,我从XCode构建的项目中反向设计。对于每个想要完成类似事情的人来说,这里改变了对我有用的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>
使用过的操作系统版本字符串的新魔术键。我不知道如何生成这个字符串,这是Xcode在另一个plist中写的,我复制了它。
<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>
这里真正的魔力。然而,在问题描述中给出错误消息时,我再次记录了一些无法记录的密钥,我怀疑密钥DTSDKName和DTSDKBuild特别重要。好吧,但是Xcode的版本字符串(为什么苹果想要知道?)和iphone;再一次,我不知道如何产生这些。
<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>
同样改变了这个,我认为这是一个复制粘贴工件,因为我记不起它了....
<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>
更改为旧版本,似乎不对应用程序加载器和5.0的拒绝负责任无论如何
<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>
最后,假设你可以编译一个有效的“.app”目录,你需要从中生成一个包(通过尝试使用ios-sim在模拟器上执行“.app” - 目录来检查或者使用fruitstrap将其部署到手机上 - 很棒的工具!)。我选择了一个ipa-bundle。我使用以下脚本从.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
是您从Apple移动配置中心下载的分发配置文件。只需将其复制粘贴到.app目录中即可。
[Distribution Key Identifer]
是您的keycahin的分发签名的标识符。
请注意,代码签名执行两次,一次作为“PackageApplication”的一部分执行,一次手动调用。很明显,我不知道构建有效的.ipa需要什么,但这很有用。通过剥离不必要的步骤,随意改进。
希望这会帮助那些试图取得类似成果的人,欢呼!