这次崩溃是一个阻塞问题,基本上我使用以下步骤重现问题:
应用程序在启动时立即崩溃,这是控制台日志:
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版本为设备分发框架。有人能说清楚这个吗?
答案 0 :(得分:921)
在目标的常规标签中,有一个嵌入式二进制文件字段。当你添加框架时,崩溃就解决了。
Apple Developer论坛上的参考是here。
答案 1 :(得分:243)
在目标常规标签下的嵌入式二进制文件部分中添加框架。这会将框架复制到编译中,以便在运行时链接到它。
为什么会这样? :因为您链接到的框架被编译为动态链接框架,因此在运行时链接到该框架。
注意:仅在iOS>中支持嵌入自定义框架因此,以及适用于旧版iOS的替代解决方案如下。
如果您对此框架有影响(可以访问源代码/构建过程),您可以将此框架更改为静态链接而不是动态链接。这将导致代码包含在已编译的应用程序中,而不是在运行时链接,因此不必嵌入框架。
如何:在框架的“构建设置”选项卡下的“链接”部分中,将 Mach-O类型更改为静态库。您现在不需要在嵌入式二进制文件下包含该框架。
包括资产:要包含图像,音频或xib / nib文件等内容,我建议创建一个包(本质上是一个目录,更多信息,请在bit.ly/ios_bundle中),然后加载使用NSBundle的捆绑资产。
答案 2 :(得分:92)
将框架拖入项目并不够好。这就像在同一个球场,但无法找到你的孩子。请按照以下步骤操作:
1)创建框架
COMMAND
+ B
构建您的框架并确保您收到“Build Succeeded”。2)访问您的框架
Products
文件夹中进行访问了。.framework
并选择“在Finder中显示”。3)在您的项目中放置框架
.framework
从Finder窗口拖放到应用项目的“Framework”文件夹中。4)为框架配置应用项目
+
按钮。在下拉列表中选择“新建复制文件阶段”。Destination
设置为“框架”。将子路径留空。然后单击左下角的+
按钮。 5)清理,然后运行项目
COMMAND
+ SHIFT
+ K
COMMAND
+ R
答案 3 :(得分:46)
首先尝试在Command + Option + Shift + K之后构建。如果仍然失败,请执行以下步骤。
如果有人在Xcode 8中遇到此错误,请将您的框架状态更改为可选,而不是目标的“常规”标签下的“必需”。
答案 4 :(得分:45)
我使用Swift3 / Xcode 8.1创建了一个框架,并在Objective-C / Xcode 8.1项目中使用它。要解决此问题,我必须在Always Embed Swift Standard Libraries
下启用Build Options
选项。
看一下这个截图:
希望有所帮助!
答案 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
答案 7 :(得分:24)
您需要将框架添加到新的复制文件构建阶段,以确保在运行时将框架复制到应用程序包中。
有关详细信息,请参阅How to add a 'Copy Files build phase' to my Target。
答案 8 :(得分:13)
答案 9 :(得分:9)
在我的情况下,解决方案是从嵌入式二进制文件中删除已编译的框架,嵌入式二进制文件是工作区中的独立项目,清理并重建它,最后重新添加到嵌入式二进制文件。
答案 10 :(得分:8)
令人惊讶的是,这里并未记录所有必要的部分,至少对于Xcode 8而言。
我的案例是一个定制的框架,作为同一个工作区的一部分。事实证明它正在被错误地构建。基于jeremyhu对此主题的最后回应:
https://forums.developer.apple.com/thread/4687
我必须在 Framework 的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
关于所有其他设置: 必须位于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或更高版本:
向下滚动到框架,库和嵌入式内容。
确保为 Embed (嵌入)选项选择了 Embed&Sign (嵌入并签名)或 Embed Without Signing(未签名的嵌入)值。
答案 12 :(得分:8)
最近在较旧的iPhone(例如iPhone 6)和Xcode(11.3.1)上导入CoreNFC时遇到了此问题。我能够通过它来工作
这使我可以在不进行任何代码更改的情况下针对较旧/较新的iPhone进行编译。我希望这对其他人有帮助。
答案 13 :(得分:7)
如果您使用的是第三方框架,并使用Cocoapods作为您的依赖管理器,请尝试执行pod install
刷新您的广告连播。
这次崩溃发生在我使用的第三方库上,很高兴上述解决方案对我有用,希望它对您有用!
答案 14 :(得分:7)
答案 15 :(得分:5)
我有同样的问题。我尝试使用之前从未使用过的iPhone构建我的项目,但我没有添加新的框架。对我来说,清理工作正常( Shift + Command + K )。也许是因为我使用了Xcode 7的beta 5和iOS 9 Beta的iPhone 6,但它确实有效。
答案 16 :(得分:5)
答案 17 :(得分:4)
对于Xcode中使用Pod的任何项目或Framework项目,避免不加载动态库(dylb)的一种简单方法是将pod文件设置为静态模式。为此,请确保不要在pod文件中写以下行。
use_frameworks!
将行从保存的文件中删除后,只需从控制台运行:
$ pod update
答案 18 :(得分:3)
答案 19 :(得分:2)
如果有开发pod从pod中的模拟器安装中删除你的应用程序 - &gt;干净 - &gt;又跑了......
答案 20 :(得分:2)
就我而言,我的项目是由Objective-C编写的,并且在库中有Swift文件。因此,我在项目的 Build Settings 标签中将“始终嵌入Swift标准库” 更改为是,这完全没问题。
答案 21 :(得分:1)
对于 SumUp 用户,如果您正在加载最新的 SumUpSDK.xcFramework,那么您需要确保在 Target 的应用程序的常规选项卡中将其设置为“嵌入和签名”。
即把上面的说法倒过来(更容易理解):
转到“项目导航器”(即显示所有项目项等的第一个图标)
从树的顶部选择您的项目。
在页面中间的菜单上(稍微向右),在“目标”下选择您的应用程序
从顶部选项卡中,选择“常规”
向下滚动到“框架、库和嵌入内容”
从列表中选择您的 Lib
从旁边的下拉列表中选择“嵌入并签名”。
干净
重新构建并运行。
我希望这会有所帮助。
H
答案 22 :(得分:1)
答案 23 :(得分:1)
这是由Dynamic Linker
dyld: Library not loaded: @rpath/...
...
Reason: image not found
带有Library not loaded
[About]的错误@rpath
表示Dynamic Linker
无法找到框架。
检查是否已将框架添加到General -> Embedded Binaries
检查@rpath
-Build Settings -> Runpath Search Paths
是否包含与Build Phases -> Embed Frameworks -> Destination, Subpath
中设置的目标/子路径相同的路径
答案 24 :(得分:1)
Xcode 11
答案 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最新版本。等等等等等等...你可以想到的很多方法。 –
答案 28 :(得分:0)
在 Xcode 11
中我面临着同样的问题
在“常规”选项卡中更改“请勿嵌入” > “框架,库和嵌入式内容” 仍会导致相同的错误。
为我解决的是在 Build Phases选项卡> Embed Frameworks部分
中添加 Framework 。-更新----
我观察到在Xcode 11中运行时,在以前版本的Xcode Embed Frameworks Section 中构建的项目不可用,请找到以下步骤以实现解决方案:
1:首先需要在 Build Phases (构建阶段)标签下添加 New Copy Files阶段。
2:第二步,将添加阶段的名称更改为 Embed Frameworks
3:将目的地更改为 Framework 。
4:添加发生错误的框架。
答案 29 :(得分:0)
尽管每个人都说要将该框架嵌入到Embedded Binaries(嵌入式二进制文件)下,但仍然无法正常工作,因为我们在这里缺少重要的一步。
以下是在“嵌入式二进制文件”选项卡下添加二进制文件的正确两个步骤:
从“常规”选项卡下的“链接的框架和库”中删除给出错误的框架。
现在仅在“嵌入式二进制文件”选项卡下添加已删除的框架,这就是所有要做的事情。
在设备上运行并保持微笑;)
答案 30 :(得分:0)
在我的情况下,应用程序崩溃仅在真实设备上发生,并且发生在标准库中。 在尝试1h之后,我尝试了很多步骤,只需从真实设备中删除应用程序,然后重新安装即可。
答案 31 :(得分:0)
以上步骤解决了我的问题。
答案 32 :(得分:-2)
如果有人仍然遇到此问题,尽管遵循了许多其他答案中列出的所有步骤,您可能需要撤消并重新创建代码签名证书,按照以下方式:
https://developer.apple.com/library/ios/qa/qa1886/_index.html