Answers:
原来该错误与使用Swift相关(应用程序和扩展都使用Swift)。
对于该应用程序,我必须设置:
Embedded Content Contains Swift Code: YES
对于扩展:
Embedded Content Contains Swift Code: NO
Xcode 8和9
看起来这已Always Embed Swift Standard Libraries
在Xcode 8和9中重命名为。因此,对于该应用程序:
Always Embed Swift Standard Libraries: YES
对于扩展:
Always Embed Swift Standard Libraries: NO
@executable_path/../../Frameworks
对我而言唯一有效的解决方案是将此运行脚本添加到App Extension目标中:
cd "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/"
if [[ -d "Frameworks" ]]; then
rm -fr Frameworks
fi
dyld: Library not loaded: ... Image not found
有人可以帮助我吗?
因此,从构建设置中修复此问题的3个步骤
Embedded Content Contains Swift Code: YES
Embedded Content Contains Swift Code: NO
@executable_path/../../Frameworks
就我而言,我刚刚升级到CocoaPods 1.0.1,这似乎是一个新错误。
Pod更新将运行脚本添加到我的扩展程序的目标中,该脚本创建了Frameworks文件夹。我在添加@Roman的运行脚本以将其删除时找到了它。
解决方案是从我的扩展程序的构建阶段删除此脚本。这是需要去的那个...
1.1.0.rc.2
为我解决问题。
删除标题中包含单词的扩展程序的每个构建阶段embed
。
另外:
Yes
为扩展目标。上面的答案对我都不起作用。这是因为错误不是由父应用程序或其扩展引起的。而是链接的库之一出错了。
要确认,请先使用Xcode存档,然后使用管理器选择条目,然后使用在Finder中显示定位。这将显示.xcarchive
文件。
选择该文件,然后选择“显示包内容”。
在“产品/应用程序”文件夹中选择.app,然后再次选择“显示软件包内容”。
在Frameworks文件夹中找到有问题的模块。例如,如果错误是:
ERROR ITMS-90206: "Invalid Bundle. The bundle at 'MyApp.app/Frameworks/MyLib.framework' contains disallowed file 'Frameworks'."
然后在Frameworks/MyLib.framework
以下内容中将可能可见:
../Frameworks/libswiftContacts.dylib
../Frameworks/libswiftCore.dylib
../Frameworks/libswiftCoreData.dylib
../Frameworks/libswiftCoreGraphics.dylib
../Frameworks/libswiftCoreImage.dylib
../Frameworks/libswiftCoreLocation.dylib
../Frameworks/libswiftDarwin.dylib
../Frameworks/libswiftDispatch.dylib
../Frameworks/libswiftFoundation.dylib
../Frameworks/libswiftLocalAuthentication.dylib
../Frameworks/libswiftObjectiveC.dylib
../Frameworks/libswiftPassKit.dylib
../Frameworks/libswiftUIKit.dylib
../Frameworks/libswiftWebKit.dylib
存在这些是因为父应用程序包括的链接库(或模块)具有 EMBEDDED_CONTENT_CONTAINS_SWIFT = YES;
在Xcode中找到从属模块并更新标志:
请注意,克服了这个问题后,该应用仍可能会被iTunes Store拒绝,并附上一封说明性电子邮件:
Invalid Swift Support - The Watch OS application has Swift libraries at both...
再次回到EMBEDDED_CONTENT_CONTAINS_SWIFT
标志。确保只有父应用程序将此设置为YES
。WatchKit应用程序和扩展程序都必须将此标志设置为NO
。如上面@Mike的答案中所述。
如果Embed Pods Frameworks脚本和Roman脚本都存在于同一目标中。
请检查Embed Pods Frameworks是否位于另一个框架之前。如果没有,只需将Roman的脚本移到最后。
我发现了很多这样的问题,没有一个可以帮助我解决问题,因此希望这可以对某人有所帮助。
我正在创建一个具有Intent扩展名(用于Siri快捷方式)的应用程序,并且我正在使用一个框架,用于扩展名和我的应用程序之间的代码共享(如Apple所推荐)。
我已经在目标的“常规”设置的“框架和库”部分的扩展中添加了框架。在此处添加框架时,将有两列。一个说框架的名称,另一个说“嵌入”。“嵌入”列中没有任何显示,因此我认为还可以,但是我必须为我的框架的该列明确选择“不嵌入”选项。当我这样做并存档到Xcode中时,我可以在验证过程中看到该框架不再在我的ipa内容中的每个目标下列出了,只是一次,验证终于成功了。
我第一次使用具有今日扩展功能的应用程序的XCode 7.1.1遇到了这个问题(我的项目中没有Swift)。该脚本(https://github.com/CocoaPods/CocoaPods/issues/4203)对我不起作用。
将cocoapods降级为0.39.0.beta.3版本,运行pod install
,然后重新存档解决了该问题。