大體的框架思路,其中會碰到一個顆粒度的問題,將顆粒度設定過大,則組件之間的耦合性過大,顆粒度設定太小,則將產生不少的組件和中間組件,組件的管理成本過大。(具體問題須要具體分析)html
spec文件說明ios
Pod::Spec.new do |spec|
spec.name = 'Reachability' spec.version = '3.1.0'
spec.license = { :type => 'BSD' }
spec.homepage = 'https://github.com/tonymillion/Reachability'
spec.authors = { 'Tony Million' => 'tonymillion@gmail.com' }
spec.summary = 'ARC and GCD Compatible Reachability Class for iOS and OS X.'
spec.source = { :git => 'https://github.com/tonymillion/Reachability.git', :tag => 'v3.1.0' }
spec.source_files = 'Reachability.{h,m}'
spec.framework = 'SystemConfiguration'
end
複製代碼
根據內容編寫項目的信息,小的細節能夠學習Git上支持Cocoapods的項目,查看項目中*.spec文件。 如: (1). 添加資源文件使用 s.resource_bundles
(2). 須要添加多個文件,使用數組s.source_files = ['ThirdSdk/Classes/**/*.{h,m}', 'ThirdSdk/Classes/**/**/*.{h,m}']
git
編寫許可證和說明的文件。最好參考官方的寫法,否則檢測不過。github
關鍵一個Example的工程,在Podfile中採用直接引用Module文件進行組件的開發。方便對單個組件進行調試 如pod 'ThirdSdk', :path => '../'
數組
新建一個Git庫,取名Specs用來保存本地的全部私有庫。 使用pod repo add [name] [Git地址]
添加一個私有Cocoapods Specs鏡像。 使用pod repo push REPO [NAME.podspec]
將私有組件推送到私有第三方庫鏡像。緩存
在Podfile文件中能夠添加依賴的第三方庫,包括Cocoapods和私有本地的庫。bash
platform :ios, '7.0'
source 'git@code.*.com:ios/Specs.git'
source 'https://github.com/CocoaPods/Specs.git'
target 'ThirdSdk_Example' do
pod 'ThirdSdk', :path => '../'
#cocoapods specs
pod 'AliyunOSSiOS'
#local specs
pod 'WebService'
end
複製代碼
其中網絡
source 'git@code.*.com:ios/Specs.git'
是申請引用本地指定的資料地址。source 'https://github.com/CocoaPods/Specs.git'
是cocoapods官方的第三方庫資料地址。pod 'AliyunOSSiOS'
引用的是Cocoapods的第三方庫。pod 'WebService'
引用的是私有的第三方庫。(1)對於基礎組件的依賴,採用Pod 直接致使,在代碼中進行import頭文件。這個方式會致使基礎組件的耦合性比較高。能夠將組件的顆粒度設定的小一些,儘可能抽取出不依賴其餘組件的獨立組件。再將這些獨立的組件打包成一個較大的組件,方便管理。如Podfile中架構
#local specs
pod 'Account'
pod 'AppPod'
pod 'WebService'
複製代碼
其中的AppPod就是集合,包含不少獨立的基礎組件。app
(2)若是是業務組件,在不一樣的業務之間,必定要避免組件間耦合,採用Mediator
組件做爲中間件,下降耦合。 具體能夠參考[iOS應用架構談 開篇](casatwy.com/iosying-yon…) 提供的Demo編寫。
主工程(殼工程)引用全部的組件,並實現應用的工程。
iOS應用框架及Cocoapods內容的參考:
在使用Cocoapods管理代碼的時候,若是在GitHut上更新了代碼,但願在project中執行pod install 來刷新代碼,那麼須要 刪除Pods和Podfile.lock文件 而後在執行pod install 來刷新代碼
使用pod update進行repo的更新
屢次安裝pod install 會出現Build Phase裏多個Check Pods Manifest.lock的選項,這些選項能夠刪除。
刪除這個目錄下的緩存文件,進行第三方庫文件的從新獲取 /Users/*/Library/Caches/CocoaPods/Pods/*
由於有可能由於版本號,沒有增長,在Pods目錄下的VERSION保存了這個版本的第三方庫,那麼將直接返回已經緩存的文件。因此當私有組件有代碼修改後,則能夠清空這個文件夾下的目錄,來進行私有組件的更新。👍👍👍(研究了好久才發現這個終極解決方法)
在*.podspec文件中,根據功能建立不一樣的子組件,如AFN中的
s.subspec 'Security' do |ss|
ss.source_files = 'AFNetworking/AFSecurityPolicy.{h,m}'
ss.public_header_files = 'AFNetworking/AFSecurityPolicy.h'
ss.frameworks = 'Security'
end
複製代碼
生成的效果
這種方式也是子組件的方法,在pod中能夠直接引用AFSecurityPolicy的組件,如pod 'AFNetworking/Security'
此時僅僅引用的是Security組件,而不是整個AFN組件
在開發是看到的組件,文件夾會比較亂,當其餘組件pod後,看到的文件夾就如AFNetworking同樣的效果。
組件能夠依賴其餘的第三方庫,如s.dependency 'JTObjectMapping'
AFNetworking等。 同時也能夠依賴私有的第三方庫: (1)使用pod repo add [name] [Git地址]
添加一個私有Cocoapods Specs鏡像。 (2)使用pod repo push REPO [NAME.podspec]
將私有組件推送到私有第三方庫鏡像。 (3)在組件中就能夠將已經上傳的組件能夠用來依賴了。
在ThirdSdk組件中,不能包含業務或項目相關的類,否則會致使互相依賴。僅僅包含第三方庫的代碼,能夠下降耦合性。 若是能用Cocoapods管理的第三方庫,儘可能使用Cocoapods吧。
ss.vendored_frameworks = 'ThirdSdk/AlipaySDK/AlipaySDK.framework'
ss.vendored_libraries = 'ThirdSdk/AlipaySDK/libcrypto.a', 'ThirdSdk/AlipaySDK/libssl.a'
複製代碼
a文件不是一個source_files。
return [target performSelector:action withObject:params];
複製代碼
若是返回的值是Bool或其餘的基礎數據類型,那麼將會Crash。
須要將返回值設置爲NSObject對象類型或nil。
NSBundle *bundle = [NSBundle bundleForClass:[self class]];
NSString *bundlePath = [bundle pathForResource:@"StoreLocation" ofType:@"bundle"];
if (bundlePath) {
bundle = [NSBundle bundleWithPath:bundlePath];
}
複製代碼
其中StoreLocation是與podSpec中的s.resource_bundles裏設置的保持一致。
s.resource_bundles = {
'StoreLocation' => ['StoreLocation/Assets/**/*', 'StoreLocation/Classes/Address/*.{xib}''] } 複製代碼
一、每個組件須要用到的圖片,都放到組件的Assets文件夾中。 在iOS8及更高系統,組件中Xib訪問image會從組件的Assets中讀取。可是iOS7系統,Xib仍是從[NSBundle mainBundle]
的Assets中讀取文件。 二、URL 不單獨放到一個頭文件中,放入組件的ViewModel中。
當有多人合做開發,TAG又一直維持在1.0.0時,那麼須要每次更新全部的TAG。
須要選中「 抓取並在本地存儲全部標籤」。pod repo push Specs AppPod.podspec --allow-warnings
複製代碼
推送時,若是一直報錯,修護了Error仍是一直報一樣的Error,這時能夠執行下pod cache clean --all
清空緩存。
當添加一個Ad-hoc的configuration,這個也須要設置DEBUG這個宏,而且在組件中也用到了DEBUG的宏定義,那麼須要對全部的組件進行DEBUG的設置。方法以下
#設置Debug參數
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
if config.name == 'Debug'
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] = '$(inherited) DEBUG=1'
end
if config.name == 'Ad-hoc'
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] = '$(inherited) DEBUG=1'
end
end
end
end
#設置參數完成
複製代碼
OpenSSL更新失敗,能夠刪除/tmp/openssl 文件夾,從新嘗試。
在使用支付寶SDK時,會有引入OpenSSL文件夾,其中文件中使用#include <openssl/e_os2.h>
。將SDK放入組件中,會報錯,提示找不到文件。 解決方法: 在*.podspec文件中 添加 ss.header_dir = "openssl"
用來添加頭文件夾openssl。
將使用MAC的放入subspec
s.subspec 'JTObjectMapping' do |ss|
ss.source_files = 'StoreBase/Classes/JTObjectMapping/*.{h,m}'
ss.public_header_files = 'StoreBase/Classes/JTObjectMapping/*.h'
ss.requires_arc = false
end
複製代碼
由於JTObjectMapping第三方庫使用的MRC因此特殊聲明ss.requires_arc = false
. 在主spec中使用的ARC,則聲明ss.requires_arc = true
. 此時主spec是ARC而JTObjectMapping是MRC,對JTObjectMapping中的文件都會添加一個-fno-objc-arc的編譯宏。
當主工程發佈了版本,那麼依賴的基礎組件版本也固定,不能再作修改。當須要對基礎組件進行修改,那麼版本須要更新,版本號加一。 當某個基礎組件A的版本號修改,那麼依賴這個組件的全部組件BCD也都要修改版本。而後依賴BCD的組件EFG也要修改版本號,以此類推
發佈版本修改: 基礎組件,將基礎組件的全部依賴修改成大版本(如「=1.1.0」格式),必須指定版本號。好比有一個組件的版本號是1.0.5,那麼這個版本進行了1.0.1到1.0.5的開發,在提交版本的須要修改1.1.0版本,並執行1.1.0版本。爲了,(1)方便線上版本能夠指定具體的版本。 (2)方便下一個版本的開發。 殼工程中,pod file文件的修改,將業務組件制定dev分支,修改成制定版本號,必須指定版本號。
業務組件的使用: 開發時,podfile中直接dev分支獲取代碼,並在dev上進行開發。 等須要發佈版本進行冒煙測試時,修改podfile爲制定版本號。如「=1.1.0」。
pod 'Location', :git => 'git@code.xxx.com:ios/Location.git', :branch => 'dev'
複製代碼
基礎組件的使用 在每一個基礎組件中,使用「~>1.0.3」進行開發,並在每次修改的時候,添加版本號。 基礎組件依賴其餘組件的時候,也修改成「~>1.0.3」, 那麼在pod install的時候,就能夠更新到最新的版本,不須要清理緩存。 發佈版本的時候,在每個組件中,指定版本號。如「=1.1.0」。保存每一個發佈的正式版本,均可以明確的知道全部組件的版本號。 發佈版本後進行開發,那麼須要修改依賴版本後「~>1.1.0」,不須要清理緩存,方便開發。 開發時,版本號的修改,僅僅針對須要修改的版本號。其餘版本號保持不變。
圖片資源 建立一個圖片資源的pod, 使用s.resources的方式進行添加圖片。那麼在xib中或imageNamed:"""直接可進行訪問。不須要進行bundle的控制。👍👍👍
未完待續 // END