背景
公司準備對項目進行模塊化, 要使用pod形式. 咱們做過
.framework
和.a
形式的sdk
. 這pod只是應用.制作還真不了解, 咱也不敢說,咱也不敢問. 沒辦法, 找資料唄. 度娘的強大實在讓人頭大. 千篇一律的復制. demo的需求可以滿足.但開發(fā)中碰到的有太多太多情況了. 自己做的pod工程是私有的. 整理了一些自己遇到的問題. 希望能給其他朋友一些幫助.
正文
- 打開終端,
cd <文件目錄地址>
(任意文件夾地址), 本人習慣Desktop位置
cd Desktop
- 開始創(chuàng)建pod工程
pod lib create Demo_podProject
- 緊接著會有一下信息
What platform do you want to use?? [ iOS / macOS ]
// 這里輸入你使用的平臺
> iOS
What language do you want to use?? [ Swift / ObjC ]
//這里輸入你使用的語言
> ObjC
Would you like to include a demo application with your library? [ Yes / No ]
//這里輸入你是否需要生成一個 demo 應用
//這里最好 Yes 這樣你可以查看你創(chuàng)建的庫是否可以使用
> YES
Which testing frameworks will you use? [ Specta / Kiwi / None ]
// 這里輸入你需要用到的測試框架,隨意選
> None
Would you like to do view based testing? [ Yes / No ]
//是否做基于視圖的測試 Yes/No 都可以
> No
What is your class prefix?
//輸入前綴
> JR
回車后, demo會自動打開. 下面是我生成的項目結(jié)構(gòu)
-
podspec
文件, 工程的配置信息文件, 非常重要
下面圖片為demo初始樣子
s.name = 'Demo_podProject'
# 工程的名字s.version = '0.1.0'
# 版本號s.summary = 'A short description of Demo_podProject.
#對你寫的庫進行簡要的概述一下s.description = <<-DESC
TODO: Add long description of the pod here.
DESC
# 對寫的庫進行具體的使用方法說明及其他描述 (沒覺得太多意義)s.homepage = 'https://github.com/eternal.glory91@gmail.com/Demo_podProject
#git庫的地址首頁,可以在開源中國創(chuàng)建你的庫,不需要使用什么初始化方法,不要勾選 readmes.screenshots = 'www.example.com/screenshots_1
# 屏幕快照的地址,例如演示的 gif 文件 (一樣覺得沒有太多意義)s.license = { :type => 'MIT', :file => 'LICENSE' }
#許可證绩聘,type-類型
;file-文件
,這里不需要改變,使用默認,文件指向的文件名與工程中文件名要一致盒粮。s.author = { 'xxx' => 'xxxx@xx.com' }
# 作者信息:賬戶名
,賬戶郵箱地址
s.source = { :git => 'https://github.com/eternal.glory91@gmail.com/Demo_podProject.git', :tag => s.version.to_s }
# 輸入郵箱如果你在開源中國申請的 git 賬號,那么把你在開源中國創(chuàng)建的項目的 https 網(wǎng)址輸入到這里,s.ios.deployment_target = '8.0'
#iOS 支持的最低級別,這里最低8.0s.source_files = 'Demo_podProject/Classes/**/*'
#你庫文件存放的目錄位置,這里通過文件 項目名.xcodeworkspace 打開 xcode,如今打了 pods -> Development Pods -> 工程名 -> 工程名 -> Classes 在 Classes 這個文件夾下我們存放我們創(chuàng)建的類文件(.h,.m文件)s.dependency 'AFNetworking', '~> 2.3'
# 如果你的公共庫需要依賴其他庫,那么打開這里的注釋,例如AFNetworking呻此,如果有多個碌补,則依次往后排
重點
當我們使用到自己寫的靜態(tài)庫
或bundle資源文件
時如何解決呢
framework
- 在工程目錄結(jié)構(gòu)中創(chuàng)建framework文件夾;路徑結(jié)構(gòu)
Desktop
->Demo_podProject
->Demo_podProject
->Framework
- 將自定義framework放入該文件夾下
-
podspec
文件中配置信息, 如下:
s.vendored_frameworks = 'xxxxx/Framework/*.framework'
#vendored_frameworks
是所依賴自定義庫,Demo_podProject/Framework
查找的路徑
Xcode12版本以上編譯的framework需要注意
在
podspec
文件中需添加
s.pod_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }
s.user_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }
兩句話
如果沒有上述配置pod repo push
會報錯
ld: building for iOS Simulator, but linking in dylib built for iOS, file ' XXX ' for architecture arm64
clang: error: linker command failed with exit code 1
bundle
- 在工程目錄結(jié)構(gòu)中創(chuàng)建resource文件夾;路徑結(jié)構(gòu)
Desktop
->Demo_podProject
->Demo_podProject
->resource
- 將bundle文件放入該文件夾下
-
podspec
文件中配置信息
s.resources = 'xxxxx/resource/*.bundle'
然后執(zhí)行pod install
, 會發(fā)工程中創(chuàng)建Frameworks
與Resources
兩個虛擬文件夾,并且?guī)旌唾Y源文件包在各自文件下.
路徑描述中的 * & ** 說明
*
匹配所有文件v*
匹配所有以v開頭
的文件*.framework
匹配所有后綴為framework
文件 可以任意修改.看所需要后綴的文件**
遞歸匹配所有子文件夾
CocoaPods中bundle文件使用
正常工程中使用bundle文件使用方式,[[[NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"name" ofType:@"bundle"]] resourcePath] stringByAppendingPathComponent:@"filename"]
;但在pod中使用樣方式返回的是nil
.雖說都是用的bundleWithPath
.然而之前的是mainBundle
.指的是工程路徑下的.CocoaPods路徑不算.
解決方案
/**
獲取文件所在name,默認情況下podName和bundlename相同桶癣,傳一個即可
@param bundleName bundle名字,就是在resource_bundles里面的名字
@param podName pod的名字
@return bundle
*/
+ (NSBundle *)bundleWithBundleName:(NSString *)bundleName podName:(NSString *)podName {
if (bundleName == nil && podName == nil) {
@throw @"bundleName和podName不能同時為空";
} else if (bundleName == nil ) {
bundleName = podName;
} else if (podName == nil) {
podName = bundleName;
}
if ([bundleName containsString:@".bundle"]) {
bundleName = [bundleName componentsSeparatedByString:@".bundle"].firstObject;
}
//沒使用framwork的情況下
NSURL *associateBundleURL = [[NSBundle mainBundle] URLForResource:bundleName withExtension:@"bundle"];
//使用framework形式
if (!associateBundleURL) {
associateBundleURL = [[NSBundle mainBundle] URLForResource:@"Frameworks" withExtension:nil];
associateBundleURL = [associateBundleURL URLByAppendingPathComponent:podName];
associateBundleURL = [associateBundleURL URLByAppendingPathExtension:@"framework"];
NSBundle *associateBunle = [NSBundle bundleWithURL:associateBundleURL];
associateBundleURL = [associateBunle URLForResource:bundleName withExtension:@"bundle"];
}
NSAssert(associateBundleURL, @"取不到關聯(lián)bundle");
//生產(chǎn)環(huán)境直接返回空
return associateBundleURL?[NSBundle bundleWithURL:associateBundleURL]:nil;
}