首页 文章

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

提问于
浏览
495

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

  • 创建一个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更改为Optional,但它没有完全解决问题,当我创建Dog实例时应用程序崩溃了 . 在设备和模拟器上的行为是不同的,我怀疑我们不能使用测试版的Xcode分发设备框架 . 任何人都可以阐明这一点吗?

21 回答

  • 21

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

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

    Target General Linked Frameworks and Libraries Watchkit.framework Optional

  • 24

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

  • 6

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

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

  • 2

    在目标的 General 选项卡中,有一个 Embedded Binaries 字段 . 当您添加框架时,崩溃就解决了 .

    Apple Developer Forums上的参考是here .

  • -26

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

    有关更多信息,请参阅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

  • 22

    enter image description here

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

  • 7

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

    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) 为框架配置应用程序项目

    • 选择项目中的顶级

    enter image description here

    • 选择目标

    enter image description here

    • 转到"Build Phases",然后转到"Link Binary with Libraries",并确保包含框架 with optional selected .

    enter image description here

    • 仍在"Build Phases"中,转到左上角并选择 + 按钮 . 在下拉列表中选择"New Copy Files Phase" .

    enter image description here

    • 向下滚动到新的"Copy Files"部分,并确保将 Destination 设置为"Frameworks" . 将子路径留空 . 然后单击左下角的 + 按钮 .

    enter image description here

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

    enter image description here

    • 确保您的框架包含"Code Sign On Copy"已选中 .

    enter image description here

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

    • COMMAND SHIFT K

    • COMMAND R

  • 887

    尝试了互联网上所有可用的方法和我自己的试错法后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

  • 12

    如果有人仍然遇到此问题,尽管遵循了许多其他答案中列出的所有步骤,您可能需要 revokerecreate your code signing certificate ,如下所示:

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

  • 44

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

    看看这个截图:

    enter image description here

    希望有所帮助!

  • 2

    适用于iOS大于或等于8

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

    enter image description here

    Why is this happening? : 因为您链接到的框架被编译为动态链接框架,因此在运行时链接到该框架 .

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

    适用于iOS小于8

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

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

    Static Framework

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

  • 8

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

    enter image description here

  • 73
    • 转到xcode中的文件 - >工作区设置

    • 单击/ Users / apple / Library / Developer / Xcode / DerivedData旁边的箭头

    • 选择派生数据并将其移至废纸篓 .

    • 相当于xcode并重新打开它 .

    • 清理项目并再次运行 .

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

  • 5

    首先尝试在命令选项Shift K之后构建 . 如果仍然失败,则执行以下步骤 .

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

    enter image description here

  • 6

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

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

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

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

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

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

    我没有必要设置一个额外的 Copy Files 阶段,无论如何,这个阶段在嵌入阶段看起来似乎是多余的 . 通过检查构建记录的尾部,我们可以确保这不是必需的 .

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

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

    我仍然不知道为什么Xcode会错误地设置 DYLIB_INSTALL_NAME_BASE 值 .

  • 1

    同样的事情是我创建了一个新的 Configuration and Build Scheme.

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

    pod install
    

    对于这个新创建的配置 .

  • 235

    对于那些修复无效的用户,请尝试将操作系统更新为Yosemite . 它对我有用!

  • 2

    我在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
    

    我已在 Linked Frameworks and Libraries 框架中将 Required 更改为 Optional 来解决此问题 .

  • 0

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

    然后清理和构建 .

  • 42

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

  • -2

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

相关问题