大体的框架思路,其中会碰到一个颗粒度的问题,将颗粒度设定过大,则组件之间的耦合性过大,颗粒度设定太小,则将产生不少的组件和中间组件,组件的管理成本过大。(具体问题须要具体分析)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