iOS摸鱼周报,主要分享开发过程中遇到的经验教训、优质的博客、高质量的学习资料、实用的开发工具等。周报仓库在这里:https://github.com/zhangferry/iOSWeeklyLearning ,如果你有好的的内容推荐可以通过 issue 的方式进行提交。另外也可以申请成为我们的常驻编辑,一起维护这份周报。另可关注公众号:iOS成长之路,后台点击进群交流,联系我们,获取更多内容。
开发Tips
整理编辑:人魔七七
CocoaPods 常见操作
pod install
当我们的工程首次使用 Cocoapods 管理第三方库的时候或者当我们每次编辑 Podfile 文件的时候比如:添加,删除或者编辑一个 pod 库的时候,都需要执行该命令。
- 首次执行
pod install
命令,会下载安装新的 pod,并把每个 pod 的版本写到 Podfile.lock 文件里。这个文件跟踪所有的 pod 库及其依赖的版本并锁定他们的版本号。 - 在存在 Podfile.lock 的情况下执行
pod install
的时候,只解析 Podfile.lock 中没有列出的pod依赖项。1. 对于Podfile.lock 列出的版本,不需要检查 pods 是否有更新直接使用既有的版本安装。2. 对于Podfile.lock 未列出的版本,会根据Podfile 描述的版本安装。
Podfile 文件是 pod 执行的核心文件,它的解析逻辑推荐看这篇:Podfile 的解析逻辑。
pod update
pod update 可以全局升级,也可以指定 podName 单个升级。当我们执行 pod update podName
的时候,会忽略 Podfile.lock 文件的版本,根据 Podfile 的定义尽可能更新到最新的版本,并更新 Podfile.lock 文件。该命令会同样适配于 pod 库 podspec文件内部定义的依赖。 可以通过pod outdated
检测出过期的依赖版本和可升级版本。
对于 install 和 update 有两个常用参数:
- --repo-update:该参数会更新所有的 repo,例如该更新了一个私有库版本,直接 install 是找不到对应版本的,我们不想更新所有的依赖库,只想更新 对应的 repo,就可以使用该指令。该参数还对应一个特有命令:
pod repo update
。 - --no-repo-update:update 操作会默认更新所有 repo,有时这并不是必须的,且该步骤会同步 pod 公有 repo,导致比较耗时,这时就可以增加该参数,用于关闭该更新操作。
CocoaPods 使用建议
推荐使用 Gemfile 管理 pod 版本,每次执行 pod 通过 bundle 进行,例如:
bundle exec pod install
。工程持有管理者对项目进行 CocoaPods 初始化的时候会有一个 Podfile.lock 这个文件我们需要纳入版本控制里。
如果需要更新某个库到某一个版本,由项目持有管理者采用
pod update podName
的方式更新某个库到一定的版本。然后提交 Podfile.lock 和 Podfile 文件。
那些Bug
整理编辑:zhangferry
module compiled with Swift 5.3.2 cannot be imported by the Swift 5.3 compiler: **.swiftmodule
问题背景
通过某个版本的 Xcode 生成的 Swift 库(Framework),在另一台机器(不同版本 Xcode)无法识别,报上述错误。
问题分析
该错误是由于编译器不兼容导致的,错误含义是由 Swift 5.3.2 编译器(编译器版本可以通过 swift --version
查看)编译的module,特指 swiftmodule
文件,无法被 Swift 5.3 的编译器所识别。swiftmodule
文件用于描述Swift内部的方法声明,它是二进制格式的,会根据不同的架构生成不同的版本。但也正因为其二进制格式的特性,无法跟随编译器的升级进行调整。这个问题对应的就是 ABI 稳定中的 module stability。这里引用喵神的一段