參考蘋果官方的鏈接.
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 的時候也不會出現問題了...