5

我的项目或 Xcode 确实有些问题,两天以来我一直在努力弄清楚发生了什么。

我的应用程序运行得非常好,它是一个 OS X 应用程序,它包含一个 Today Widget 扩展。我最近完成了该项目,现在由于验证错误而无法发布该应用程序。

它始于验证器抱怨我的应用程序组,我用它在主应用程序和小部件扩展之间共享内容。该组被定义为$(TeamIdentifierPrefix)com.acme.GreatApp

验证器抱怨我的组名格式错误,应该以我的 TEAMID 开头。绕圈跑了 3 个小时后,我$(TeamIdentifierPrefix)用我的团队 ID(例如S3F45A5S35.)替换了占位符——这很奏效。

然后验证器抱怨 myinfo.plist和 entitlements 文件中的所有其他占位符,$(PRODUCT_NAME)例如com.acme.GreatApp.$(PRODUCT_NAME:rfc1034identifier)$(EXECUTABLE_NAME). 我用它们对应的值替换了所有这些占位符,然后被接受了。

然后,有一段时间验证者抱怨结构性问题,这对我来说没有太大意义:

iTunes Store 操作失败。错误的 CFBundleExecutable。在嵌套包 GreatAppWidget [com.acme.GreatApp.pkg/Payload/GreatApp.app/Contents] 属性列表文件中找不到与 CFBundleExecutable 的值匹配的可执行文件


iTunes Store 操作失败。错误的捆绑标识符。应用程序扩展 GreatApp.app/Contents/Plugins/GreatAppWidget.appex 的包标识符“com.acme.GreatApp.GreatAppWidget”应扩展其包含应用程序的包标识符的虚线路径 (com.acme.GreatApp.GreatAppWidget)

你是在告诉我我的扩展包含在我的扩展中吗?


iTunes Store 操作失败。捆绑包位置无效。Bundle GreatApp.app/Contents/Plugins/GreatAppWidget.appex 必须包含在父包的 Contents/Plugins 目录中。

好吧,错误表明我应该做它声称不正确的事情。显然它在父应用程序文件夹Contents/Plugins中。所以呢?


iTunes Store 操作失败。两个包的 CFBundleExecutable 可能不指向同一个文件。已找到以下共享包路径:GreatApp.app/Contents。


问题是,我的应用程序和扩展程序运行良好。如果有任何东西被破坏,比如依赖关系、路径或其他什么,那么很可能是行不通的,不是吗?

此外,我没有修改任何构建设置或任何我不理解的东西。这些都是默认设置。我创建了一个新的 Cocoa 应用程序,添加了一个新的 Today Widget Extension 作为目标——就是这样。我没有弄乱任何路径、位置、依赖关系等任何东西。

无论如何,这些错误只在一段时间内可见,我很幸运当时我做了一个截图。因为现在,它再次在错误消息中显示原始占位符,即使我没有更改可能导致这种情况的事情。我能记得我做的唯一一件事就是在磁盘、钥匙串和会员中心本地删除/撤销所有配置文件和证书,并通过 Xcode 从头开始​​创建所有内容。

现在错误如下所示:

iTunes Store 操作失败。错误的 CFBundleExecutable。在嵌套包${bundleName} [ ${bundlePath} ] 属性列表文件中找不到与 CFBundleExecutable 的值匹配的可执行文件


iTunes Store 操作失败。错误的捆绑标识符。应用程序扩展${bundlePath}的包标识符“ ${bundleIdentifier} ”应该扩展其包含应用程序的包标识符的虚线路径(${parentBundleIdentifier}


iTunes Store 操作失败。捆绑包位置无效。捆绑包${bundlePath}必须包含在父捆绑包的${pluginsSubPath}目录中。


iTunes Store 操作失败。两个包的 CFBundleExecutable 可能不指向同一个文件。已找到以下共享包路径:${sharedBundlePath}


所以我想也许苹果只是在最近的更新中把它搞砸了,你只是无法验证带有扩展名的应用程序。所以我在网上搜索并找到了非常好的示例Today-Scripts。我将应用程序组($(TeamIdentifierPrefix)com.acme.Today-Scripts,这里的占位符完美地工作)添加到所有目标,激活沙盒,更改证书和配置文件:它完美地验证了!

所以我比较了所有的构建设置等。除了我必须用它们的实际值替换占位符,显然是证书和配置文件,以及在 Today-Scripts 中有一个嵌入到小部件中的额外 XPC 目标的事实,他们在原子上是相同的。 一个 设置都是一样的。

我清除了所有缓存,真的很难。清理项目,清理~/Library/Developer/Xcode/DerivedData以及~/Library/Caches/com.apple.dt.Xcode重新启动几次,没有任何帮助。

我真的很绝望,因为我不知道我能做什么。请有人解释一下 Xcode 在这里做什么以及为什么。

  1. 是什么导致 Xcode 无法解释info.plist和授权文件中的所有占位符?
  2. bundle当我使用 这些错误时怎么会发生
    • 通过创建新的可可应用程序并添加扩展目标创建的确切设置 XCode?
    • 与 Today-Scripts 示例完全相同的设置/依赖项?
4

3 回答 3

7

我终于找到了罪魁祸首!问题是,由于某种我无法解释的原因,info.plist扩展是主应用程序的成员(目标成员)。我刚刚通过逐个文件分析创建的存档文件发现了这一点,并在文件夹中找到了一个附加info.plist文件GreatApp.app/Contents/Resources。在该文件中,占位符未解析。然后存档验证器使用它info.plist进行验证。

那个小复选框花了我 3 天的时间。

于 2015-02-26T05:21:52.977 回答
2

我得到

“iTunes Store 操作失败。CFBundleExecutable 错误。在嵌套包 ${bundleName} [${bundlePath}] 属性列表文件中找不到与 CFBundleExecutable 值匹配的可执行文件”

当我尝试将我的 adobe air 应用程序提交到 mac 应用商店时出错。

可执行文件位于“/Contents/Frameworks/Adobe AIR.framework/Versions/1.0/Resources/AdobeCP15.plugin/Contents/MacOS/AdobeCP”

在位于“/Contents/Frameworks/Adobe AIR.framework/Versions/1.0/Resources/AdobeCP15.plugin/Contents/info.plist”的 info.plist 文件中

它写成

CFBundleExecutable adobecp

这些文件是自动生成的,但发现区分大小写需要时间。因此,我将其更改为

CFBundleExecutable Adob​​eCP

并且错误消息消失了。

于 2015-06-11T06:25:54.423 回答
1

我结束了这篇文章,因为我遇到了类似的错误,但原因不同。我的问题是由于有一个 WatchKit 应用程序并且在我的“运行脚本”阶段之后有“嵌入手表内容”构建阶段。一旦我将“嵌入监视内容”构建阶段移动到“复制捆绑资源”和“嵌入框架”之间,WatchKit 的验证就成功了。

于 2016-01-12T19:02:01.280 回答