参考苹果官方的链接.
1 问题描述
在提交 APP 到应用商店的时候, 出现如下错误:
Invalid Bundle - One or more dynamic libraries that are referenced by your app are not present in the dylib search path.
APP 使用的是 Carthage 作为依赖管理工具.
2 尝试解决
参考本文开头提供的链接中 Inspecting A Binary's Linkage 一节, 按照如下步骤检查二进制包的链接问题:
- 在 Xcode 的 Organizer 中找到无效的 APP 包, 在其上右键选择 Show Package Contents.
- 进入
Products/Applications
文件夹中的应用包上面再次右键选择 Show Package Contents. - 在其中找到 APP 对应名称的二进制文件, 利用
otool -L 文件完整路径
命令查看该二进制文件的链接情况(其中的 完整路径 可直接把二进制文件拖入终端获得). - 在上一个步骤得到的列表中, 找到以
@rpath
开头的, 且没有添加到 App 通用设置里 Embedded Binaries 的行; - 将这些行对应的库从 APP 的 Linked Frameworks and Libraries 设置中删掉, 然后将它们添加到 Embedded Binaries 中.(对于Swift libraries, 即名字以
libSwift
开头的除外.) - 重复上述步骤, 对每一个 Framework 或 Extension 进行检查.
对自己的 APP 进行检查, 仔细看了上面步骤中的输出...
发现在 Release 的时候仍然将 FLEX (一个Debug工具) 进行了链接, 而 Release 的时候 FLEX 不应出现在 Bundle 中的任何地方的, 故在使用方式上肯定出了问题.
先用 fastlane 分别在 debug 和 release 配置下对工程进行打包, 然后对比看是不是真是由 FLEX 的使用方式错误引起的.
3 额外问题(新版 fastlane 出现的)
这里又遇到一个 fastlane 出来的错误, 说 You passed invalid parameters to 'gym'
. 查了查官方的 issue, 原来是多个版本的 fastlane 并存发生的冲突, 故按照 issue 里面提供的解决办法:
先执行如下三行, 删掉所有已安装的 fastlane 版本:
rvm @global do gem uninstall fastlane
rvm all do gem uninstall fastlane
gem uninstall fastlane
再重新安装:
gem install fastlane
好了, 继续使用 fastlane 来打包一个 APP, 看里面是否带有 FLEX, 结果果然是带着的.
4 最终解决
这个问题也就清楚了, 在 Release 的时候没有拷贝 FLEX 对应的 Framework 文件到 Bundle 中, 但是却在工程中链接了它, 这里又由于在代码中没有使用它, 造成没有出现错误提示...
最后就造成之前的 Invalid Bundle 问题, 所以要解决的话, 就要指定只在 Debug 的时候才链接 FLEX, 实际这里就引出了 如何只在 Debug 的时候链接特定库 的问题.
限制指定的库只在 debug 时进行链接的配置也非常简单, 这里仅详细介绍使用 Carthage 的情况下的具体操作, 其他的情况详见 4.2 节中的链接.
具体的操作办法参考这个链接中的 Excluding FLEX from Release (App Store) Builds 一节.
最终结果
经过上面的操作, 该库就只在 debug 环境下被链接和使用了, 且在 Release 环境下不会被拷贝到 Bundle 中, 同时也不会被链接到程序中, 提交 APP 的时候也不会出现问题了...