创建自己的CocoaPods
在我们平时的开发中,一定出现过这样的问题
- 创建了2个项目,一个项目却是另一个项目的分身,修改代码时需要修改2次。
- 新建项目时,从其他项目拖代码至另一个项目复制代码块。
- 在众多项目中,代码块重复太多,不知道哪一个是最新的。
以上问题,是我们开发常见的问题,为了解决这些问题,提高开发的质量,加快开发速度,我们有必要自己建立一套成熟的代码库,它可以反复使用并且反复迭代更新,一处修改,多处响应。
创建本地Pod
pod lib create ***
将会询问以下内容:
What Language do you want to use?? [Swift / objC]
Would you like to include a demo application with your Library? [Yes / No]
Would you like to do view based testing? [Yes / No]
-
What is your class prefix?
创建成功后会打开Xcode
打开JQTools.xcworkspace
注意,所有类都**必须
**放在classes
文件夹下,在创建文件的时候,需要自己选择一次。
##引用本地的pod
我建议新建的本地库先在本地进行长时间测试,这样可以方便的修改和维护,不用每次修改都要提交一次,更新pod。等你觉得它变得已经很稳定了,再提交至pod,当然代码还是要提交至远程仓库的。
pod 'JQTools',:path=> '/Users/***/MyProject/JQTools'
每次修改后,都要clear
一次,前期你一定会大量的使用
配置podspec
-
s.version
: 版本号,这里的版本号与Github仓库中的Tag一一对应 -
s.summary
: 你的Pod库的总结性描述. -
s.description
: 你的Pod库的具体描述,【这里要注意,s.description的长度必须大于s.summary】 -
s.source
: 指向对应的GitHub仓库. -
s.dependency
:表示依赖库 -
s.public_header_files
:是要公开的头文件 -
s.frameworks
:依赖库
s.ios.deployment_target = '10.0'
s.source_files = 'JQTools/Classes/**/*'
//图片,文件等资源
s.resource_bundles = {
'JQToolsRes' => ['JQTools/Assets/*']
}
s.public_header_files = 'Pod/Classes/Header.h'
//依赖库
s.frameworks = 'UIKit'
s.dependency 'SnapKit'
s.dependency 'ObjectMapper'
s.dependency 'QMUIKit', '~> 4.0.4'
s.dependency 'IQKeyboardManagerSwift', '~> 6.5.5'
s.dependency 'RxSwift','~> 5.1.1'
s.dependency 'RxCocoa','~> 5.1.1'
s.dependency 'SwiftyUserDefaults', '4.0.0-alpha.1'
以上,你已经成功的建立了自己的pod,已经可以进行使用了,建议你先在本地进行测试和使用,稳定后提交自己的pod。
1. 登录Github创建一个public仓库
创建过程略
2. 回到本地和远程仓库绑定
git remote add origin https://github.com/***/****.git
提交
- 创建
trunk
账号
trunk需要pod在0.33及以上版本;
pod --version
检查你的版本,如果版本过低sudo gem install cocoapods
进行更新。
- 可以先检查是否已注册:
pod trunk me
- 进行注册:
pod trunk register ***@qq.com yourName
然后你的邮件将受到信息,进行认证即可
验证Pod
pod lib lint **.podspec # 不爆红就是对的
#或
pod lib lint # 你在你的文件目录下
提交pod
pod trunk push
查询你的pod
pod search WKUIKit
常见问题
1. 如何配置Bundle资源
资源文件,需要放在Assets
文件夹下,并且在podspec
中指定,注意你指定的名称
s.resource_bundles = {
'JQToolsRes' => ['JQTools/Assets/*']
}
2. 如何引用未使用的类
比如本地pod并没有引用
QMUIKit
,但你对它进行了扩展支持,那么在项目将会报错,可以使用宏canImport
,务必将要使用的方法和类用public
#if canImport(QMUIKit)
import QMUIKit
public func A(){
//todo
}
#end
如果是OC
#if __has_include("QMUIKit/QMUIKit.h")
#import <QMUIKit/QMUIKit.h>
#endif
3. 模拟器与真机判断
有些方法和类在真机和模拟器有比较大的区别,所有在宏定义上面需要区分
关键词:targetEnvironment
#if targetEnvironment(simulator)
if fmodl(Float80(Double(self)), 1) == 0 {//如果有一位小数点
return (NSString(format: "%.0f", self) as String)
} else if (fmodf(Float(self*10), 1) == 0) {//如果有两位小数点
return (NSString(format: "%.1f", self) as String)
} else {
return (NSString(format: "%.2f", self) as String)
}
#else
if fmodl(Double(self), 1) == 0 {//如果有一位小数点
return (NSString(format: "%.0f", self) as String)
} else if (fmodf(Float(self*10), 1) == 0) {//如果有两位小数点
return (NSString(format: "%.1f", self) as String)
} else {
return (NSString(format: "%.2f", self) as String)
}
#endif
4. 自己的pod的Bundle读取
let mainBundle = Bundle(for: type(of: self))
let path = mainBundle.path(forResource: "JQToolsRes", ofType: "bundle")
let jqToolsBundle = Bundle(path: path!)
let filePath = jqToolsBundle?.path(forResource: "citysCode", ofType: "txt")
如果在修改自己的库里的某些代码,需要资源的时候,建议你这样写:
let mainBundle = Bundle(for: type(of: self))
如果已经被项目引用,上面的写法就不对了需要改成这样:
let mainBundle = Bundle(for: JQTool.self)
例子一:读区Resources下的城市表:
let mainBundle = Bundle(for: JQTool.self)
let path = mainBundle.path(forResource: "JQToolsRes", ofType: "bundle")
let jqToolsBundle = Bundle(path: path!)
let filePath = jqToolsBundle?.path(forResource: "citysCode", ofType: "txt")
do {
let content = try String(contentsOfFile: filePath!)
print(content)
} catch {
}
为什么是JQToolsRes
?前面我们已经在podspec
里面配置了,成为了一个bundle
s.resource_bundles = {
'JQToolsRes' => ['JQTools/Assets/*']
}
例子二:读取Resources下的bundle中的图片
在Icon.bundle中有一张ty_qrcode_bg
的图片
var a = Bundle(for: JQTool.self).path(forResource: "Icon", ofType: "bundle")
let jqToolBundle = Bundle(path: a!)
let image = UIImage(named: "ty_qrcode_bg", in: jqToolBundle, compatibleWith: .none)
例子三:读取Resources下的*.xcassets
let a = Bundle(for: JQTool.self)
let image = UIImage(named: "ty_qrcode_line", in: a, compatibleWith: .none)
5. Swift项目中使用OC
为了统一管理OC类,重写组织了结构:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7X1z4Ddm-1599214076370)(https://upload-images.jianshu.io/upload_images/1782131-a69da4a61787413d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
并修改了*.podspec
s.public_header_files = 'Pod/Classes/OC/Header.h'
并在Header中暴露了两个OC类
如果你出现以下错误
将private的类提升至public
然后就可以在Pod里或源项目中使用了。
总结
本地pod包的建立,算是你所有开发使用的精华,能够一处变动,全项目修改,你会遇到一个问题:你的代码封装定会用到其他第三方,比如你封装了一个下载图片的类,A项目适合,但B项目并不需要,如果B项目不去pod依赖的其他的第三方,那么你封装下载图片的类会因为没有引用而报错,B项目就不得不去pod,从而导致B项目过于臃肿。
解决的方法:
你可以移除本地的pod依赖,在实际项目看情况使用。canImport
宏进行了一次判断,如果不可用,就不能使用,也不会报错。
上一篇: casClient统一退出
下一篇: Easypoi的简单教程