本文都是以 Swift
為基礎(chǔ)做測試的.
靜態(tài)庫 嵌套 其他靜態(tài)庫
在你的項目中, 使用了一個靜態(tài)庫, 它里面嵌套了另一個靜態(tài)庫.
- 如果這個靜態(tài)以
Embed
(嵌套) 的形式引入另一個靜態(tài)庫, 那么嵌套的靜態(tài)庫會包含在當(dāng)前的靜態(tài)庫的Frameworks
文件夾中, 如下:
雖然包含, 但在其他項目使用這個靜態(tài)庫的時候, 并不會動態(tài)的把依賴的靜態(tài)庫link
到這個項目, 直接build
會報如下錯誤:
需要自己手動link
嵌套的framework
, 如下圖:
把那個依賴庫拖入到Build Phases
->Link Binary With Libraries
, 即可解決上面的錯誤 - 如果以
Do Not Embed
的形式引入另一個靜態(tài)庫, 構(gòu)建這個靜態(tài)庫, 它本身就不包含Frameworks
文件夾, 需要找到那個依賴的庫, 并且拖入到Build Phases
->Link Binary With Libraries
動態(tài)庫 嵌套 其他靜態(tài)庫
與上面的基本相同, 但使用時, 不需要 link
嵌套的 framework
, 拖入即可以使用.
即使在動態(tài)庫中, 對這個靜態(tài)庫 Do Not Embed
, 在項目中使用動態(tài)庫的時候依然不需要拖入這個靜態(tài)庫.
所以動態(tài)庫引入其他靜態(tài)庫, 無論是 Embed
還是 Do Not Embed
, 都會把其他的靜態(tài)庫嵌入到本身, 而且你還可以在你的項目中通過 import StaticFramework
的形式引入這個靜態(tài)庫, 使用他的 public
部分, 但是無法查看 API
, 查看的時候會顯示:
動態(tài)庫 嵌套 其他動態(tài)庫
當(dāng)前的項目可以給引入的 framework
進行簽名, 但是不可以給這個 framework
嵌套的動態(tài)庫簽名, 所以如果你的動態(tài)庫嵌套其他的動態(tài)庫, 需要在你構(gòu)建動態(tài)庫的時候給他簽名, 但是這種簽名之后就無法被其他 team
使用, 如下:
如果在動態(tài)庫引入另一個動態(tài)庫使用:
- 選擇了
Embed & Sign
, 則需要上面所描述的 - 選擇了
Embed & Without Signing
, 這個不可以應(yīng)用在兩個動態(tài)庫嵌套, 會出現(xiàn)如下錯誤
dyld: Library not loaded: @rpath/StaticFramework.framework/StaticFramework
Referenced from: /private/var/containers/Bundle/Application/AC3BE487-EB49-4DEB-AD3D-787856606C23/SwiftTest.app/Frameworks/StaticFramework2.framework/StaticFramework2
Reason: no suitable image found. Did find:
/private/var/containers/Bundle/Application/AC3BE487-EB49-4DEB-AD3D-787856606C23/SwiftTest.app/Frameworks/StaticFramework2.framework/Frameworks/StaticFramework.framework/StaticFramework: code signature in (/private/var/containers/Bundle/Application/AC3BE487-EB49-4DEB-AD3D-787856606C23/SwiftTest.app/Frameworks/StaticFramework2.framework/Frameworks/StaticFramework.framework/StaticFramework) not valid for use in process using Library Validation: mapped file has no cdhash, completely unsigned? Code has to be at least ad-hoc signed.
(lldb)
- 選擇了
Do Not Embed
, 表示這個動態(tài)庫不嵌入, 但依賴這個庫, 所以在使用時需要同時引入這兩個動態(tài)庫.
所以動態(tài)庫盡量不要嵌套其他動態(tài)庫, 而是在項目中同時引入兩個動態(tài)庫進行使用.
靜態(tài)庫 嵌套 其他動態(tài)庫
如果在靜態(tài)庫引入另一個動態(tài)庫使用:
- 選擇了
Do Not Embed
, 則需要在項目中同時引入兩個庫, 因為靜態(tài)庫依賴那個動態(tài)庫, 但沒有嵌入. - 選擇了
Embed & Sign
, 與靜態(tài)庫 嵌套 其他靜態(tài)庫
相同, 需要拖入依賴的動態(tài)庫
總結(jié):
-
Static Framework
無論選擇Do Not Embed
, 還是Embed & Sign
, 都不會動態(tài)連接依賴的庫, 需要手動鏈接.
但選擇Embed
的靜態(tài)庫, 會把依賴的庫一起打包到它本身. 如下:
如果選擇Do Not Embed
, 就不會包含Frameworks
這個文件夾. Dynamic Framework
1.嵌套靜態(tài)庫, 始終會把靜態(tài)庫嵌入其中.
2.引入動態(tài)庫, 選擇Do Not Embed
, 則需要在使用的時候引入依賴的動態(tài)庫
選擇Embed
需要對內(nèi)嵌的動態(tài)庫進行簽名, 而且簽名過的庫, 只允許同一個Team
使用.
所以無論靜態(tài)庫還是動態(tài)庫都盡量不要嵌套使用, 而是以依賴的方式引用, 這樣才更優(yōu)雅一些.
IPA processing failed
上傳到 AppStore
不可以包含 x86_64
和 i386
lipo <文件夾/文件> -remove x86_64 -o <文件夾/文件> // 去除x86_64
Todo: Found an unexpected Mach-O header code: 0x72613c21
Static Library 不可以以嵌入的方式, 而是在 Build Phases
-> Link Binary With Libraries
中引用.
如果加入到 Embed Frameworks
中, 就會報上面的錯誤
目前沒有測試動態(tài) framework
以嵌入的方式引用靜態(tài) framework
, 是否會報錯.