带有框架的iOS应用程序崩溃在设备上,dyld:未加载库,Xcode 6 Beta

时间:2014-06-20 19:00:40

标签: ios swift crash xcode6 dyld

这次崩溃是一个阻塞问题,基本上我使用以下步骤重现问题:

  • 创建Cocoa Touch Framework项目
  • 添加swift文件和类 Dog
  • 构建设备框架
  • 在Swift中创建单一视图应用程序
  • 将框架导入应用项目
  • 从ViewController
  • 中的框架实例化swift类
  • 在设备上构建和运行应用

应用程序在启动时立即崩溃,这是控制台日志:

dyld: Library not loaded: @rpath/FrameworkTest03.framework/FrameworkTest03
  Referenced from: /var/mobile/Applications/FA6BAAC8-1AAD-49B4-8326-F30F66458CB6/FrameworkTest03App.app/FrameworkTest03App
  Reason: image not found

我试图在iOS 7.1和8.0设备上构建,它们都有相同的崩溃。但是我可以构建应用程序并在模拟器上运行良好。另外我知道我可以将框架从必需更改为 Link Binary With Libraries 中的 Optional ,但它并没有完全解决问题,当我创建一个 Dog 的实例时,应用程序崩溃了。设备和模拟器的行为是不同的,我怀疑我们不能使用Xcode的beta版本为设备分发框架。有人能说清楚这个吗?

33 个答案:

答案 0 :(得分:921)

在目标的常规标签中,有一个嵌入式二进制文件字段。当你添加框架时,崩溃就解决了。

Apple Developer论坛上的参考是here

答案 1 :(得分:243)

对于iOS大于或等于8

在目标常规标签下的嵌入式二进制文件部分中添加框架。这会将框架复制到编译中,以便在运行时链接到它。

enter image description here

为什么会这样? :因为您链接到的框架被编译为动态链接框架,因此在运行时链接到该框架。

注意:仅在iOS>中支持嵌入自定义框架因此,以及适用于旧版iOS的替代解决方案如下。

适用于iOS小于8

如果您对此框架有影响(可以访问源代码/构建过程),您可以将此框架更改为静态链接而不是动态链接。这将导致代码包含在已编译的应用程序中,而不是在运行时链接,因此不必嵌入框架。

如何:在框架的“构建设置”选项卡下的“链接”部分中,将 Mach-O类型更改为静态库。您现在不需要在嵌入式二进制文件下包含该框架。

Static Framework

包括资产:要包含图像,音频或xib / nib文件等内容,我建议创建一个包(本质上是一个目录,更多信息,请在bit.ly/ios_bundle中),然后加载使用NSBundle的捆绑资产。

答案 2 :(得分:92)

将框架拖入项目并不够好。这就像在同一个球场,但无法找到你的孩子。请按照以下步骤操作:

1)创建框架

  • 开发您的框架。
  • 开发完成后,COMMAND + B构建您的框架并确保您收到“Build Succeeded”。

enter image description here

2)访问您的框架

  • 成功构建框架项目后,您就可以在项目的Products文件夹中进行访问了。

enter image description here

  • 右键点击.framework并选择“在Finder中显示”。

enter image description here

3)在您的项目中放置框架

  • .framework从Finder窗口拖放到应用项目的“Framework”文件夹中。

enter image description here

4)为框架配置应用项目

  • 选择项目中的顶级

enter image description here

  • 选择目标

enter image description here

  • 转到“构建阶段”,然后“将二进制文件链接到库”,并确保您的框架包含 以及可选的

enter image description here

  • 仍在“构建阶段”中,转到左上角并选择+按钮。在下拉列表中选择“新建复制文件阶段”。

enter image description here

  • 向下滚动到新的“复制文件”部分,并确保将Destination设置为“框架”。将子路径留空。然后单击左下角的+按钮。

enter image description here

  • 您将看到项目层次结构。向下滚动到在步骤3中添加框架的“Frameworks”文件夹,或在顶部的搜索栏中搜索它。选择您的框架,然后单击“添加”。

enter image description here

  • 确保您的框架包含在“选择代码登录”中。

enter image description here

5)清理,然后运行项目

  • COMMAND + SHIFT + K
  • COMMAND + R

答案 3 :(得分:46)

首先尝试在Command + Option + Shift + K之后构建。如果仍然失败,请执行以下步骤。

如果有人在Xcode 8中遇到此错误,请将您的框架状态更改为可选,而不是目标的“常规”标签下的“必需”。

enter image description here

答案 4 :(得分:45)

我使用Swift3 / Xcode 8.1创建了一个框架,并在Objective-C / Xcode 8.1项目中使用它。要解决此问题,我必须在Always Embed Swift Standard Libraries下启用Build Options选项。

看一下这个截图:

enter image description here

希望有所帮助!

答案 5 :(得分:25)

我在iOS 9.x版本中遇到了同样的问题

ISSUE IS: App crashes as soon as I open the app with below error.

dyld: Library not loaded: /System/Library/Frameworks/UserNotifications.framework/UserNotifications Referenced from: /var/containers/Bundle/Application/######/TestApp.app/TestApp Reason: image not found

我已在Required框架的Optional中将Linked Frameworks and Libraries更改为UserNotifications.framework,从而解决了此问题。

答案 6 :(得分:25)

我必须(在此处提到的内容之外)将以下行添加到构建设置标签下的运行路径搜索路径
@executable_path/Frameworks

enter image description here

答案 7 :(得分:24)

您需要将框架添加到新的复制文件构建阶段,以确保在运行时将框架复制到应用程序包中。

有关详细信息,请参阅How to add a 'Copy Files build phase' to my Target

官方Apple文档:https://developer.apple.com/library/mac/recipes/xcode_help-project_editor/Articles/CreatingaCopyFilesBuildPhase.html

答案 8 :(得分:13)

在嵌入式二进制文件中添加框架 enter image description here

然后清理并建立。

答案 9 :(得分:9)

在我的情况下,解决方案是从嵌入式二进制文件中删除已编译的框架,嵌入式二进制文件是工作区中的独立项目,清理并重建它,最后重新添加到嵌入式二进制文件。

答案 10 :(得分:8)

令人惊讶的是,这里并未记录所有必要的部分,至少对于Xcode 8而言。

我的案例是一个定制的框架,作为同一个工作区的一部分。事实证明它正在被错误地构建。基于jeremyhu对此主题的最后回应:

https://forums.developer.apple.com/thread/4687

我必须在 Framework Dynamic Library Install Name Base下设置DYLIB_INSTALL_NAME_BASEBuild Settings),然后重新构建它。它被错误地设置为$(LOCAL_LIBRARY_DIR),我不得不将其更改为@rpath

所以在链接处理阶段,它指示主机App在运行时从/Library/Frameworks/fw.Framework/fw(如文件系统的根目录)而不是路径到应用程序<动态加载它 /Frameworks/fw.Framework/fw

关于所有其他设置: 必须位于Build Phases中的3个位置,但是当您将其添加到Embedded Binaries时,这些都会立即设置设置托管应用的General标签。

我做了必须设置一个额外的Copy Files阶段,无论如何这对于嵌入阶段来说似乎是直觉上多余的。通过检查构建记录的尾部,我们可以确保没有必要。

PBXCp /Users/xyz/Library/Developer/Xcode/DerivedData/MyApp-cbcnqafhywqkjufwsvbzckecmjjs/Build/Products/Debug-iphoneos/MyFramework.framework

[删除了许多冗长的行,但从Xcode UI中的简化记录中可以清楚地看出。]

我仍然没有想法为什么Xcode会错误地设置DYLIB_INSTALL_NAME_BASE值。

答案 11 :(得分:8)

如果您使用的是 Xcode 11或更高版本

  1. 导航至目标设置,然后选择常规

Target Settings/General

  1. 向下滚动到框架,库和嵌入式内容

  2. 确保为 Embed (嵌入)选项选择了 Embed&Sign (嵌入并签名)或 Embed Without Signing(未签名的嵌入)值。

Frameworks, Libraries and Embedded Content section

答案 12 :(得分:8)

最近在较旧的iPhone(例如iPhone 6)和Xcode(11.3.1)上导入CoreNFC时遇到了此问题。我能够通过它来工作

  1. 在您的项目中,选择目标。
  2. 转到顶部的常规标签。
  3. 在“ 框架,库和嵌入式内容”部分下,添加框架(对我来说是CoreNFC)。重复其他目标。
  4. 点击顶部的构建阶段,然后展开“ 将二进制文件与库链接”。
  5. 将麻烦的框架设为可选(必需)。

这使我可以在不进行任何代码更改的情况下针对较旧/较新的iPhone进行编译。我希望这对其他人有帮助。

答案 13 :(得分:7)

如果您使用的是第三方框架,并使用Cocoapods作为您的依赖管理器,请尝试执行pod install刷新您的广告连播。

这次崩溃发生在我使用的第三方库上,很高兴上述解决方案对我有用,希望它对您有用!

答案 14 :(得分:7)

我的环境:Cocos2d 2.0,Box2d,Objective C

除了做上面的其他答案之外,我终于进入了General选项卡并使WatchKit可选。

Target General Linked Frameworks and Libraries Watchkit.framework Optional

答案 15 :(得分:5)

我有同样的问题。我尝试使用之前从未使用过的iPhone构建我的项目,但我没有添加新的框架。对我来说,清理工作正常( Shift + Command + K )。也许是因为我使用了Xcode 7的beta 5和iOS 9 Beta的iPhone 6,但它确实有效。

答案 16 :(得分:5)

enter image description here

通过在构建阶段->嵌入式框架上取消选择“仅在安装时复制”来为我解决

答案 17 :(得分:4)

对于Xcode中使用Pod的任何项目或Framework项目,避免不加载动态库(dylb)的一种简单方法是将pod文件设置为静态模式。为此,请确保不要在pod文件中写以下行。

use_frameworks!

将行从保存的文件中删除后,只需从控制台运行:

$ pod update

答案 18 :(得分:3)

简单的解决方案是按照此屏幕截图进行操作,然后崩溃将消失:

enter image description here

注意:这是Xcode 11.5

答案 19 :(得分:2)

如果有开发pod从pod中的模拟器安装中删除你的应用程序 - &gt;干净 - &gt;又跑了......

答案 20 :(得分:2)

就我而言,我的项目是由Objective-C编写的,并且在库中有Swift文件。因此,我在项目的 Build Settings 标签中将“始终嵌入Swift标准库” 更改为,这完全没问题。

答案 21 :(得分:1)

对于 SumUp 用户,如果您正在加载最新的 SumUpSDK.xcFramework,那么您需要确保在 Target 的应用程序的常规选项卡中将其设置为“嵌入和签名”。

即把上面的说法倒过来(更容易理解):

  1. 转到“项目导航器”(即显示所有项目项等的第一个图标)

  2. 从树的顶部选择您的项目。

  3. 在页面中间的菜单上(稍微向右),在“目标”下选择您的应用程序

  4. 从顶部选项卡中,选择“常规”

  5. 向下滚动到“框架、库和嵌入内容”

  6. 从列表中选择您的 Lib

  7. 从旁边的下拉列表中选择“嵌入并签名”。

  8. 干净

  9. 重新构建并运行。

我希望这会有所帮助。

H

答案 22 :(得分:1)

对我来说,我必须将 XcodeKit.framework 从“不嵌入”->“嵌入并签名”切换成

enter image description here

答案 23 :(得分:1)

这是由Dynamic Linker

引起的运行时错误
dyld: Library not loaded: @rpath/...
...
Reason: image not found

带有Library not loaded [About]的错误@rpath表示Dynamic Linker无法找到框架。

  1. 检查是否已将框架添加到General -> Embedded Binaries

  2. 检查@rpath-Build Settings -> Runpath Search Paths是否包含与Build Phases -> Embed Frameworks -> Destination, Subpath中设置的目标/子路径相同的路径

答案 24 :(得分:1)

Xcode 11

  1. 导航至目标设置,然后选择“常规”。
  2. 寻找“框架,库和嵌入式内容”
  3. 保持“请勿嵌入”,并确保所有目标(如果您有多个目标)仅设置了自己的框架,而没有设置其他目标。

答案 25 :(得分:1)

尝试在“构建设置”中将标志ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES(在早期的xcode版本:Embedded Content Contains Swift Code中)从“否”更改为“是”。

答案 26 :(得分:1)

同一件事是当我创建新的配置和构建方案。

所以对我来说解决方案是运行

pod install

此新创建的配置。

答案 27 :(得分:1)

尝试了Internet上所有可用的方法以及我自己的反复试验技巧100次后。终于我解决了。 – 6分钟前Apeksha Sahu
在Mac中转到iTunes->帐户->授权此计算机– Apeksha Sahu 5分钟前
第二步。...在iPad和iPhone中转到设置中的开发人员,并使用标识符重新索引并清除信任计算机的所有内容。它对我有用...............从Mac OS seirra beta最新版本重新安装Mac OSHigh seria 10.13.15版本之后,更新所有证书后重新安装Xcode最新版本。等等等等等等...你可以想到的很多方法。 – enter image description here

答案 28 :(得分:0)

Xcode 11

我面临着同样的问题

“常规”选项卡中更改“请勿嵌入” > “框架,库和嵌入式内容” 仍会导致相同的错误。

为我解决的是在 Build Phases选项卡> Embed Frameworks部分

中添加 Framework

-更新----

我观察到在Xcode 11中运行时,在以前版本的Xcode Embed Frameworks Section 中构建的项目不可用,请找到以下步骤以实现解决方案:

1:首先需要在 Build Phases (构建阶段)标签下添加 New Copy Files阶段

enter image description here

2:第二步,将添加阶段的名称更改为 Embed Frameworks enter image description here

3:将目的地更改为 Framework

enter image description here

4:添加发生错误的框架。

enter image description here

答案 29 :(得分:0)

尽管每个人都说要将该框架嵌入到Embedded Binaries(嵌入式二进制文件)下,但仍然无法正常工作,因为我们在这里缺少重要的一步。

以下是在“嵌入式​​二进制文件”选项卡下添加二进制文件的正确两个步骤:

  1. 从“常规”选项卡下的“链接的框架和库”中删除给出错误的框架。

  2. 现在仅在“嵌入式​​二进制文件”选项卡下添加已删除的框架,这就是所有要做的事情。

在设备上运行并保持微笑;)

答案 30 :(得分:0)

在我的情况下,应用程序崩溃仅在真实设备上发生,并且发生在标准库中。 在尝试1h之后,我尝试了很多步骤,只需从真实设备中删除应用程序,然后重新安装即可。

答案 31 :(得分:0)

  1. 转到xcode中的文件 - &gt;工作区设置
  2. 点击/ Users / apple / Library / Developer / Xcode / DerivedData
  3. 旁边的箭头
  4. 选择派生数据并将其移至“已删除邮件”。
  5. 相当于xcode并重新打开它。
  6. 清理项目并再次运行。
  7. 以上步骤解决了我的问题。

答案 32 :(得分:-2)

如果有人仍然遇到此问题,尽管遵循了许多其他答案中列出的所有步骤,您可能需要撤消重新创建代码签名证书,按照以下方式:

https://developer.apple.com/library/ios/qa/qa1886/_index.html