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

iOS app with framework crashed on device, dyld: Library not loaded, Xcode 6 Beta

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

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

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

1
2
3
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设备上进行构建,它们都有相同的崩溃。但是我可以构建应用程序并在模拟器上运行。另外,我也知道我可以在链接二进制库中将框架从必选改为可选,但它并没有完全解决这个问题,当我创建一个dog实例时,应用程序崩溃了。在设备和模拟器上的行为是不同的,我怀疑我们不能使用Xcode的beta版本为设备分发框架。有人能解释一下吗?


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

参考资料在苹果开发者论坛上。


对于大于或等于8的iOS

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

enter image description here

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

注意:嵌入自定义框架仅在iOS>8中受支持,因此,在旧版本的iOS上工作的替代解决方案如下。

iOS低于8

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

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

Static Framework

包括资产:为了包括图像、音频或XIB/NIB文件等内容,我建议创建一个包(基本上是一个目录,这里有更多信息bit.ly/ios_包),然后使用nsbundle从包中加载资产。


仅仅将框架拖到项目中是不够好的。这就像是在同一个棒球场,但找不到你的孩子。遵循以下步骤:

1)创建框架

  • 开发你的框架。
  • 一旦您的开发完成,COMMANDB-构建您的框架,并确保您获得"构建成功"。

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
  • 江户十一〔18〕号+江户十一〔30〕号


首先尝试在command+option+shift+k之后构建。如果仍然失败,请执行以下步骤。

如果有人在Xcode8中遇到此错误,请将您的框架状态更改为可选,而不是在目标的常规选项卡下所需的状态。

enter image description here


我使用swift3/xcode 8.1创建了一个框架,并在一个objective-c/xcode 8.1项目中使用它。为了解决这个问题,我必须启用Build Options下的Always Embed Swift Standard Libraries选项。

看看这个屏幕截图:

enter image description here

希望有帮助!


我不得不(除了这里提到的)在构建设置选项卡下的运行路径搜索路径中添加以下行:@executable_path/Frameworks

enter image description here


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

1
2
3
4
5
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

我通过在Linked Frameworks and Libraries中为UserNotifications.framework框架将Required改为Optional来解决这个问题。


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

有关详细信息,请参阅如何将"复制文件生成阶段"添加到我的目标。

苹果官方文档:https://developer.apple.com/library/mac/recipes/xcode_help-project_editor/articles/creatingacopyfilesbuildphase.html


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

然后清理并建造。


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


如果您使用的是第三方框架,并且使用cocoapods作为依赖关系管理器,请尝试执行pod install来刷新pods。

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


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

我的案例是一个定制的框架,作为同一工作区的一部分。结果发现它是错误建造的。基于Jeremyhu对这条线索的最后回应:

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

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

因此,在链接处理阶段,它指示宿主应用程序在运行时从/Library/Frameworks/fw.Framework/fw(如文件系统的根目录)动态加载它,而不是从path-to-app /Frameworks/fw.Framework/fw

关于所有其他设置:它必须位于Build Phases中的3个位置,但当您将其添加到宿主应用程序的General选项卡的Embedded Binaries设置时,这些设置都会同时设置。

我不需要设置一个额外的Copy Files阶段,不管怎样,对于嵌入阶段来说,这看起来似乎是多余的。通过检查构建脚本的尾部,我们可以确保这不是必需的。

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

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

我仍然不知道为什么Xcode在我身上设置了错误的DYLIB_INSTALL_NAME_BASE值。


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

除了做上面的其他回答之外,我最终转到了"常规"选项卡,并使Watchkit成为可选的。

Target General Linked Frameworks and Libraries Watchkit.framework Optional


我也有同样的问题。我尝试用我以前从未用过的iPhone来构建我的项目,但我没有添加新的框架。对我来说,清理工作做得很好(shift+command+k)。也许是因为我用的是Xcode7的beta 5和iOS9的iphone 6,但它起作用了。


enter image description here

在构建阶段取消选择"仅在安装时复制"解决了这个问题->嵌入框架


如果有开发舱,从模拟器上删除你的应用安装舱->清洁->再次运行…


在尝试了互联网上所有可用的方法和我自己的试错技巧100次之后。最后我终于解决了。–6分钟前的阿佩克莎·萨胡转到Mac->帐户中的iTunes->授权此计算机-5分钟前的apeksha sahu第二步….在ipad和iphone的设置中转到开发人员,用标识符重新索引,并清除信任计算机的所有内容。对我有用…………在更新所有证书后,从Mac OS Seirra Beta最新版本重新安装Mac Oshigh seria 10.13.15版本,到重新安装Xcode最新版本。等…尽可能多的方法。—enter image description here


在我的例子中,我的项目是由Objective-C编写的,在库中有Swift文件。所以我将项目的"构建设置"选项卡中的"始终嵌入Swift标准库"改为"是",一切都正常了。


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

所以我的解决办法是

1
pod install

对于这个新创建的配置。


  • 转到xcode->workspace settings中的文件
  • 单击显示的箭头/users/apple/library/developer/xcode/deriveddata
  • 选择派生数据并将其移到垃圾桶中。
  • 关闭xcode并重新打开它。
  • 清理项目并再次运行。
  • 以上步骤解决了我的问题。


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


    如果任何人仍然遇到此问题,尽管遵循了许多其他答案中列出的所有步骤,您可能需要根据以下内容吊销并重新创建代码签名证书:

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


    对于那些修复不起作用的人,尝试将操作系统更新到约塞米蒂。对我有用!