iOS模块化:基础框架的创建



现在大家都在推进模块化,每次粘贴拷贝烦了,我也搞个模块化,因为公司要新起项目,我想我不能每一次都来粘贴一次这么多的基础库文件,我直接模块化出来好了,每次要用pod下就好了,还可以持续更新。

首先我们来说下这样做的好处,特别是多人开发的时候,这样是特别方便的,还有就是代码干净,工程里只有业务代码,然后业务代码再根据功能进行模块,我这里还没弄,项目不大不太需要。主要是在大工程这样的好处更大,清晰,问题好定位,代码干净解耦,同时也锻炼你的抽象能力吧。

这次我抽象出来的项目叫“KZWFoundation”,其中包含了基础控件的统一风格封装,基础网络框架的封装(对af 3.0的再次封装)包含加密验签,router,基础controller,通用控件视图,基础宏,和一些基础category的封装。

下面说下,怎么创建自己的cocospod库:

1、将你需要的文件和demo项目创建在github:

第一步,创建.png

这里借用了James大叔的图,人懒就不重复截图了。

2、说下共享吧:

1
pod spec create KZWFoundation

编辑.podspec:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#
#  Be sure to run `pod spec lint KZWFoundation.podspec' to ensure this is a
#  valid spec and to remove all comments including this before submitting the spec.
#
#  To learn more about Podspec attributes see http://docs.cocoapods.org/specification.html
#  To see working Podspecs in the CocoaPods repo see https://github.com/CocoaPods/Specs/
#
 
Pod::Spec.new do |s|
 
 # ―――  Spec Metadata  ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
 #
 #  These will help people to find your library, and whilst it
 #  can feel like a chore to fill in it's definitely to your advantage. The
 #  summary should be tweet-length, and the description more in depth.
 #
 
 s.name         = "KZWFoundation"
 s.version      = "1.1.0"
 s.summary      = "iOS 基本库"
 
 # This description is used to generate tags and improve search results.
 #   * Think: What does it do? Why did you write it? What is the focus?
 #   * Try to keep it short, snappy and to the point.
 #   * Write the description between the DESC delimiters below.
 #   * Finally, don't worry about the indent, CocoaPods strips it!
 s.description  = <<-DESC
                 iOS基本库
                  DESC
 
 s.homepage     = "https://github.com/ouyrp/KZWFoundation"
 # s.screenshots  = "www.example.com/screenshots_1.gif""www.example.com/screenshots_2.gif"
 
 
 # ―――  Spec License  ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
 #
 #  Licensing your code is important. See http://choosealicense.com for more info.
 #  CocoaPods will detect a license file if there is a named LICENSE*
 #  Popular ones are 'MIT''BSD' and 'Apache License, Version 2.0'.
 #
 
 s.license      = "MIT"
 # s.license      = { :type => "MIT", :file => "FILE_LICENSE" }
 
 
 # ――― Author Metadata  ――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
 #
 #  Specify the authors of the library, with email addresses. Email addresses
 #  of the authors are extracted from the SCM log. E.g. $ git log. CocoaPods also
 #  accepts just a name if you'd rather not provide an email address.
 #
 #  Specify a social_media_url where others can refer to, for example a twitter
 #  profile URL.
 #
 
 s.author             = { "ouyang" => "1697006288@qq.com" }
 # Or just: s.author    = "ouyang"
 # s.authors            = { "ouyang" => "1697006288@qq.com" }
 # s.social_media_url   = "http://twitter.com/ouyang"
 
 # ――― Platform Specifics ――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
 #
 #  If this Pod runs only on iOS or OS X, then specify the platform and
 #  the deployment target. You can optionally include the target after the platform.
 #
 
 # s.platform     = :ios
 s.platform     = :ios, "8.0"
 
 #  When using multiple platforms
 # s.ios.deployment_target = "5.0"
 # s.osx.deployment_target = "10.7"
 # s.watchos.deployment_target = "2.0"
 # s.tvos.deployment_target = "9.0"
 
 
 # ――― Source Location ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
 #
 #  Specify the location from where the source should be retrieved.
 #  Supports git, hg, bzr, svn and HTTP.
 #
 
 s.source       = { :git => "https://github.com/ouyrp/KZWFoundation.git", :tag => "#{s.version}" }
 
 
 # ――― Source Code ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
 #
 #  CocoaPods is smart about how it includes source code. For source files
 #  giving a folder will include any swift, h, m, mm, c & cpp files.
 #  For header files it will include any header in the folder.
 #  Not including the public_header_files will make all headers public.
 #
 
 s.source_files  = "Classes/KZWFoundationHear.h"
 
 s.subspec 'Content' do |ss|
   ss.source_files = 'Classes/**/*.{h,m}'
   ss.exclude_files = "Classes/KZWFoundationHear.h"
   ss.framework = "MapKit"
 end
 
 # s.public_header_files = "Classes/**/*.h"
 
 
 # ――― Resources ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
 #
 #  A list of resources included with the Pod. These are copied into the
 #  target bundle with a build phase script. Anything else will be cleaned.
 #  You can preserve files from being cleaned, please don't preserve
 #  non-essential files like tests, examples and documentation.
 #
 
 # s.resource  = "Classes/Rseouce/KZWFundation.bundle"
 # s.resource_bundle = "Classes/Rseouce/KZWFundation.bundle"
 s.resource_bundle = { 'KZWFundation' => ['Classes/Rseouce/KZWFundation.bundle'] }
 # s.resources = "Resources/*.png"
 
 # s.preserve_paths = "FilesToSave""MoreFilesToSave"
 
 
 # ――― Project Linking ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
 #
 #  Link your library with frameworks, or libraries. Libraries do not include
 #  the lib prefix of their name.
 #
 # s.frameworks = "SomeFramework""AnotherFramework"
 
 # s.library   = "iconv"
 # s.libraries = "iconv""xml2"
 
 
 # ――― Project Settings ――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
 #
 #  If your library depends on compiler flags you can set them in the xcconfig hash
 #  where they will only apply to your library. If you depend on other Podspecs
 #  you can include multiple dependencies to ensure it works.
 
 # s.requires_arc = true
 
 # s.xcconfig = { "HEADER_SEARCH_PATHS" => "$(SDKROOT)/usr/include/libxml2" }
 s.dependency "Masonry"
 s.dependency "MJRefresh"
 s.dependency "AFNetworking"
 s.dependency "Mantle"
 s.dependency "MBProgressHUD"
 s.dependency "SAMKeychain"
 
end

这里重点说下,遇到的坑,s.source_files这个说的是你要共享的文件的位置,和你在创建之后的文件没任何关系, s.subspec这个才是创建文件夹如果你没有就是默认没有文件夹,文件都在你的库下面,这样会很丑很难看,很不优雅,然后s.subspec这个里面也是一个cocospod所以你需要把你用到的都加上,然后我们说下资源文件,我们都是优雅的人所以我们肯定不能丢各种png文件对不对,所以我们需要创建bundle,然后配置是s.resource_bundle = { 'KZWFundation' => ['Classes/Rseouce/KZWFundation.bundle'] }这个浪费我一个下午,所以大家需要看下其他的比较大的库是怎么配的不用走弯路。

3、然后是验证

1
pod lib lint KZWFoundation.podspec --verbose --use-libraries --allow-warnings

这个是验证本地,最好是先跑下这个,没问题在提交然后验证远程,开始我没这么做一个天提交了10个版本,被自己蠢死了。

4、提交

1
2
3
4
5
6
7
git add -A && git commit -m "version 1.0.0"
 
git tag '1.0.0'    //和上面.podspec一致
 
git push --tags
 
git push origin master

5、验证远程的

1
pod spec lint KZWFoundation.podspec --verbose --use-libraries --allow-warnings

6、没问题了之后提交

1
2
pod trunk register *****@xx.com "ouyang"
pod trunk push KZWFoundation.podspec  --use-libraries --allow-warnings

如果trunk注册过了可以跳过注册直接推就好了,成功后就会让你告诉你的朋友了,这样就完成了,然后你就可以pod下来了,完美。然后你在改的话,就要升版本,改一次升一次版本。

7、好了本次分享就结束了,欢迎大家使用我的基础提pr让我更加完善它,感谢。

github地址:https://github.com/ouyrp/KZWFoundation

作者:moonCoder
链接:https://www.jianshu.com/p/7672943d8808


0