iOS 組件化私有庫(kù)踩坑筆記

本文源自本人的學(xué)習(xí)記錄整理與理解钠惩,其中參考閱讀了部分優(yōu)秀的博客和書(shū)籍貌亭,盡量以通俗簡(jiǎn)單的語(yǔ)句轉(zhuǎn)述钳宪。引用到的地方如有遺漏或未能一一列舉原文出處還望見(jiàn)諒與指出,另文章內(nèi)容如有不妥之處還望指教隐砸,萬(wàn)分感謝之碗。

XXX did not pass valibation,due to 1 error

這種情況是組件驗(yàn)證常見(jiàn)錯(cuò)誤,一般會(huì)有 - ERROR 提示季希;根據(jù)錯(cuò)誤提示修改即可褪那;但有時(shí)會(huì)遇到?jīng)]有任何- ERROR的情況,這時(shí)首先在驗(yàn)證選項(xiàng)中添加 --verbose 在次驗(yàn)證胖眷; 可以搜索 fail 和 error看看有沒(méi)有信息武通;已然沒(méi)有時(shí)建議使用遠(yuǎn)程驗(yàn)證的方式在此驗(yàn)證;這時(shí)可能就能拿到錯(cuò)誤信息了珊搀,修改直至驗(yàn)證通過(guò)就可以提交podspec文件
注意:遠(yuǎn)程驗(yàn)證必需先提交代碼到遠(yuǎn)程倉(cāng)庫(kù)的

[!] The XXPhotoKit.podspec specification does not validate.

1.本地版本和遠(yuǎn)程不同步造成
2.或者是項(xiàng)目支持最低版本不一致造成
3.是本地索引庫(kù)的問(wèn)題冶忱,可以重新建一個(gè)索引庫(kù)提交試試;前提是spec文件驗(yàn)證沒(méi)有問(wèn)題

主工程集成報(bào)錯(cuò)

[!] Unable to find a specification for `ZLPhotoBrowser` depended upon by `XXPhotoKit`

You have either:
 * mistyped the name or version.
 * not added the source repo that hosts the Podspec to your Podfile.

主工程集成時(shí)需要添加一下source到podfile文件:

source 'https://github.com/CocoaPods/Specs.git'

索引庫(kù)報(bào)錯(cuò)

[!] Unable to add a source with url https://github.com/CocoaPods/Specs.git named cocoapods.
You can try adding it manually in /Users/mac/.cocoapods/repos or via pod repo add.

[!無(wú)法添加url ' https://github.com/CocoaPods/Specs.git ' named ' cocoapods '的源文件境析。
你可以嘗試在' /Users/mac/中手動(dòng)添加囚枪。cocoapods/repos '或通過(guò)' pod repo add '。

Unable to find a specification for XXXXX

[!] Unable to find a specification for `PTBLogInModel`

You have either:
 * mistyped the name or version.
 * not added the source repo that hosts the Podspec to your Podfile.

解決方法:

  • 更新本地索引庫(kù):pod repo update

pod install 報(bào)錯(cuò) An unexpected version directory

![[!] An unexpected version directory `Classes.png](https://upload-images.jianshu.io/upload_images/4068785-9f40cb97a5427b9f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

這個(gè)錯(cuò)誤劳淆,請(qǐng)查看:

podspec 是否未上傳到服務(wù)器
Podfile的source地址是否是Spec Repo的地址链沼,而不是具體某一個(gè)Pod的地址。

請(qǐng)注意:只需要配置索引庫(kù)的源即可


platform :ios, '9.0'

source 'https://gitee.com/xxx/PTBSpecs.git'

target 'MainUIKit' do

pod 'XXXUIKit'

end

沒(méi)有分支權(quán)限

[!] /usr/bin/git -C /Users/mac/.cocoapods/repos/PTBPods push origin HEAD

remote: GitLab: You are not allowed to push code to protected branches on this project.        
To code.aliyun.com:pintuibao-ios/PTBPods.git
 ! [remote rejected] HEAD -> master (pre-receive hook declined)
error: failed to push some refs to 'git@code.aliyun.com:pintuibao-ios/PTBPods.git'

解決:開(kāi)放權(quán)限即可沛鸵,比如去除可保護(hù)

[!] The 'Pods-PXXXKit_Example' target has transitive dependencies that include statically linked binaries:

私有庫(kù)內(nèi)部用到第三方庫(kù)時(shí)需要在Podfile注掉 use_frameworks!

[iOS] unknown: Encountered an unknown error The Pods-App xxx

    - ERROR | [iOS] unknown: Encountered an unknown error 
(The 'Pods-App' target has transitive dependencies that include statically linked binaries: 

(/private/var/folders/3c/3_qr291s5qdgjw93530cr7_w0000gn/T/CocoaPods-Lint-20200617-70817-ltom55-PTBPushKit/Pods/JCore/libjcore-noidfa-ios-2.1.4.a 
and /private/var/folders/3c/3_qr291s5qdgjw93530cr7_w0000gn/T/CocoaPods-Lint-20200617-70817-ltom55-PTBPushKit/Pods/JPush/libjpush-noidfa-ios-3.2.4.a)) 
during validation.

--verbose 顯示檢查編譯的詳細(xì)信息
--allow-warnings 驗(yàn)證時(shí)允許有警告

pod lib lint --verbose --use-libraries --allow-warnings

pod lib lint xxxKit.podspec --verbose --use-libraries --allow-warnings --no-clean

[iOS] xcodebuild: Returned an unsuccessful exit code.

解決:文件內(nèi)的引用地址要使用這樣的形式 :#import <組件名/文件名.h>

- ERROR | [iOS] unknown: Encountered an unknown error (The 'Pods-App' target has transitive dependencies that include statically linked binaries: (/private/var/folders/3c/3_qr291s5qdgjw93530cr7_w0000gn/T/CocoaPods-Lint-20200617-71677-zezx08-PushKit/Pods/JCore/libjcore-noidfa-ios-2.1.4.a and /private/var/folders/3c/3_qr291s5qdgjw93530cr7_w0000gn/T/CocoaPods-Lint-20200617-71677-zezx08-PushKit/Pods/JPush/libjpush-noidfa-ios-3.2.4.a)) during validation.

依賴第三方極光推送庫(kù)報(bào)錯(cuò)

podspec文件中依賴了靜態(tài)庫(kù)造成的驗(yàn)證不通過(guò)括勺,想要驗(yàn)證通過(guò)可以通過(guò)添加參數(shù)--use-libraries讓驗(yàn)證通過(guò),這樣操作并不影響pod使用
pod lib lint xxx.podspec --verbose --use-libraries --allow-warnings

- ERROR | [iOS] unknown: Encountered an unknown error (The 'Pods-App' target has transitive dependencies that include statically linked binaries: (/private/var/folders/3c/3_qr291s5qdgjw93530cr7_w0000gn/T/CocoaPods-Lint-20200617-80124-66n1vl-XXXPushKit/Pods/JCore/libjcore-noidfa-ios-2.1.4.a and/private/var/folders/3c/3_qr291s5qdgjw93530cr7_w0000gn/T/CocoaPods-Lint-20200617-80124-66n1vl-XXXPushKit/Pods/JPush/libjpush-noidfa-ios-3.2.4.a)) during validation.

這個(gè)錯(cuò)誤的原因是第三方的SDK編譯導(dǎo)致的報(bào)錯(cuò)缆八;需要設(shè)定arm64 x86_64架構(gòu),所以在podspec添加如下代碼即可

s.xcconfig = { 'VALID_ARCHS' => 'arm64 x86_64', }

私有庫(kù)添加友盟統(tǒng)計(jì)~鏈接報(bào)錯(cuò)

duplicate symbol '_OBJC_IVAR_$_UMComCountEvent._key' in:
 /Users/mac/Desktop/PTBTest/BasisProject/XSDAnalyticsKit/Example/Pods/UMCAnalytics/UMAnalytics.framework/UMAnalytics(UMComCountEvent.o)

ld: 164 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

類似問(wèn)題可以從第三方升級(jí)的的SDK文檔中尋找線索疾捍,一般第三方SDK升級(jí)奈辰,如果沒(méi)有更新且第三方SDK名字沒(méi)變的情況下很可能會(huì)出現(xiàn)多個(gè)重復(fù)文件;這里出現(xiàn)的就是友盟統(tǒng)計(jì)SDK升級(jí)導(dǎo)致

- ERROR | [iOS] unknown: Encountered an unknown error (The 'Pods-App' target has transitive dependencies that include statically linked binaries: (XSDAnalyticsKit/Pods/UMCCommon/UMCommon.framework XAnalyticsKit/Pods/UMCCommonLog/UMCommonLog/UMCommonLog.fram)) during validation.

App的目標(biāo)有傳遞依賴乱豆,包括靜態(tài)鏈接的二進(jìn)制文件奖恰,需要添加驗(yàn)證條件--use-libraries

將命令:pod lib lint --allow-warnings
改為:pod lib lint --use-libraries --allow-warnings

第二種情況:

若是自己封裝的庫(kù),依賴的第三方里面包含了靜態(tài)庫(kù)宛裕,直接修改podspec瑟啃,添加:

s.static_framework = true

`[!] CocoaPods could not find compatible versions for pod "PTBEncryptKit":

In Podfile:
PTBEncryptKit (from ../)

Specs satisfying the PTBEncryptKit (from../) dependency were found, but they required a higher minimum deployment target.`

此類問(wèn)題一般是有platform :ios, '9.0'版本不一致導(dǎo)致的,可以檢查版本號(hào)

- ERROR | name: The name of the spec should match the name of the file.

spec文件的名稱有誤揩尸,請(qǐng)檢查xxxx.podspec文件名是否正確

`- ERROR | [iOS] [XXStoreKit/XXStoreParser] xcodebuild: Returned an unsuccessful exit code.

- NOTE  | [XXStoreKit/PTBStoreParser] xcodebuild:  /Users/mac/Desktop/XX_XSD_Project/XXStoreKit/XXStoreKit/Classes/XXStoreParser/XXStoreParser.m:10:9: fatal error: 'XXKeyChainStore.h' file not found`

錯(cuò)誤: PTBKeyChainStore沒(méi)有找到 .h 文件

iOS [!] The repoXXPodsat../../../.cocoapods/repos/XXPodsis not clean

先移除本地索引庫(kù)
repo remove XXPods

再?gòu)倪h(yuǎn)程添加會(huì)來(lái)
repo add XXPods 索引庫(kù)地址

error: include of non-modular header inside framework module 'XXXStoreKit.XXDB':

框架模塊XXXStoreKit.XXDB中包含非模塊化頭文件蛹屿,即在XXDB中包含了非當(dāng)前模塊的頭文件

解決辦法就是:添加依賴

s.dependency 'XXXStoreKit/XXXFMDB/FMDB'

- ERROR | Release- error: include of non-modular header inside framework module 'XXXLoadingKit.MBProgressHUD_XXXExtend': [-Werror,-Wnon-modular-include-in-framework-module]

查看私有庫(kù).h文件中引入方式是否是"MBProgressHUD.h", 如果是先改成 < MBProgressHUD/MBProgressHUD.h>

前提是:可以正常運(yùn)行項(xiàng)目; 驗(yàn)證時(shí)使用:pod lib lint --allow-warnings

解決添加:--use-libraries

pod lib lint --allow-warnings --use-libraries

Could not build module 'XXXPushKit'

引入私有庫(kù)報(bào)錯(cuò).png

一般類似問(wèn)題是因?yàn)樗接袔?kù)引用第三方SDK時(shí)疲酌,引用方式不正確導(dǎo)致蜡峰;如果可以最好在.m文件引入,或者.h使用<>的方式

Include of non-modular header inside framework module ‘xxx’

描述:

在SDK開(kāi)發(fā)過(guò)程中朗恳,我們自己的framework庫(kù)中的一個(gè).h文件引用了pod庫(kù)中的類

這時(shí)候以源碼的形式build是沒(méi)有問(wèn)題的,但是當(dāng)build出靜態(tài)庫(kù)后载绿,添加到其他項(xiàng)目中使用時(shí)粥诫,就報(bào) Include of non-modular header inside framework module xxxx錯(cuò)誤。

為什么會(huì)這樣呢?
因?yàn)閄code在默認(rèn)情況下是不允許在framework中的頭文件引入一個(gè)不屬于任何Module的頭文件崭庸。

普通解決:將Build Settings中的Allow Non-modular Includes In Framework Modules設(shè)為YES

方式二:
但是私有庫(kù)別人集成可能就會(huì)有問(wèn)題怀浆,此時(shí)建議添加以下配置,本質(zhì)上和第一種方式類似怕享;

  s.user_target_xcconfig = { 'CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES' => 'YES' }

詳細(xì)了解可以查看這篇文章

- ERROR | [XXXPushKit/XXXJPUSHService] file patterns: Thesource_filespattern did not match any file.

頻繁操作私有庫(kù)podspec文件后执赡,語(yǔ)法都沒(méi)有問(wèn)題;項(xiàng)目也可以正常運(yùn)行函筋;但就是在本地校驗(yàn)時(shí)失斏澈稀;這時(shí)可能就是緩存春的問(wèn)題跌帐,有時(shí)pod install 后不一定就可以首懈,看起來(lái)沒(méi)問(wèn)題;事實(shí)上多次校驗(yàn)都無(wú)法通過(guò)谨敛。這時(shí)候需要清理下cocoapods緩存究履,清理工程xcode緩存是無(wú)效的;

直接前往:~/資源庫(kù)/Caches/CocoaPods/Pods/

/Users/mac/Library/Caches/CocoaPods/Pods/External/XXXPushKit/349f5495df6442f748c403e90110e181-5ff3a

刪除掉XXXPushKit文件脸狸,重新走校驗(yàn)流程最仑;如果還是不行,可以直接嘗試把私有庫(kù)的XXXPushKit文件拷貝到349f5495df6442f748c403e90110e181-5ff3a中,即可通過(guò)校驗(yàn)

示例.png

- ERROR | [iOS] unknown: Encountered an unknown error (Unable to find a specification for AliPlayerSDK_iOS depended upon by XXXX

項(xiàng)目模塊化時(shí)泥彤,我們制作的私有庫(kù)免不了依賴其他私有庫(kù)和CocoaPods的公有庫(kù)紊搪。在產(chǎn)品更新迭代制作新版本的私有庫(kù)后,準(zhǔn)備提交私有庫(kù)前的驗(yàn)證環(huán)境如果沒(méi)有給驗(yàn)證私有庫(kù)的命令知道地址一般都會(huì)報(bào)如下錯(cuò)誤全景。但是如果項(xiàng)目中如果只有公共庫(kù)應(yīng)該不會(huì)報(bào)錯(cuò)耀石,因?yàn)轵?yàn)證和提交的時(shí)候默認(rèn)回去官方specs庫(kù)校驗(yàn),目前寫(xiě)的庫(kù)還沒(méi)有只依賴公有庫(kù)的爸黄。

校驗(yàn)podspec文件時(shí)會(huì)到遠(yuǎn)程podspec庫(kù)查找相關(guān)依賴滞伟,默認(rèn)只會(huì)到官方specs庫(kù)校驗(yàn),此時(shí)需要指定遠(yuǎn)程specs庫(kù)去校驗(yàn)炕贵。

podspec文件在寫(xiě)依賴的時(shí)候也無(wú)法在對(duì)應(yīng)的庫(kù)后面添加源地址梆奈。但是我們可以在驗(yàn)證和提交的時(shí)候加上--sources參數(shù)。注意--sources后面也需要加上官方源称开,不然會(huì)報(bào)找不到公開(kāi)的第三方庫(kù)亩钟。

pod spec lint --verbose --use-libraries --allow-warnings --sources='git@私有庫(kù)地址.git,https://github.com/CocoaPods/Specs.git'

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市鳖轰,隨后出現(xiàn)的幾起案子清酥,更是在濱河造成了極大的恐慌,老刑警劉巖蕴侣,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件焰轻,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡昆雀,警方通過(guò)查閱死者的電腦和手機(jī)辱志,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)狞膘,“玉大人揩懒,你說(shuō)我怎么就攤上這事⊥旆猓” “怎么了已球?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)场仲。 經(jīng)常有香客問(wèn)我和悦,道長(zhǎng),這世上最難降的妖魔是什么渠缕? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任鸽素,我火速辦了婚禮,結(jié)果婚禮上亦鳞,老公的妹妹穿的比我還像新娘馍忽。我一直安慰自己棒坏,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布遭笋。 她就那樣靜靜地躺著坝冕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瓦呼。 梳的紋絲不亂的頭發(fā)上喂窟,一...
    開(kāi)封第一講書(shū)人閱讀 51,763評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音央串,去河邊找鬼磨澡。 笑死,一個(gè)胖子當(dāng)著我的面吹牛质和,可吹牛的內(nèi)容都是我干的稳摄。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼饲宿,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼厦酬!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起瘫想,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤仗阅,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后殿托,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體霹菊,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年支竹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸠按。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡礼搁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出目尖,到底是詐尸還是另有隱情馒吴,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布瑟曲,位于F島的核電站饮戳,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏洞拨。R本人自食惡果不足惜扯罐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望烦衣。 院中可真熱鬧歹河,春花似錦掩浙、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至键菱,卻和暖如春谬墙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背经备。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工拭抬, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人弄喘。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓玖喘,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蘑志。 傳聞我的和親對(duì)象是個(gè)殘疾皇子累奈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容