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 到底在做什么以及为什么。
- 什么原因导致 Xcode 无法解释
info.plist
和权利文件中的所有占位符?
- 当我使用
- 通过创建新 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 的验证就成功了。
我的项目或 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 到底在做什么以及为什么。
- 什么原因导致 Xcode 无法解释
info.plist
和权利文件中的所有占位符? - 当我使用
- 通过创建新 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 的验证就成功了。