在过年前, 工作算是告一段落了, 趁现在有空, 就写一些笔记和总结吧. 废话不多说, 直接开始.
要记住, 组件化只是为了分解代码和重用代码(这只是个人理解)。
这章先介绍怎么用Cocoapods和一些使用基础, 后面其他再具体说一下个人见解, 怎么分离项目, 怎么分离比较好. 当然这只是个人见解, 具体怎么使用,还是得看你.
转载请标明出处!
iOS项目组件化之Cocoapods(一) – 基础
iOS项目组件化之Cocoapods(二) – 踩坑与小技巧
先大致了解里面podspec字段的意思, 想知道更详细,可去官网查看
Pod::Spec.new do |s|
s.name = "XQTestOne" #项目名字
s.version = "0.1" #项目版本
s.summary = "摘要" #项目摘要
s.description = "描述" #项目描述
s.homepage = "https://github.com/SyKingW/XQTestCocoapodsModule" #项目首页
s.license = "MIT" #项目证书
s.author = { "Sinking" => "[email protected]" } #项目作者
s.ios.deployment_target = "10.0" #项目支持什么版本以上
s.source = { :git => "https://github.com/SyKingW/XQTestCocoapodsModule.git", :tag => "#{s.version}" } #项目git地址(当不上传到Cocoapods的时候, 指定地址不是很重要)
s.source_files = "XQTestOne", "XQTestOne/**/*.{h,m}" #项目引入的文件
s.public_header_files = "XQTestOne/**/*.h" #项目需要暴露出来的头文件
s.resources = "XQTestOne/Resources/**/*.xib" #项目需要引入的资源文件(xcassets,xib等等)
s.static_framework = true #是否作为静态库(默认false)
s.frameworks = "UIKit" #项目依赖的系统framework(系统的不需要写后缀)
s.vendored_frameworks = "XQTestOne/**/*.framework" #项目依赖的第三方framework
s.libraries = "iconv", "xml2" #项目依赖的lib(系统的不需要写后缀)
s.vendored_libraries = "XQTestOne/**/*.a" #项目依赖第三方的lib
s.dependency "AFNetworking", "~> 3.0" #项目依赖的第三方库
end
接下来我就一步步演示各种效果. 代码放在最后了, 如果想看代码可以先去下载.
XQTestZero 作为项目主体
XQTestTool 作为工具类代码
XQTestZero的Podfile内容
target 'XQTestZero' do
#使用framewrok
use_frameworks!
# 指定本地地址, 相对地址和绝对地址都可以
pod 'XQTestTool', :path => '../XQTestTool'
end
XQTestTool的XQTestTool.podspec
Pod::Spec.new do |s|
s.name = "XQTestTool" #SDK名称
s.version = "0.1"#版本号
s.homepage = "https://github.com/SyKingW/XQTestCocoapodsModule.git" #工程主页地址
s.summary = "工具类" #项目的简单描述
s.license = "MIT" #协议类型
s.author = { "Sinking" => "[email protected]" } #作者及联系方式
s.ios.deployment_target = "9.3"#iPhone
s.osx.deployment_target = '10.8'#mac
s.source = { :git => "https://github.com/SyKingW/XQTestCocoapodsModule.git", :tag => "#{s.version}"} #工程地址及版本号
# 导入文件的路径(ps: '**/*{.swift}' 意思是导入这个路径下后缀为swift的文件, 具体语法可自行查询)
s.source_files = 'XQTestTool/SDK/**/*.{swift}'
end
XQAdd.swift文件代码
很好, 一切都准备就绪. 这个时候用命令行到XQTestZero项目下执行
pod install
接下来我们打开 XQTestZero.xcworkspace 尝试在项目内引用一下代码.
这个时候你会发现, 引用不出来!!
这个是因为Swift公开的类和方法要设置为public及以上的权限.(具体字段意义可自行Google)
增加两个字段之后, command + shift + k(清缓存, 这样系统就会重新读取本地库编译). 然后再运行. 就会重新编译出来库了.
好, 一切准备就绪, 开始运行, 结果如图. 这个时候我们就完成第一个本地库编译了.
ps:红色框Development Pods是本地库. 如果一般第三方, 是有一个Pods文件夹的.
最简单, 也是最难的开头已经可以了,下面就加速了,请寄上安全带
在 XQTestTool.podspec 中加入
# 引用第三方
s.ios.dependency 'YYModel'
然后执行命令,导入第三方引用
pod install
如果要本地第三方库中, 要引用另一个本地第三方. 那么podspec和这个写法一样,但是主项目中的podflie还得去加入本地库, 不然因为是默认去Cocoapods库里面找, 是找不到本地库的.
我们一般UI库里面可能还会包括图片, 国际化等等资源, 这时候就得增加引用资源了.
创建一个 XQTestResource 项目
XQTestResource.podspec 内容
Pod::Spec.new do |s|
s.name = "XQTestResource" #SDK名称
s.version = "0.1"#版本号
s.homepage = "https://github.com/SyKingW/XQTestCocoapodsModule.git" #工程主页地址
s.summary = "工具类" #项目的简单描述
s.license = "MIT" #协议类型
s.author = { "Sinking" => "[email protected]" } #作者及联系方式
s.ios.deployment_target = "9.3"#iPhone
s.osx.deployment_target = '10.8'#mac
s.source = { :git => "https://github.com/SyKingW/XQTestCocoapodsModule.git", :tag => "#{s.version}"} #工程地址及版本号
# sdk文件
s.source_files = 'XQTestResource/SDK/**/*.{swift}'
# sdk资源文件
s.resources = 'XQTestResource/SDK/**/*.{xcassets}'
end
XQTestZero的Podfile文件添加(下面都忽略写这个, 基本添加一个库, 就需要在这里添加一个导入, 重复操作, 不需要说明太多)
pod 'XQTestResource', :path => '../XQTestResource'
创建加载图片方法
运行结果
要取组件里面的资源, 唯一要注意的是要指定Bundle, 如果从MainBundle中获取是获取不到的.
创建一个framework项目, 并写入代码
XQTestFramework.podspec 内容
Pod::Spec.new do |s|
s.name = "XQTestFramework" #SDK名称
s.version = "0.1"#版本号
s.homepage = "https://github.com/SyKingW/XQTestCocoapodsModule.git" #工程主页地址
s.summary = "工具类" #项目的简单描述
s.license = "MIT" #协议类型
s.author = { "Sinking" => "[email protected]" } #作者及联系方式
s.ios.deployment_target = "10.0"#iPhone
s.osx.deployment_target = '10.8'#mac
s.source = { :git => "https://github.com/SyKingW/XQTestCocoapodsModule.git", :tag => "#{s.version}"} #工程地址及版本号
#项目依赖的第三方framework
s.vendored_frameworks = 'SDK/**/*.{framework}'
end
项目中导入库, OC库需要通过Bridging文件来导入
ps: 这里采用OC创建Framework, 是因为试了好多次,swift的framework都不能导入,如有大神知道, 请指导一下.
运行结果, ♪(∇*)啦啦
建议如果是自己写的framework,尽量不要弄成framework再导入.
因为能直接pod, 为何还要这样…
创建项目, 然后编译.a, 并且copy出.h文件, 到SDK文件夹下
XQTestLib.podspec 和 导入自定义.framework没太大区别, 把
s.vendored_frameworks = 'SDK/**/*.{framework}'
改成
#项目依赖的第三方 .a
s.vendored_libraries = 'SDK/**/*.{a}'
并且增加头文件就行
# sdk文件
s.source_files = 'SDK/**/*.{h}'
其实这样引用.a和.framework很不好, 一般这样导入, 只是为了给库里面用.framework或者.a, 而不是让主项目使用.
如果主项目使用,直接拖进去就行了。
千说万说,不如直接浏览代码来的实际. https://github.com/SyKingW/XQTestCocoapodsModule.git