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

问题描述 投票:520回答:22

此崩溃一直是阻塞问题我使用以下步骤重现此问题:

  • 创建一个Cocoa Touch Framework项目
  • 添加一个swift文件和一个类Dog
  • 构建设备框架
  • 在Swift中创建单视图应用程序
  • 将框架导入到app项目中
  • 从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中形成Required to Optional,但它并没有完全解决问题,当我创建Dog实例时应用程序崩溃了。设备和模拟器的行为是不同的,我怀疑我们不能使用Xcode的beta版本为设备分发框架。任何人都可以阐明这一点吗?

ios swift crash xcode6 dyld
22个回答
937
投票

在目标的“常规”选项卡中,有一个“嵌入二进制文件”字段。当您添加框架时,崩溃就会得到解决。

参考是Apple Developer Forums上的here


9
投票

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


8
投票

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

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

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

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

所以在链接处理阶段,它指示主机App在运行时从/Library/Frameworks/fw.Framework/fw(如文件系统的根目录)动态加载它,而不是路径到App/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值。


7
投票

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

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

Target General Linked Frameworks and Libraries Watchkit.framework Optional


7
投票

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

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


6
投票

enter image description here

通过在Build Phases-> Embed Frameworks上取消选择“仅在安装时复制”解决了我的问题


5
投票

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


3
投票

在我的例子中,我的项目是由objective-c编写的,在库中有Swift文件。所以我在项目的Build Settings选项卡中将“Always Embed Swift Standard Libraries”改为Yes,它变得完全没问题。


2
投票

如果有开发pod从模拟器安装中删除你的应用程序 - >清理 - >再次运行...


2
投票

同样的事情是我创建了一个新的配置和构建方案。

所以我的解决方案就是运行

pod install

对于这个新创建的配置。


1
投票

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


244
投票

For iOS greater than or equal to 8

在目标的“常规”选项卡下,在“嵌入式​​二进制文件”部分中添加框架。这会将框架复制到已编译的框架中,以便在运行时链接到该框架。

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

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

For iOS less than 8

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

方法:在框架的Build Setting选项卡下,在Linking部分中将Mach-O Type更改为Static Library。您现在不需要在嵌入式二进制文件下包含该框架。

包括资产:要包含诸如图像,音频或xib / nib文件之类的东西,我建议创建一个包(本质上是一个目录,这里有更多信息bit.ly/ios_bundle),然后使用NSBundle从包中加载资产。


1
投票

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


0
投票
  1. 转到xcode中的文件 - >工作区设置
  2. 单击/ Users / apple / Library / Developer / Xcode / DerivedData旁边的箭头
  3. 选择派生数据并将其移至废纸篓。
  4. 相当于xcode并重新打开它。
  5. 清理项目并再次运行。

以上步骤解决了我的问题。


-2
投票

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

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


97
投票

只需将框架拖入项目就不够好了。这就像在同一个球场,但无法找到你的孩子。跟着这些步骤:

1)创建您的框架

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

enter image description here

2)访问您的框架

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

enter image description here

  • 右键单击您的.framework并选择“Show in Finder”。

enter image description here

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

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

enter image description here

4)为框架配置app项目

  • 选择项目中的顶级

enter image description here

  • 选择你的目标

enter image description here

  • 转到“Build Phases”,然后“Link Binary with Libraries”,并确保您的框架包含在可选的选项中。

enter image description here

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

enter image description here

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

enter image description here

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

enter image description here

  • 确保您的框架包含在“复制代码签名”中。

enter image description here

5)清洁,然后运行您的项目

  • COMMAND SHIFT + + K
  • COMMAND + R

46
投票

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

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

enter image description here


45
投票

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

看看这个截图:

enter image description here

希望有所帮助!


26
投票

我在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来解决了这个问题。


25
投票

我不得不(在此处提到的内容)将以下行添加到Build Settings选项卡下的Runpath Search Paths: @executable_path/Frameworks


24
投票

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

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

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


13
投票

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

然后清理并构建。

© www.soinside.com 2019 - 2024. All rights reserved.