为App Store提交iOS版本(没有Xcode !!!)

时间:2013-02-01 12:06:49

标签: ios app-store submission application-loader

亲爱的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版本”并且需要在某处指定?任何建议都会很棒!

2 个答案:

答案 0 :(得分:0)

数据是其决定的基础可能不在Info.plist中。至于信息的位置,我不知道,因为这个过程的一部分就是黑盒子,而且没有关于它的文件。

为了使事情变得更容易和更简单,我建议保留用于开发和测试的跨平台IDE,但是当您准备好发布时,请使用Xcode。我有几个理由说明你应该这样做:

  1. 在Xcode中轻松存档版本。这样可以保存您已归档的应用程序版本的管理良好的列表,以便您可以使用dSYM和代码进行以后的调试。此存档过程已集成到App上传系统,并有助于跟踪您在该时间点发布的代码。

  2. Application Loader是Xcode的一部分;为了确保所有内容都兼容,.ipa应该由相同版本的Xcode生成。然后,如果捆绑被拒绝,您只需要尝试不同的版本,您知道它不是构建过程的一部分。

  3. 看起来我似乎正在回避你的问题,但最终当你上传到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需要什么,但这很有用。通过剥离不必要的步骤,随意改进。

希望这会帮助那些试图取得类似成果的人,欢呼!