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

 佳佳的梦Aas 发布于 2023-01-08 12:29

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

创建一个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分发设备框架.任何人都可以阐明这一点吗?

16 个回答
  • 首先尝试在Command + Option + Shift + K之后构建.如果仍然失败则执行以下步骤.

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

    在此输入图像描述

    2023-01-08 12:29 回答
  • 我不得不(在此处提到的内容)将以下行添加到Build Settings选项卡下的Runpath搜索路径:
    @executable_path/Frameworks

    在此输入图像描述

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

    看看这个截图:

    在此输入图像描述

    希望有所帮助!

    2023-01-08 12:30 回答
  • 对于大于或等于8的iOS

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

    在此输入图像描述

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

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

    对于iOS小于8

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

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

    静态框架

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

    2023-01-08 12:30 回答
  • 您需要将框架添加到新的复制文件构建阶段,以确保在运行时将框架复制到应用程序包中.

    有关详细信息,请参阅如何向我的目标添加"复制文件构建阶段".

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

    2023-01-08 12:30 回答
  • 在嵌入式二进制文件中添加框架 在此输入图像描述

    然后清理并构建.

    2023-01-08 12:30 回答
  • 在目标的" 常规"选项卡中,有一个" 嵌入二进制文件"字段.当您添加框架时,崩溃就会得到解决.

    参考是这里的苹果开发者论坛.

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

    2023-01-08 12:30 回答
  • 如果您使用的是第三方框架,并使用Cocoapods作为依赖管理器,请尝试执行a pod install刷新您的pod.

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

    2023-01-08 12:31 回答
  • 只需将框架拖入项目就不够好了.这就像在同一个球场,但无法找到你的孩子.跟着这些步骤:

    1)创建您的框架

    开发您的框架.

    开发完成后,COMMAND+ B构建您的框架并确保您收到"Build Succeeded".

    在此输入图像描述

    2)访问您的框架

    一旦您的框架项目成功构建,它就可以让您Products在项目的文件夹中进行访问.

    在此输入图像描述

    右键单击您的.framework并选择"在Finder中显示".

    在此输入图像描述

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

    .frameworkFinder窗口拖放到应用项目的"Framework"文件夹中.

    在此输入图像描述

    4)为框架配置app项目

    选择项目中的顶级

    在此输入图像描述

    选择你的目标

    在此输入图像描述

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

    在此输入图像描述

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

    在此输入图像描述

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

    在此输入图像描述

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

    在此输入图像描述

    确保您的框架包含在"复制代码签名"中.

    在此输入图像描述

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

    COMMAND+ SHIFT+K

    COMMAND+R

    2023-01-08 12:31 回答
  • 令人惊讶的是,并非所有必要的部分都记录在这里,至少对于Xcode 8而言.

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

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

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

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

    对于所有其他设置:它确实必须在3个地方Build Phases,但这些均一次设置时,你只是把它添加到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错误地设置我的值.

    2023-01-08 12:31 回答
  • 我的环境:Cocos2d 2.0,Box2d,Objective C

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

    目标常规链接框架和库Watchkit.framework可选

    2023-01-08 12:31 回答
  • 我在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,以OptionalLinked Frameworks and LibrariesUserNotifications.framework框架.

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

    2023-01-08 12:33 回答
  • 通过在构建阶段->嵌入式框架上取消选择“仅在安装时复制”来为我解决

    2023-01-08 12:33 回答
  • 如果您使用的是Xcode 11或更高版本

      导航到目标的设置,然后选择“ 常规”

      向下滚动到Frameworks,Libraries和Embedded Content

      如果需要,请确保为“ 嵌入”选项选择了“ 嵌入并签名”或“ 没有签名的嵌入”值。

    2023-01-08 12:33 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有