这个崩溃是一个阻塞问题,基本上我使用以下步骤来重现这个问题:
- 创建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版本为设备分发框架。有人能解释一下吗?
- 我不明白的是,为什么所有其他第三方框架都是现成的,可以很容易地被拖拽到Link Binary with Libraries中,不知何故xcode知道要将它们复制到你的应用包中,而对于定制框架,这根本就不会发生。
- Sazzad Hissain Khan的回答stackoverflow.com/questions/26024100/…是最好的答案。
- 查看stackoverflow.com/a/52129141/2020034。它工作
- 你可以制作一个胖库,你可以看到这个链接:stackoverflow.com/a/54977145/3992606
- xcode版本不匹配,使用stackoverflow.com/a/55738882/5443510解决。
在目标的常规选项卡中,有一个嵌入的二进制文件字段。当您在其中添加框架时,崩溃将得到解决。
参考资料在苹果开发者论坛上。
- 我在嵌入的二进制文件中有框架,并且我将复制阶段设置为"框架"。无论如何,它都会崩溃。
- 这只能在调试模式下解决。存档或生成项目时将再次发生错误
- 是的,当我创建IPA文件时,同样的问题仍然存在。
- 同样的问题,兄弟,似乎Xcode不够稳定
- 将@executable_path/frameworks添加到'runpath search path'解决了这个问题,即除了将框架添加到'embedded binaries'之外。
- 在Xcode6.1.1中,将它添加到嵌入的二进制文件中就足够了。它既适用于调试,也适用于存档构建。
- 谢谢你:)那很有效,我对reactivecocoa有问题。
- 有人能从pods中帮助在嵌入式二进制文件中添加框架吗?
- 同上。我还想知道如何从pods添加,因为Xcode6.4中没有使用pods的"常规>嵌入式二进制文件"。
- 我引用@bonnke:我在一个应用程序上运行UI测试时遇到了同样的问题,这个应用程序导入了带有cocoapods的restkit。关于在本例中添加框架的任何建议。
- 我已经在Embedded Binaries部分添加了框架,但是如果允许应用程序在iOS 9.1设备上运行,应用程序仍然会崩溃,并显示控制台中的消息"dyld:library not loaded:reason:image not found"(未加载库:原因:找不到映像)。
- 同样的问题也发生了,并且解决方案在吊销证书后不在Xcode7.2中工作。
- 不,因为某种原因导致代码签名问题。
- 有效,但当尝试生成IPA时,这会导致Found an unexpected Mach-O header错误。有什么想法吗?
- 这对于动态库(而不是框架)是如何工作的?在这种情况下,不能将其添加到未嵌入的二进制文件中。
- 您可以在应用程序项目中将框架从必需更改为可选。链接二进制与库,但它没有完全解决问题,应用程序崩溃时,我创建了一个类的实例
- 这真的帮助了我。当随后的错误显示缺少@rpath/libswift*时,我必须启用"Embedded Content Contains Swift Code",因为我的新版本Embedded Framework现在使用的是Swift,而不是旧版本。
- 我在这篇文章(stackoverflow.com/questions/26104975/…)中找到了适合我的。它通过将字符串@executable_path/frameworks添加到runpath搜索路径中。这样做之后,错误就不再出现了。
- 我需要所有这些信息加上我自己贡献的答案中的额外部分。也许Xcode8正在向我们扔新的皱纹和虫子来保持它的乐趣。
- 那个苹果链接坏了
- 这个答案已经过时了
- 这帮我解决了问题,谢谢!
- 在一个真实的设备中,我测试了所有的方法,没有得到答案,但最终我从我的项目中移除了cocoapod,重新安装了它,问题解决了,我的应用程序在设备中运行!!这是删除cocoapod的答案:stackoverflow.com/a/34765245/2201814
- 伟大的!!!!解决方案。钉牢它!!
- 谢谢你的帮助!
对于大于或等于8的iOS
在目标的常规选项卡下,在嵌入的二进制文件部分添加框架。这会将框架复制到已编译的中,以便在运行时将其链接到。
为什么会这样?:因为您链接到的框架被编译为动态链接的框架,因此在运行时链接到。
注意:嵌入自定义框架仅在iOS>8中受支持,因此,在旧版本的iOS上工作的替代解决方案如下。
iOS低于8
如果您对这个框架有影响(可以访问源代码/构建过程),您可以将这个框架更改为静态链接,而不是动态链接。这将导致代码包含在已编译的应用程序中,而不是在运行时链接到,因此不必嵌入框架。
如何:在框架的构建设置选项卡下,在链接部分将mach-o类型更改为静态库。现在不需要在嵌入式二进制文件下包含框架。
包括资产:为了包括图像、音频或XIB/NIB文件等内容,我建议创建一个包(基本上是一个目录,这里有更多信息bit.ly/ios_包),然后使用nsbundle从包中加载资产。
- 如果框架在pods中,如何向嵌入的二进制文件添加框架?
- "框架在pods中"是什么意思?您的定制框架是通过cocoapods分发的?
- 这应该是"大于或等于8"。我也不得不在iOS 8上做这个。
- 错误Swift is not supported for static libraries。
仅仅将框架拖到项目中是不够好的。这就像是在同一个棒球场,但找不到你的孩子。遵循以下步骤:
1)创建框架
- 开发你的框架。
- 一旦您的开发完成,COMMAND+B-构建您的框架,并确保您获得"构建成功"。
2)访问您的框架
- 一旦您的框架项目成功构建,它将准备好让您访问您的项目中的Products文件夹。
- 右键单击您的.framework,然后选择"在finder中显示"。
3)在项目中放置框架
- 将.framework从finder窗口拖放到应用程序项目的"framework"文件夹中。
4)为框架配置应用程序项目
- 转到"构建阶段",然后转到"将二进制文件与库链接",并确保您的框架包含在可选选项中。
- 仍处于"构建阶段",转到左上角并选择+按钮。在下拉列表中选择"新建复制文件阶段"。
- 向下滚动到新的"复制文件"部分,确保将Destination设置为"框架"。将子路径留空。然后单击左下角的+按钮。
- 您将看到您的项目层次结构。向下滚动到步骤3中添加框架的"frameworks"文件夹,或在顶部的搜索栏中搜索。选择框架并单击"添加"。
5)清理,然后运行项目
- COMMAND+SHIFT+K。
- 江户十一〔18〕号+江户十一〔30〕号
- 好点。它几乎对我有用。我做了一个框架A,包括Alamoire。我的主机应用程序(嵌入式框架A)在模拟器中工作。但当我尝试在真正的iPhone中运行它时,它会崩溃,并出现错误:alamofire:dyld:library not loaded:@rpath/alamofire.framework/alamofire reason:找不到合适的图像。找到了:xxx/ddcdemo.app/frameworks/iddc.framework/frameworks/alamof‌&8203;ire.framework/alamof‌&8203;ire:mach-o,但架构错误
- 这对我有用,谢谢
- @布兰登选择框架解决了我的问题。但是,您能解释一下让框架成为可选的行为是什么吗?
- 灿烂的…你解决了我的问题_
- 谢谢您!在您的步骤5中,我检查了"仅在安装时复制",这是我的问题。
- 谢谢你,你救了我一天…
- 哦…它解决了这个问题。谢谢!
首先尝试在command+option+shift+k之后构建。如果仍然失败,请执行以下步骤。
如果有人在Xcode8中遇到此错误,请将您的框架状态更改为可选,而不是在目标的常规选项卡下所需的状态。
- 这将使运行时无法识别框架中的类
- @阿齐莫夫是对的。我现在正面临这种困境。必选导致"找不到图像"错误,如果我们尝试将其设置为可选,它将在运行时使用"无法识别的选择器"崩溃。
- 即使我的框架已经在链接二进制文件和嵌入文件中,我仍然需要添加一个复制阶段。未加载库:未加载库:@rpath/afnetwork.framework/afnetwork引用自:/users//user/lib/develo/cor模拟器/dev/6833A8‌& 8203;5C-5783-45FA-A4D5-99‌& 8203;1d286B28c2/data/cont‌&35; 8203;引用自:/user//user 123;/user /lib/lib/dev/dev/cor模拟器/cor模拟器/dev/dev/683333A8&zwnj_8203;41b0-9884-6db6995a0d‌&8203;7e/myapp.app/myapp reason:image not found(lldb)解决方案:project->target->build phases->at top to add new copy files phase destination=frameworks选择需要复制的框架
- @Adammendoza我的应用程序因为这样做而被拒绝。
- @jbouaziz,是的,您可能会遇到一个错误,因为.framework很胖,这意味着它的架构在iOS上不受支持,比如i386 x86_64,除了必要的armv7 arm64之外。存储会给您一个错误,但您可能在Xcode中看不到该错误。使用xcode->open developer tool->application loader下的加载程序。解决方案让它变薄,请参见->ikennd.ac/blog/2015/02/…
- @Adammendoza是另一个错误,它说我无法将任何内容复制到框架文件夹。这就是它被拒绝的原因。
- @JBouaziz,你选择了我的兴趣。你的意思是应用的框架文件夹吗?这是允许的。我刚刚提交了一个应用程序,包括afnetworking.framework,并能够提交到商店。现在,在afnetworking.framework包(它只是一个文件夹)中,不允许使用非代码文件(如.txt文件)。
- @Adammendoza通过从我的自定义框架中删除嵌入的包含swfit的内容来修复它。发生的是它正在为Swift库创建一个不需要的框架文件夹。
- 我让它工作的方法是清除派生数据。
- 设置为可选将解决我的问题
- 对于我的场景来说,这是必要的修正:将应用程序部署到运行9.3.1的iPad上。该应用程序包含仅在ios10上运行的代码(unusernotifications框架)。当我在代码中设置了正确的安全措施以便为9.3.1构建时,运行时得到了这个错误。
我使用swift3/xcode 8.1创建了一个框架,并在一个objective-c/xcode 8.1项目中使用它。为了解决这个问题,我必须启用Build Options下的Always Embed Swift Standard Libraries选项。
看看这个屏幕截图:
希望有帮助!
- 这对我来说是很有用的。此问题的解决方案是转到目标下的BuildPhases->copy files->select framework并添加框架。很可能你的图书馆不在这里。
- @哈利什,你建议的解决方案已经有好几个人提出了,我首先肯定会考虑的。在我的例子中,框架是在那里添加的,但仍然出现了相同的问题。然后我自己挖。如果你对这个解决方案投了反对票,我不知道为什么当它在我的案例中不起作用时,你对自己的方法相当肯定:s
- @谢谢。你的回答对我帮助更大,当然也无忧无虑了:)谢谢你们
- 这是唯一对我有用的东西。但我已经在目标的Embedded Binaries部分"嵌入"了框架。那么,这为什么会起作用呢?
- 太棒了,因为如果使用一个Swift库或pod嵌入到目标C项目中,这件事会起作用。目标C项目通常将此标志设为"否"。
我不得不(除了这里提到的)在构建设置选项卡下的运行路径搜索路径中添加以下行:@executable_path/Frameworks
- 这为我解决了这个问题。在我的iOS 9应用程序中添加了一个应用程序扩展名后,我开始出现问题。在添加扩展之前,发现我的框架很好。添加复制文件构建阶段没有帮助,我已经嵌入了框架。
- 奇怪的是,这在默认情况下不包括在内。如果你解压并查看你的ipa,你应该在payloads/appname.app/frameworks/中找到你的框架。但是,添加此搜索路径必须存在,应用程序才能在运行时在此文件夹中查找。奇怪的。
我在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来解决这个问题。
- 这是可行的。有人知道为什么吗?因为有些设备需要这个设置,其他设备不需要。
- 因为usernotifications框架需要ios10
- 我得到"警告:无法在进程中执行支持代码来读取Objective-C类数据。这可能会降低可用类型信息的质量。"当将我的lib标记为可选时
- 可能是因为某些框架没有在模拟器中运行这就是为什么
- @把这个答案连同你的评论一起重新表述84,使我免于精神错乱。authenticationservices.framework遇到此问题,它需要iOS 12。
您需要将框架添加到新的复制文件构建阶段,以确保框架在运行时复制到应用程序包中。
有关详细信息,请参阅如何将"复制文件生成阶段"添加到我的目标。
苹果官方文档:https://developer.apple.com/library/mac/recipes/xcode_help-project_editor/articles/creatingacopyfilesbuildphase.html
- 在尝试了这么多东西之后,这就是解决问题的方法。我已经有了链接二进制和嵌入框架中的框架。我不认为我还必须添加一个复制阶段,但这修复了它。
在嵌入的二进制文件中添加框架
然后清理并建造。
在我的例子中,解决方案是从嵌入的二进制文件中删除已编译的框架,这是工作区中的一个独立项目,清理并重建它,最后重新添加到嵌入的二进制文件中。
如果您使用的是第三方框架,并且使用cocoapods作为依赖关系管理器,请尝试执行pod install来刷新pods。
这次崩溃发生在我正在使用的第三方库上,所以很高兴上面的解决方案对我有效,希望它对您有效!
- 伟大的!解决了我的问题。但是有没有一种方法可以避免在我的主机应用程序中安装pod依赖项?
令人惊讶的是,并非所有必要的部分都记录在这里,至少对于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成为可选的。
我也有同样的问题。我尝试用我以前从未用过的iPhone来构建我的项目,但我没有添加新的框架。对我来说,清理工作做得很好(shift+command+k)。也许是因为我用的是Xcode7的beta 5和iOS9的iphone 6,但它起作用了。
- 也可能是一个干净的构建文件夹(cmd+shift+alt+k)
在构建阶段取消选择"仅在安装时复制"解决了这个问题->嵌入框架
- 如果系统不相信"调试安装"不是"安装",那么最好知道这个复选框的意义。无论如何,如果它导致应用程序在硬件上崩溃,而不是禁止运行带有警告的应用程序,那么这是一个很好的另一个xcode缺陷。
如果有开发舱,从模拟器上删除你的应用安装舱->清洁->再次运行…
在尝试了互联网上所有可用的方法和我自己的试错技巧100次之后。最后我终于解决了。–6分钟前的阿佩克莎·萨胡转到Mac->帐户中的iTunes->授权此计算机-5分钟前的apeksha sahu第二步….在ipad和iphone的设置中转到开发人员,用标识符重新索引,并清除信任计算机的所有内容。对我有用…………在更新所有证书后,从Mac OS Seirra Beta最新版本重新安装Mac Oshigh seria 10.13.15版本,到重新安装Xcode最新版本。等…尽可能多的方法。—。
在我的例子中,我的项目是由Objective-C编写的,在库中有Swift文件。所以我将项目的"构建设置"选项卡中的"始终嵌入Swift标准库"改为"是",一切都正常了。
同样的事情是,我创建了一个新的配置和构建方案。
所以我的解决办法是
对于这个新创建的配置。
转到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
- 代码签名与此错误有什么关系?
- 确切地。代码签名与此错误无关。
- 真不敢相信我读了这个。
- 无能为力的巨魔们投反对票给想帮忙的人。我不是说这是正确的答案。我只是指导人们去苹果问答,展示一些未知原因为我解决问题的东西。我很惊讶它也起作用了,但出于某种原因它起作用了。我甚至记不起很久以前的问题了。我想我是想帮你的。
对于那些修复不起作用的人,尝试将操作系统更新到约塞米蒂。对我有用!