利用cocopods管理本地私有庫(kù)遇到的問(wèn)題

一、拉取團(tuán)隊(duì)的項(xiàng)目后,運(yùn)行提示無(wú)權(quán)限

The file couldn't be opened because you don't have permission to view it
點(diǎn)擊pod中的類,得到如下提示

WechatIMG4.png

可以嘗試以下幾個(gè)方案:
(1):清除緩存
xcode->preferences->Derived Data .然后刪除這個(gè)Derived Data文件夾
再clean一下,然后再運(yùn)行

(2):從工程外導(dǎo)入文件時(shí),有一個(gè)要注意的地方,


WechatIMG5.png

導(dǎo)入的文件會(huì)變藍(lán)色


WechatIMG6.png

如果換一種方式導(dǎo)入


WechatIMG7.png

導(dǎo)入的文件為黃色


WechatIMG8.png

因?yàn)楣催xfolder references一欄,只是單純有引用,但文件路徑不明確,沒(méi)有實(shí)際加入到工程中來(lái),所以可能造成問(wèn)題。

(3):我的問(wèn)題的解決方案
打開(kāi)設(shè)置,選擇安全性與隱私,并按照下圖操作:


WechatIMG9.png
二、項(xiàng)目中圖片加載不出來(lái),從接口中發(fā)現(xiàn)圖片url為http

xCode 配置允許HTTP請(qǐng)求

info.plist里面增加:
App Transport Security Settings 屬性
再在此屬性內(nèi)增加Allow Arbitrary Loads,并設(shè)置值為YES

三、'libxml/tree.h' file not found

pod本地私有庫(kù),需要依賴系統(tǒng)的library----> libxml2
推薦使用方法1
(1)在本地庫(kù)的podspec中添加

spec.libraries =  "xml2"
spec.pod_target_xcconfig = {'HEADER_SEARCH_PATHS' => '${SDK_DIR}/usr/include/libxml2'}

(2)手動(dòng)添加引用
首先檢查
我們要在Build Setting中搜索other linker,在這里面添加:
若引用的libxml2.tbd,添加-lxml2
若引用libz.dylib,則添加-lz
然后,
在本地私有庫(kù)的Build Setting中搜索Header Search Paths,添加路徑:
${SDK_DIR}/usr/include/libxml2
這樣做的缺陷是每次重新pod install,都需要重新手動(dòng)添加。

這里有一個(gè)細(xì)節(jié),
spec.pod_target_xcconfig設(shè)置的是當(dāng)前庫(kù)的Build Settings,這里對(duì)應(yīng)的是本地私有庫(kù)。
spec.user_target_xcconfig設(shè)置的是project中的Build Settings,即在運(yùn)行的target中的Build Settings。這個(gè)在Cocoapods的官網(wǎng)上不建議使用,官網(wǎng)說(shuō)設(shè)置這個(gè)有可能會(huì)和工程中本身的設(shè)置造成沖突。

四、CocoaPod出現(xiàn)target overrides the OTHER_LDFLAGS build setting defined in Pods/Target Support的解決方案

利用cocopods管理多個(gè)三方庫(kù)及本地庫(kù),pod install后報(bào)錯(cuò)

[!] The `AllBlue [Debug]` target overrides the `OTHER_LDFLAGS` build setting defined in Pods/Target Support Files/Pods/Pods.debug.xcconfig. This can lead to problems with the CocoaPods installation

Use the `$(inherited)` flag, or
Remove the build settings from the target.

意思就是target的設(shè)置覆蓋了 pod的設(shè)置。

解決方案:
Build Settings -> Other linker flags 中添加$(inherited)

五、關(guān)于本地私有庫(kù)中圖片的加載問(wèn)題

盡量將圖片等資源打包成bundle文件, 這樣有效的防止了資源文件命名的沖突, 引用方法
可以嘗試:

NSBundle *bundle = [NSBundle bundleForClass:["pod中隨意一個(gè)類" class]];
NSURL *bundleURL = [bundle URLForResource:@"bundle文件名" withExtension:@"bundle"];
NSBundle *resourceBundle = [NSBundle bundleWithURL: bundleURL];
UIImage *img = [UIImage imageNamed:icon inBundle:bundle compatibleWithTraitCollection:nil];

先拿到該pod下隨意一個(gè)類的bundle(該bundle與資源文件是一個(gè)bundle), 
再根據(jù)該bundle找到bundle資源文件的路徑, 最后使用資源文件.

另外可以hook imageNamed:方法

六、引用外部靜態(tài)庫(kù)(.a文件)時(shí)或打包.a時(shí),Category方法無(wú)法調(diào)用。

Targets選項(xiàng)下有Other linker flags的設(shè)置為 -ObjC。

下面逐個(gè)介紹3個(gè)常用參數(shù):
-ObjC:加了這個(gè)參數(shù)后,鏈接器就會(huì)把靜態(tài)庫(kù)中所有的Objective-C類和分類都加載到最后的可執(zhí)行文件中
-all_load: 會(huì)讓鏈接器把所有找到的目標(biāo)文件都加載到可執(zhí)行文件中,但是千萬(wàn)不要隨便使用這個(gè)參數(shù)!假如你使用了不止一個(gè)靜態(tài)庫(kù)文件,然后又使用了這個(gè)參數(shù),那么你很 有可能會(huì)遇到ld: duplicate symbol錯(cuò)誤,因?yàn)椴煌膸?kù)文件里面可能會(huì)有相同的目標(biāo)文件,所以建議在遇到-ObjC失效的情況下使用-force_load參數(shù)。
-force_load:所做的事情跟-all_load其實(shí)是一樣的,但是-force_load需要指定要進(jìn)行全部加載的庫(kù)文件的路徑,這樣的話,你就只是完全加載了一個(gè)庫(kù)文件,不影響其余庫(kù)文件的按需加載

七、

(1):如果一個(gè)本地庫(kù)需要import其他庫(kù)的頭文件,
需要設(shè)置其podspec中spec.dependency添加依賴,才能正確索引到。

(2):pod中引入多個(gè)庫(kù),如果出現(xiàn)相同的類名,編譯會(huì)報(bào)錯(cuò),有沖突。
pod庫(kù)中不允許出現(xiàn)相同的類,需要更改類名,或者刪除。但是,如果pod庫(kù)中與target中同時(shí)包含相同的類,編譯不報(bào)錯(cuò)。

(3):利用cocopods導(dǎo)入三方庫(kù)或者本地庫(kù),打包.a文件時(shí),添加Public Headers是無(wú)法添加庫(kù)中頭文件的,只能添加target中的.h文件。

八、制作.a

1.創(chuàng)建新工程 Cocoa Touch Framework文件,第二個(gè)是靜態(tài)庫(kù)文件,也就是我們常說(shuō)的.a文件。
2.將自動(dòng)生成的.h,.m文件刪掉
3.將所需文件加入靜態(tài)庫(kù)工程中。
4.下面進(jìn)行整個(gè)工程的配置:

       4.1、TARGETS - >Build Settings -> Architectures:添加 armv7s;
 增加armv7架構(gòu)
       4.2、 "Build Active Architecture Only" 設(shè)置為 "NO"

注:Build active Architecture Only為什么設(shè)置為NO?

在目標(biāo)設(shè)備上,執(zhí)行設(shè)備對(duì)應(yīng)的指令集。Build active Architecture Only 設(shè)置為YES,只會(huì)選擇編譯、鏈接對(duì)應(yīng)的指令集,設(shè)置為NO時(shí),會(huì)涵蓋所有指令集,在必要的時(shí)候選擇執(zhí)行對(duì)應(yīng)的指令集。所以一般在Debug時(shí)會(huì)選擇設(shè)置為YES(效率會(huì)高點(diǎn),雖然也沒(méi)什么卵用),Release時(shí)會(huì)選擇設(shè)置為NO,以支持所有可能的架構(gòu)。

      4.3、"Mach-O Type" 設(shè)置為 "Static Library"  默認(rèn)為動(dòng)態(tài)庫(kù) ,蘋(píng)果審核不通過(guò)。
      4.4、"iOS Deployment Target" 設(shè)置為 "iOS 9.0" ,這是支持最低運(yùn)行iOS系統(tǒng)版本(可自行選擇,但是要注意的是,iOS SDK中,已經(jīng)廢棄的方法,這個(gè)需要配合 Base SDK 設(shè)置)。

5.下面我們將頭文件(.h)暴露在外,實(shí)現(xiàn)文件(.m)隱藏起來(lái),如下:

TARGETS - >Build Settings -> Build Phases中,將Headers中的Project內(nèi)的頭文件拖到Public中。

6.制作.a文件

來(lái)到工程目錄樹(shù),Products下的文件都是紅色的,現(xiàn)在我們選中.a文件,分別真機(jī)和模擬器運(yùn)行一遍(成功運(yùn)行),然后Show in Finder 找到對(duì)應(yīng)的 .a文件(上級(jí)目錄可以看出是真機(jī)還是模擬器文件夾),真機(jī)和模擬器運(yùn)行成功的文件是在這倆個(gè)文件夾內(nèi)的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容