Xcode - 由于解决 info.plist 和权利中的变量/占位符的奇怪问题而无法验证存档
Posted
技术标签:
【中文标题】Xcode - 由于解决 info.plist 和权利中的变量/占位符的奇怪问题而无法验证存档【英文标题】:Xcode - failing to validate archive due to weird issues with resolving variables/placeholders in info.plist and entitlements 【发布时间】:2015-02-25 03:17:53 【问题描述】:我的项目或 Xcode 确实出了点问题,两天以来我一直在努力弄清楚发生了什么。
我的应用程序运行良好,它是一个 OS X 应用程序,它包含一个 Today Widget 扩展。我最近完成了项目,现在由于验证错误而无法发布应用程序。
从验证器抱怨我的应用程序组开始,我用它在主应用程序和小部件扩展之间共享内容。该组被定义为$(TeamIdentifierPrefix)com.acme.GreatApp
。
验证器抱怨我的组名格式错误,应该以我的 TEAMID 开头。绕圈跑了 3 个小时后,我将占位符 $(TeamIdentifierPrefix)
替换为我的团队 ID(例如 S3F45A5S35.
)——这很奏效。
然后验证器抱怨我的info.plist
和权利文件中的所有其他占位符,例如$(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。
所以我想也许 Apple 只是在最近的更新中对其进行了改进,而您只是无法验证带有扩展名的应用程序。所以我在网上搜索了一个非常好的例子Today-Scripts。我将应用程序组($(TeamIdentifierPrefix)com.acme.Today-Scripts
,此处的占位符完美地工作)添加到所有目标,激活沙盒,更改证书和配置文件:它完美验证!
所以我比较了所有的构建设置等。除了我必须用它们的实际值替换占位符,显然是证书和配置文件,以及在 Today-Scripts 中有一个额外的 XPC 目标嵌入到小部件,它们在原子上是相同的。 每个 单个 设置都是一样的。
我清除了所有缓存,真的很难。清理了项目,清除了~/Library/Developer/Xcode/DerivedData
和~/Library/Caches/com.apple.dt.Xcode
,重启了几次,都没有用。
我真的很绝望,因为我不知道自己能做什么。请有人解释一下 Xcode 在这里做什么以及为什么。
-
是什么导致 Xcode 无法解释
info.plist
和权利文件中的所有占位符?
当我使用这些bundle
错误时,怎么会发生
XCode 通过创建新的 cocoa 应用并添加扩展目标创建的确切设置?
与 Today-Scripts 示例完全相同的设置/依赖项?
【问题讨论】:
现在又回到了错误消息中占位符被解析的状态。我再次删除了所有证书,这次重命名了捆绑 ID。之前是GreatApp
,现在是小写greatapp
。必须以某种方式与证书/配置文件相关。但是上面的捆绑错误仍然阻止我验证/发布。
【参考方案1】:
我终于找到了罪魁祸首!问题是,由于某种我无法解释的原因,扩展的info.plist
是主应用程序的成员(目标成员)。我刚刚发现,通过逐个文件分析创建的存档文件并在GreatApp.app/Contents/Resources
文件夹中发现了一个额外的info.plist
。在该文件中,占位符未解析。然后存档验证器使用此info.plist
进行验证。
那个小复选框花了我 3 天的时间。
【讨论】:
我遇到了同样的问题,我的 Helper 应用程序的 Info.plist 被 Xcode 添加到 Build Phases 的 Copy Bundle Resources 部分中。 非常感谢您的帮助。我花了五个多小时创建一个新项目并逐个文件传输文件,却发现其中一个文件夹包含一个额外的 info.plist。【参考方案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 AdobeCP
错误信息消失了。
【讨论】:
【参考方案3】:我最终看到了这篇文章,因为我遇到了类似的错误,但原因不同。我的问题是由于有一个 WatchKit 应用程序并且在我的“运行脚本”阶段之后有“嵌入手表内容”构建阶段。一旦我将“嵌入监视内容”构建阶段移动到“复制捆绑资源”和“嵌入框架”之间,WatchKit 的验证就成功了。
【讨论】:
以上是关于Xcode - 由于解决 info.plist 和权利中的变量/占位符的奇怪问题而无法验证存档的主要内容,如果未能解决你的问题,请参考以下文章
Xcode 10 storyboard和info.plist git diff没有正确显示