关于flutter_module嵌入ios原生项目报错:dyld: Library not loaded: @rpath/App.framework/App解决方案

简介: 上个星期,突然有一位做flutter开发的小伙伴添加了我的微信,说他的项目中报dyld: Library not loaded: @rpath/App.framework/App这个错误,说是采用我之前的文章Flutter-module嵌入iOS原生老项目中中的方法可以解决,但是他们是团队开发,路径写死对多人开发不够友好,问我有没有其他解决方案。

上个星期,突然有一位做flutter开发的小伙伴添加了我的微信,说他的项目中报dyld: Library not loaded: @rpath/App.framework/App这个错误,说是采用我之前的文章Flutter-module嵌入iOS原生老项目中中的方法可以解决,但是他们是团队开发,路径写死对多人开发不够友好,问我有没有其他解决方案。


于是我就打开之前的flutter混合项目,开始探索,删除之前的方法,开始复现dyld: Library not loaded: @rpath/App.framework/App这个错误,如图:


image.png


其实项目中报这个错误很常见,这个错误就是dyld去加载App.framework/App这个文件时没有找到,为啥没有找到呢,那就是这个@rpath/App.framework/这个路径下没有App这个文件呗,首先我们得知道这个@rpath代表的是啥,知道@rpath,我们就明白了上面这个报错的原因。


要知道这个@rpath是啥,我们先简单了解一下项目编译到运行的过程中都发生了什么?


  1. 编译:在我们项目编译后,会生成项目的主程序文件(一个可执行文件Executable),在这个主程序文件所在的目录下,还有info.plish、_CodeSignature、Frameworks等文件,由这些文件组成的一个.app文件,这个文件再进行压缩就形成了我们熟悉的.ipa文件。(不信你可以把Xcode打包一个项目,导出ipa包,修改后缀名为.zip,解压缩看看😄)


  1. 运行:在项目运行的时候,dyld就会先加载主程序中所依赖的库,我们看下主程序中的Load command,如下图:


image.png


图中可以看到,加载系统的库,是没有@rpath的,因为系统的库所在位置是固定的。加载三方库如@rpath/AFNetworking.framework/AFNetworking是App.framework和@rpath/App.framework/App的时候就采用@rpath来代替路径,那么@rpath表示的路径是什么呢?这个@rpath是可以设置的,在我们的项目中,如图:


image.png



可看到@rpath是由@executable_path/Frameworks表示的,那么这个@executable_path又是什么呢?它是系统为了方便表示主程序这个可执行文件所在的路径而设计的一个变量,@executable_path表示的是主程序这个可执行文件所在的路径。那么@executable_path/Frameworks也就是@rpath则代表的是主程序文件所在的路径下Frameworks这个文件夹。


搞清楚@rpath是什么这个问题了,那么我们再来看一下.app/Frameworks都有什么?


image.png


发现其中确实没有App.framework。

我当时想到的第一种解决方案就是找到flutter_module中的App.framework,然后将它copy到编译后的.app/Frameworks下,不就解决了吗?编译后手动copy也行,当然如果项目clean了,就没有了。我这里采用脚本copy,如图,在Build Phases中新建一个Run Script,将脚本写入即可。


image.png


经过一番操作,我这里项目可以顺利运行了,但是这个方式给到咨询我的那个小伙伴,他那里的项目却不行,编译都不过。


然后又经过一系列的查找,最终我把问题定位到flutter的SDK的版本上,因为官方提供的flutter_module嵌入iOS原生项目中第一种方式(pod导入),实际上是使用了podhelper.rb这个脚本来完成一系列的加载,我查看了这个脚本的位置是在flutter的SDK中的,当时想到一个问题就是:我的这个项目21年9月份嵌入的的,我的flutter版本2.2.3也不是最新的,这位咨询的小伙伴的flutter版本也不是最新的,于是,我让他升级一下flutter版本看下,果不其然,他升级flutter后就可以顺利运行了。

其他同学如果遇到这个问题,可以先尝试一下flutter的版本升级,少走一些弯路。

最后贴出解决办法:(评论区小伙伴 ningcol 给出的方法,在此感谢!)

重装Cocoapods和ruby-macho:


sudo gem uninstall ruby-macho
sudo gem uninstall cocoapods
sudo gem install ruby-macho
sudo gem install cocoapods



相关文章
|
2月前
|
开发框架 移动开发 Android开发
安卓与iOS开发中的跨平台解决方案:Flutter入门
【9月更文挑战第30天】在移动应用开发的广阔舞台上,安卓和iOS两大操作系统各自占据半壁江山。开发者们常常面临着选择:是专注于单一平台深耕细作,还是寻找一种能够横跨两大系统的开发方案?Flutter,作为一种新兴的跨平台UI工具包,正以其现代、响应式的特点赢得开发者的青睐。本文将带你一探究竟,从Flutter的基础概念到实战应用,深入浅出地介绍这一技术的魅力所在。
84 7
|
4月前
|
编解码 iOS开发
IOS上架APP Store时预览图尺寸
IOS上架APP Store时预览图尺寸
713 3
|
4月前
|
开发工具 iOS开发
解决Flutter运行报错Could not run build/ios/iphoneos/Runner.app
解决Flutter运行报错Could not run build/ios/iphoneos/Runner.app
163 2
|
4月前
|
iOS开发
App备案与iOS云管理式证书 ,公钥及证书SHA-1指纹的获取方法
App备案与iOS云管理式证书 ,公钥及证书SHA-1指纹的获取方法
212 0
App备案与iOS云管理式证书 ,公钥及证书SHA-1指纹的获取方法
|
4月前
|
Android开发 iOS开发 C#
Xamarin:用C#打造跨平台移动应用的终极利器——从零开始构建你的第一个iOS与Android通用App,体验前所未有的高效与便捷开发之旅
【8月更文挑战第31天】Xamarin 是一个强大的框架,允许开发者使用单一的 C# 代码库构建高性能的原生移动应用,支持 iOS、Android 和 Windows 平台。作为微软的一部分,Xamarin 充分利用了 .NET 框架的强大功能,提供了丰富的 API 和工具集,简化了跨平台移动应用开发。本文通过一个简单的示例应用介绍了如何使用 Xamarin.Forms 快速创建跨平台应用,包括设置开发环境、定义用户界面和实现按钮点击事件处理逻辑。这个示例展示了 Xamarin.Forms 的基本功能,帮助开发者提高开发效率并实现一致的用户体验。
158 0
|
4月前
|
iOS开发
解决IOS上架App Store后显示语言为英文的问题
解决IOS上架App Store后显示语言为英文的问题
95 0
|
12天前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
3天前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
4天前
|
存储 前端开发 Swift
探索iOS开发:从新手到专家的旅程
本文将带您领略iOS开发的奇妙之旅,从基础概念的理解到高级技巧的掌握,逐步深入iOS的世界。文章不仅分享技术知识,还鼓励读者在编程之路上保持好奇心和创新精神,实现个人成长与技术突破。
|
19天前
|
安全 数据处理 Swift
深入探索iOS开发中的Swift语言特性
本文旨在为开发者提供对Swift语言在iOS平台开发的深度理解,涵盖从基础语法到高级特性的全面分析。通过具体案例和代码示例,揭示Swift如何简化编程过程、提高代码效率,并促进iOS应用的创新。文章不仅适合初学者作为入门指南,也适合有经验的开发者深化对Swift语言的认识。
39 9

热门文章

最新文章