參考蘋果官方的鏈接.
1 問題描述
在提交 APP 到應(yīng)用商店的時候, 出現(xiàn)如下錯誤:
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 一節(jié), 按照如下步驟檢查二進制包的鏈接問題:
- 在 Xcode 的 Organizer 中找到無效的 APP 包, 在其上右鍵選擇 Show Package Contents.
- 進入
Products/Applications文件夾中的應(yīng)用包上面再次右鍵選擇 Show Package Contents. - 在其中找到 APP 對應(yīng)名稱的二進制文件, 利用
otool -L 文件完整路徑命令查看該二進制文件的鏈接情況(其中的 完整路徑 可直接把二進制文件拖入終端獲得). - 在上一個步驟得到的列表中, 找到以
@rpath開頭的, 且沒有添加到 App 通用設(shè)置里 Embedded Binaries 的行; - 將這些行對應(yīng)的庫從 APP 的 Linked Frameworks and Libraries 設(shè)置中刪掉, 然后將它們添加到 Embedded Binaries 中.(對于Swift libraries, 即名字以
libSwift開頭的除外.) - 重復(fù)上述步驟, 對每一個 Framework 或 Extension 進行檢查.
對自己的 APP 進行檢查, 仔細看了上面步驟中的輸出...
發(fā)現(xiàn)在 Release 的時候仍然將 FLEX (一個Debug工具) 進行了鏈接, 而 Release 的時候 FLEX 不應(yīng)出現(xiàn)在 Bundle 中的任何地方的, 故在使用方式上肯定出了問題.
先用 fastlane 分別在 debug 和 release 配置下對工程進行打包, 然后對比看是不是真是由 FLEX 的使用方式錯誤引起的.
3 額外問題(新版 fastlane 出現(xiàn)的)
這里又遇到一個 fastlane 出來的錯誤, 說 You passed invalid parameters to 'gym'. 查了查官方的 issue, 原來是多個版本的 fastlane 并存發(fā)生的沖突, 故按照 issue 里面提供的解決辦法:
先執(zhí)行如下三行, 刪掉所有已安裝的 fastlane 版本:
rvm @global do gem uninstall fastlane
rvm all do gem uninstall fastlane
gem uninstall fastlane
再重新安裝:
gem install fastlane
好了, 繼續(xù)使用 fastlane 來打包一個 APP, 看里面是否帶有 FLEX, 結(jié)果果然是帶著的.
4 最終解決
這個問題也就清楚了, 在 Release 的時候沒有拷貝 FLEX 對應(yīng)的 Framework 文件到 Bundle 中, 但是卻在工程中鏈接了它, 這里又由于在代碼中沒有使用它, 造成沒有出現(xiàn)錯誤提示...
最后就造成之前的 Invalid Bundle 問題, 所以要解決的話, 就要指定只在 Debug 的時候才鏈接 FLEX, 實際這里就引出了 如何只在 Debug 的時候鏈接特定庫 的問題.
限制指定的庫只在 debug 時進行鏈接的配置也非常簡單, 這里僅詳細介紹使用 Carthage 的情況下的具體操作, 其他的情況詳見 4.2 節(jié)中的鏈接.
具體的操作辦法參考這個鏈接中的 Excluding FLEX from Release (App Store) Builds 一節(jié).
最終結(jié)果
經(jīng)過上面的操作, 該庫就只在 debug 環(huán)境下被鏈接和使用了, 且在 Release 環(huán)境下不會被拷貝到 Bundle 中, 同時也不會被鏈接到程序中, 提交 APP 的時候也不會出現(xiàn)問題了...