最近在开发一个iOS应用时遇到了一个棘手的问题。尽管在Xcode预览和模拟器运行中,应用调试都表现正常,但在真机调试时却出现了应用闪退的情况。控制台的报错信息如下:

1
2
3
dyld[2440]: Library not loaded: @rpath/xxx.framework/xxx
Referenced from: <xxxxxxx-439E-3179-8F5F-BDC501EBFBC6> /xxx/
Reason: tried: '/xxx/Debug-iphoneos/PackageFrameworks/xxx.framework/xxx' (no such file), '/xxx/Build/Products/Debug-iphoneos/PackageFrameworks/xxx.framework/xxx' (no such file), '/xxx/Frameworks/SwiftyGif.framework/SwiftyGif' (no such file), '/xxx/Build/Products/Debug-iphoneos/PackageFrameworks/xxx.framework/SwiftyGif' (no such file), '/xxx/Build/Products/Debug-iphoneos/PackageFrameworks/xxx.framework/xxx' (no such file), '/xxx/xxxs.app/Frameworks/xxx.framework/xxx' (no such file)

从报错信息来看,问题似乎出在真机调试时第三方库缺失,但是很奇怪的在于,当用模拟器编译时应用却能正常运行,说明这是一个有点离谱的情况。

问题缘由:

错误 dyld: Library not loaded 通常出现在应用试图加载一个动态库但却找不到它时。在这个案例中,路径 @rpath 是动态链接器(dyld)在查找动态库时使用的运行时路径。从错误日志来看,dyld在多个路径下寻找了 xxx.framework/xxx 文件,但是都没有找到。

可能的原因:

  1. 框架路径不正确:Xcode可能没有正确设置库的搜索路径,导致在真机调试时无法找到必要的库文件。
  2. 框架没有正确链接:在Xcode的项目设置中,如果没有正确配置第三方库的链接设置,也可能导致这个问题。
  3. 架构不匹配:如果库的架构与你的目标设备或模拟器不匹配,也可能出现这个错误。

解决方法:

解决 dyld: Library not loaded 错误的一个有效方法是重新链接库。具体步骤如下:

  1. 删除链接
    • 打开Xcode,导航到项目的 Build Phases 选项卡。
    • Link Binary With Libraries 部分中找到并删除有问题的库(在本例中为 xxx.framework)。
  2. 编译运行
    • 保存更改,然后尝试编译和运行项目。由于刚刚删除了库,此时应该会报错(发现这是必须要操作的一步)。
  3. 重新链接库
    • 再次导航到 Link Binary With Libraries 部分,点击 + 按钮,然后添加 xxx.framework
    • 保存更改,然后再次编译和运行项目。此时,项目应该能够在真机上成功运行。