如果不是从 xcode 运行,iOS 应用程序缺少 DYLD

Posted

技术标签:

【中文标题】如果不是从 xcode 运行,iOS 应用程序缺少 DYLD【英文标题】:iOS app is missing DYLD if not run from xcode 【发布时间】:2021-01-01 02:50:12 【问题描述】:

如果我从 Xcode 12.3 运行我的应用程序,我可以在我的 Iphone 11 上启动它。但是在手机上运行该应用程序会失败。设备日志在我正在使用的包 (Mocker) 中给出以下错误:

Termination Description: DYLD, dyld: Using shared cache: 
EEFDD874-2301-31BF-B255-11CE61E827BD | dependent dylib 
'@rpath/XCTAutomationSupport.framework/XCTAutomationSupport'
 not found for 
'/private/var/containers/Bundle/Application/
E5F4D064-2097-4978-AFB5-954DC355F686/Things.app/Frameworks/
Mocker.framework/Frameworks/XCTest.framework/XCTest', tried but didn't find: 
'/usr/lib/swift/XCTAutomationSupport.framework/XCTAutomationSupport' 
'/private/var/containers/Bundle/Application/
E5F4D064-2097-4978-AFB5-954DC355F686/Things.app/Frameworks/
XCTAutomationSupport.framework/
XCTAutomationSupport' 
'/private/var/containers/Bundle/Application/E5F4D064-2097-4978-AFB5-
954DC355F686/Things.app/Frameworks/Mocker.framework/Frameworks/
XCTAutomationSupport.
framework/XCTAutomationSupport' '@rpath/XCTAutomationSupport.framework/
XCTAutomationSupport' 
'/System/Library/Frameworks/XCTAutomationSupport.framework/
XCTAutomationSupport'

显然,这是一个根据规范可以找到或找不到某些包的问题。我将如何前进?如果可能的话,我希望了解这种情况是如何发生的 - 是什么导致库在从手机运行而不是从 Xcode(在同一部手机上)启动时变得不可用?

【问题讨论】:

你不应该在设备上运行单元测试——你确定你没有在应用程序目标(不是测试目标)中导入模拟程序吗?从主应用程序中删除这些导入 如果您按照我的回答here 中的描述禁用某些方案设置,您也可以确认这是一个 Xcode 运行时错误,并且它可以工作。 @PranavKasetti 谢谢,将检查您的其他 SO 答案。在第一条评论中,我认为在我的手机上使用 Mocker 有很好的用例。例如,我可能有一个设置,我在我的设备上模拟 api 以更快地运行应用程序。我没有看到任何关于 Mocker 的情况排除这种情况(github.com/WeTransfer/Mocker)。显然你更了解这一点,所以如果我误解了包装,请纠正。 Mocker 依赖于 XCTest 并且要让 XCTest 链接到应用程序目标需要更多的设置和配置 - 如果我们不修改项目链接的框架,将找不到库。你按照here的步骤操作了吗? 通常你可以在测试目标中使用 Mocker,并在设备上运行它没有问题(尽管为了自动化/CI 和更快的结果我使用 sims) - 在应用程序目标上运行测试更多工作,假设 Apple 对 ios 设备上的文件系统进行沙盒处理。 【参考方案1】:

这在运行时而不是编译时失败的原因是 Mocker 试图找到 XCTest 动态库 - 这些仅在运行时加载。

Application Bundle 中缺少框架 - 可以从错误日志中看到:

not found for 
'/private/var/containers/Bundle/Application/
E5F4D064-2097-4978-AFB5-954DC355F686/Things.app/Frameworks/
Mocker.framework/Frameworks/XCTest.framework/XCTest

将 dylib 添加到应用程序目标的链接框架和库中,按照步骤here 操作,还有许多其他与将XCTest.framework 嵌入应用程序目标相关的 SO 问题。

这对于测试目标来说不是问题,因为它们已经被添加到模拟器和设备运行时。

【讨论】:

以上是关于如果不是从 xcode 运行,iOS 应用程序缺少 DYLD的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 6/iOS - 缺少存档和 Info.plist

缺少 Xcode 核心数据模型

Xcode 4.1 中缺少 iOS 5.0?

XCode 5 / ios7:缺少gcno文件

系统中缺少框架,但 Mac/iOS 上的 XCode 中没有

归档 iOS 应用程序时出现 Xcode 错误