Xcode - 由于解决 info.plist 中的 variables/placeholders 和权利的奇怪问题,无法验证存档

Xcode - failing to validate archive due to weird issues with resolving variables/placeholders in info.plist and entitlements

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

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

首先是验证器抱怨我的应用程序组,我用它来在主应用程序和 Widget 扩展之间共享内容。该组被定义为 $(TeamIdentifierPrefix)com.acme.GreatApp.

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

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

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

iTunes Store operation failed. Bad CFBundleExecutable. Cannot find executable file that matches the value of CFBundleExecutable in the nested bundle GreatAppWidget [com.acme.GreatApp.pkg/Payload/GreatApp.app/Contents] property list file


iTunes Store operation failed. Bad bundle identifier. The bundle identifier 'com.acme.GreatApp.GreatAppWidget' of the application extension GreatApp.app/Contents/Plugins/GreatAppWidget.appex should extend the dotted path of the bundle identifier of its containing application (com.acme.GreatApp.GreatAppWidget)

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


iTunes Store operation failed. Invalid bundle location. Bundle GreatApp.app/Contents/Plugins/GreatAppWidget.appex must be contained in parent bundle's Contents/Plugins directory.

嗯,错误说我应该做它声称的是不正确的。显然它在父应用程序文件夹 Contents/Plugins 中。那又怎样?


iTunes Store operation failed. The CFBundleExecutable of two bundles may not point to the same file. The following shared bundle path have been found: GreatApp.app/Contents.


事实是,我的应用程序和扩展程序运行良好。如果有任何问题,如依赖关系、路径或其他任何问题,很可能无法正常工作,不是吗?

此外,我没有修改任何构建设置或任何我不理解的内容。这些都是默认设置。我创建了一个新的 Cocoa 应用程序,添加了一个新的 Today Widget Extension 作为目标 - 仅此而已。我没有乱搞任何路径、位置、依赖项等等。

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

现在错误如下所示:

iTunes Store operation failed. Bad CFBundleExecutable. Cannot find executable file that matches the value of CFBundleExecutable in the nested bundle ${bundleName} [${bundlePath}] property list file


iTunes Store operation failed. Bad bundle identifier. The bundle identifier '${bundleIdentifier}' of the application extension ${bundlePath} should extend the dotted path of the bundle identifier of its containing application (${parentBundleIdentifier})


iTunes Store operation failed. Invalid bundle location. Bundle ${bundlePath} must be contained in parent bundle's ${pluginsSubPath} directory.


iTunes Store operation failed. The CFBundleExecutable of two bundles may not point to the same file. The following shared bundle path have been found: ${sharedBundlePath}.


所以我想也许 Apple 只是在最近的更新中对它进行了处理,而你只是无法验证带有扩展程序的应用程序。所以我在网上搜索并找到了非常好的示例 Today-Scripts。我向所有目标添加了应用程序组($(TeamIdentifierPrefix)com.acme.Today-Scripts,此处的占位符非常有效),激活了沙盒,更改了证书和配置文件:它完美地验证了!

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

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

我真的很绝望,因为我不知道我还能做什么。请有人阐明 Xcode 到底在做什么以及为什么。

  1. 什么原因导致 Xcode 无法解释 info.plist 和权利文件中的所有占位符?
  2. 当我使用
    • 通过创建新 cocoa 应用程序并添加扩展目标创建的确切设置 XCode?
    • 与 Today-Scripts 示例完全相同 settings/dependencies?

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

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

我得到了

"iTunes Store operation failed. Bad CFBundleExecutable. Cannot find executable file that matches the value of CFBundleExecutable in the nested bundle ${bundleName} [${bundlePath}] property list file"

当我尝试将我的 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 AdobeCP

并且错误消息消失了。

我之所以这样 post 是因为我遇到了类似的错误,但原因不同。我的问题是由于有一个 WatchKit 应用程序并且在我的 'Run Script' 阶段之后有 'Embed Watch Content' 构建阶段。一旦我将 'Embed Watch Content' 构建阶段移动到 'Copy Bundle Resources' 和 'Embed Frameworks' 之间,WatchKit 的验证就成功了。